diff --git a/res/15/input.txt b/res/15/input.txt new file mode 100644 index 0000000..0b09ce4 --- /dev/null +++ b/res/15/input.txt @@ -0,0 +1,36 @@ +Sensor at x=489739, y=1144461: closest beacon is at x=-46516, y=554951 +Sensor at x=2543342, y=3938: closest beacon is at x=2646619, y=229757 +Sensor at x=3182359, y=3999986: closest beacon is at x=3142235, y=3956791 +Sensor at x=3828004, y=1282262: closest beacon is at x=3199543, y=2310713 +Sensor at x=871967, y=3962966: closest beacon is at x=-323662, y=4519876 +Sensor at x=1323641, y=2986163: closest beacon is at x=2428372, y=3303736 +Sensor at x=2911492, y=2576579: closest beacon is at x=3022758, y=2461675 +Sensor at x=3030965, y=2469848: closest beacon is at x=3022758, y=2461675 +Sensor at x=3299037, y=3402462: closest beacon is at x=3142235, y=3956791 +Sensor at x=1975203, y=1672969: closest beacon is at x=1785046, y=2000000 +Sensor at x=3048950, y=2452864: closest beacon is at x=3022758, y=2461675 +Sensor at x=336773, y=2518242: closest beacon is at x=1785046, y=2000000 +Sensor at x=1513936, y=574443: closest beacon is at x=2646619, y=229757 +Sensor at x=3222440, y=2801189: closest beacon is at x=3199543, y=2310713 +Sensor at x=2838327, y=2122421: closest beacon is at x=2630338, y=2304286 +Sensor at x=2291940, y=2502068: closest beacon is at x=2630338, y=2304286 +Sensor at x=2743173, y=3608337: closest beacon is at x=2428372, y=3303736 +Sensor at x=3031202, y=2452943: closest beacon is at x=3022758, y=2461675 +Sensor at x=3120226, y=3998439: closest beacon is at x=3142235, y=3956791 +Sensor at x=2234247, y=3996367: closest beacon is at x=2428372, y=3303736 +Sensor at x=593197, y=548: closest beacon is at x=-46516, y=554951 +Sensor at x=2612034, y=2832157: closest beacon is at x=2630338, y=2304286 +Sensor at x=3088807, y=3929947: closest beacon is at x=3142235, y=3956791 +Sensor at x=2022834, y=2212455: closest beacon is at x=1785046, y=2000000 +Sensor at x=3129783, y=3975610: closest beacon is at x=3142235, y=3956791 +Sensor at x=3150025, y=2333166: closest beacon is at x=3199543, y=2310713 +Sensor at x=3118715, y=2376161: closest beacon is at x=3199543, y=2310713 +Sensor at x=3951193, y=3181929: closest beacon is at x=4344952, y=3106256 +Sensor at x=2807831, y=2401551: closest beacon is at x=2630338, y=2304286 +Sensor at x=3683864, y=2906786: closest beacon is at x=4344952, y=3106256 +Sensor at x=2723234, y=3206978: closest beacon is at x=2428372, y=3303736 +Sensor at x=3047123, y=3891244: closest beacon is at x=3142235, y=3956791 +Sensor at x=3621967, y=3793314: closest beacon is at x=3142235, y=3956791 +Sensor at x=2384506, y=1814055: closest beacon is at x=2630338, y=2304286 +Sensor at x=83227, y=330275: closest beacon is at x=-46516, y=554951 +Sensor at x=3343176, y=75114: closest beacon is at x=2646619, y=229757 diff --git a/res/15/test-input.txt b/res/15/test-input.txt new file mode 100644 index 0000000..a612424 --- /dev/null +++ b/res/15/test-input.txt @@ -0,0 +1,14 @@ +Sensor at x=2, y=18: closest beacon is at x=-2, y=15 +Sensor at x=9, y=16: closest beacon is at x=10, y=16 +Sensor at x=13, y=2: closest beacon is at x=15, y=3 +Sensor at x=12, y=14: closest beacon is at x=10, y=16 +Sensor at x=10, y=20: closest beacon is at x=10, y=16 +Sensor at x=14, y=17: closest beacon is at x=10, y=16 +Sensor at x=8, y=7: closest beacon is at x=2, y=10 +Sensor at x=2, y=0: closest beacon is at x=2, y=10 +Sensor at x=0, y=11: closest beacon is at x=2, y=10 +Sensor at x=20, y=14: closest beacon is at x=25, y=17 +Sensor at x=17, y=20: closest beacon is at x=21, y=22 +Sensor at x=16, y=7: closest beacon is at x=15, y=3 +Sensor at x=14, y=3: closest beacon is at x=15, y=3 +Sensor at x=20, y=1: closest beacon is at x=15, y=3 diff --git a/src/days/d15.rs b/src/days/d15.rs index 68ed73c..c04c909 100644 --- a/src/days/d15.rs +++ b/src/days/d15.rs @@ -1,9 +1,102 @@ -use std::fs; +use std::{collections::HashSet, fs}; + +const ROW: i32 = 2000000; pub fn solve() { let path = "res/15/input.txt"; let contents = fs::read_to_string(path).expect("File read error"); - + let sensors: Vec<((i32, i32), (i32, i32), i32)> = contents + .lines() + .filter(|line| *line != "") + .map(|line| { + let line = line + .replace("x", "") + .replace("y", "") + .replace("=", "") + .replace(":", "") + .replace(",", ""); + + let words: Vec<&str> = line.split_whitespace().collect(); + + let x1 = words[2].parse::().unwrap(); + let y1 = words[3].parse::().unwrap(); + let x2 = words[8].parse::().unwrap(); + let y2 = words[9].parse::().unwrap(); + let rad = x1.abs_diff(x2) as i32 + y1.abs_diff(y2) as i32; + ((x1, y1), (x2, y2), rad) + }) + .collect(); + + let mut row_map = HashSet::::new(); + + sensors.iter().for_each(|sensor| { + let ((x1, y1), (x2, y2), rad) = sensor; + + let y_diff = y1.abs_diff(ROW) as i32; + let x_diff = rad - y_diff; + if x_diff < 0 { + return; + } + + (x1 - x_diff..=x1 + x_diff).for_each(|i| { + row_map.insert(i); + }) + }); + + sensors.iter().for_each(|sensor| { + let ((_, _), (x2, y2), _) = sensor; + + if *y2 == ROW && row_map.contains(&x2) { + row_map.remove(&x2); + } + }); + + let res = row_map.len(); + println!("Result 1: {res}"); + + let mut sen_tup = Vec::<((i32, i32, i32), (i32, i32, i32))>::new(); + let mut up_outlines = Vec::::new(); + let mut down_outlines = Vec::::new(); + sensors.iter().for_each(|s1| { + sensors.iter().for_each(|s2| { + if s1 != s2 { + let ((x1, y1), (_, _), rad1) = *s1; + let ((x2, y2), (_, _), rad2) = *s2; + let dist = x1.abs_diff(x2) as i32 + y1.abs_diff(y2) as i32; + if dist == rad1 + rad2 + 1 { + sen_tup.push(((x1, y1, rad1), (x2, y2, rad2))); + // s2 in quadrant 1 + if x1 - x2 < 0 && y1 - y2 > 0 { + down_outlines.push(y1 - (x1 + rad1) - 1) + } + // s2 in quadrant 3 + else if x1 - x2 > 0 && y1 - y2 < 0 { + down_outlines.push(y2 - (x2 + rad2) - 1) + } + // s2 in quadrant 2 + else if x1 - x2 > 0 && y1 - y2 > 0 { + up_outlines.push(y2 + (x2 + rad2) + 1) + } + // s2 in quadrant 4 + else if x1 - x2 < 0 && y1 - y2 < 0 { + up_outlines.push(y1 + (x1 + rad1) + 1) + } + } + } + }) + }); + + let mut intersections = Vec::<(i32, i32)>::new(); + up_outlines.iter().for_each(|up_line| { + down_outlines.iter().for_each(|down_line| { + if up_line > down_line && up_line % 2 == down_line % 2 { + let intersection = down_line + (up_line - down_line) / 2; + // TODO continue + } + }) + }); + + sen_tup.iter().for_each(|tup| {}); }