diff --git a/04/main.rs b/04/main.rs
new file mode 100644
index 0000000..0614242
--- /dev/null
+++ b/04/main.rs
@@ -0,0 +1,81 @@
+#![allow(dead_code)]
+use std::fs::File;
+use std::io;
+use std::io::BufRead;
+use std::path::Path;
+use std::time::Instant;
+
+fn main() {
+ let now = Instant::now();
+ part_one();
+ let part_one_duration = now.elapsed();
+ part_two();
+ let part_two_duration = now.elapsed();
+ println!(
+ "p1: {}ms, p2: {}ms",
+ part_one_duration.as_millis(),
+ (part_two_duration - part_one_duration).as_millis()
+ );
+}
+
+fn read_lines
(filename: P) -> io::Result>>
+where
+ P: AsRef,
+{
+ // note that this discards a final newline
+ let file = File::open(filename)?;
+ Ok(io::BufReader::new(file).lines())
+}
+
+fn part_one() {
+ if let Ok(lines) = read_lines("./inputs/input") {
+ let mut overlaps = 0;
+ for line in lines {
+ if let Ok(ranges) = line {
+ let v: Vec> = ranges
+ .split(",")
+ .map(|r| r.split("-").map(|i| i.parse::().unwrap()).collect())
+ .collect();
+ // 00 ... 01
+ // 10 ... 11
+ if (v.get(0).unwrap().get(0) <= v.get(1).unwrap().get(0)
+ && v.get(0).unwrap().get(1) >= v.get(1).unwrap().get(1))
+ || (v.get(1).unwrap().get(0) <= v.get(0).unwrap().get(0)
+ && v.get(1).unwrap().get(1) >= v.get(0).unwrap().get(1))
+ {
+ overlaps += 1;
+ }
+ }
+ }
+ println!("{}", overlaps);
+ }
+}
+
+fn part_two() {
+ if let Ok(lines) = read_lines("./inputs/input") {
+ let mut overlaps = 0;
+ for line in lines {
+ if let Ok(ranges) = line {
+ let v: Vec> = ranges
+ .split(",")
+ .map(|r| r.split("-").map(|i| i.parse::().unwrap()).collect())
+ .collect();
+ // 00 ... 01
+ // 10 ... 11
+ // uuuuuugh
+ if (v.get(0).unwrap().get(0) <= v.get(1).unwrap().get(0)
+ && v.get(0).unwrap().get(1) >= v.get(1).unwrap().get(1))
+ || (v.get(1).unwrap().get(0) <= v.get(0).unwrap().get(0)
+ && v.get(1).unwrap().get(1) >= v.get(0).unwrap().get(1))
+ || (v.get(0).unwrap().get(0) <= v.get(1).unwrap().get(1)
+ && v.get(0).unwrap().get(0) >= v.get(1).unwrap().get(0))
+ || (v.get(0).unwrap().get(1) >= v.get(1).unwrap().get(0)
+ && v.get(0).unwrap().get(1) <= v.get(1).unwrap().get(1))
+ {
+ overlaps += 1;
+ }
+ }
+ }
+ println!("{}", overlaps);
+ }
+}