diff --git a/2016/rust/src/day_03.rs b/2016/rust/src/day_03.rs
new file mode 100644
index 0000000..4f9499c
--- /dev/null
+++ b/2016/rust/src/day_03.rs
@@ -0,0 +1,24 @@
+pub fn solve(input: &str) -> String {
+ let parsed = input.split_whitespace()
+ .map(str::parse)
+ .collect::<Result<Vec<usize>, _>>()
+ .expect("unable to parse input");
+ let count = parsed.chunks(3)
+ .map(|w| Triangle(w[0], w[1], w[2]))
+ .filter(Triangle::is_valid)
+ .count();
+ count.to_string()
+}
+
+struct Triangle(usize, usize, usize);
+impl Triangle {
+ fn is_valid(&self) -> bool {
+ self.0 + self.1 > self.2 && self.0 + self.2 > self.1 &&
+ self.1 + self.2 > self.0
+ }
+}
+
+#[test]
+fn test_triangle() {
+ assert!(!Triangle(5, 10, 25).is_valid());
+}
diff --git a/2016/rust/src/lib.rs b/2016/rust/src/lib.rs
index f396c42..3160911 100644
--- a/2016/rust/src/lib.rs
+++ b/2016/rust/src/lib.rs
@@ -1,2 +1,3 @@
pub mod day_01;
pub mod day_02;
+pub mod day_03;
diff --git a/2016/rust/src/main.rs b/2016/rust/src/main.rs
index bbd3b10..bd7710f 100644
--- a/2016/rust/src/main.rs
+++ b/2016/rust/src/main.rs
@@ -8,5 +8,5 @@ fn main() {
let mut input = String::new();
io::stdin().read_to_string(&mut input).ok();
- println!("{}", day_02::solve(&input));
+ println!("{}", day_03::solve(&input));
}