diff --git a/src/day15/1.rs b/src/day15/1.rs index e69de29..867b901 100644 --- a/src/day15/1.rs +++ b/src/day15/1.rs @@ -0,0 +1,105 @@ +#![feature(test)] + +use std::collections::HashSet; + +extern crate test; + +const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")]; + +#[derive(Debug)] +struct Sensor { + sx: i32, + sy: i32, + bx: i32, + by: i32, +} + +fn parse(input: &str) -> Vec { + input + .lines() + .filter(|c| !c.is_empty()) + .filter_map(|line| { + line.split_once(':').map(|(sensor, beacon)| { + let (sx, sy) = sensor + .split_once(',') + .map(|(x, y)| { + let xneg = x.contains('-'); + let yneg = y.contains('-'); + let x = x + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i32); + let y = y + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i32); + + (if xneg { -x } else { x }, if yneg { -y } else { y }) + }) + .unwrap(); + let (bx, by) = beacon + .split_once(',') + .map(|(x, y)| { + let xneg = x.contains('-'); + let yneg = y.contains('-'); + let x = x + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i32); + let y = y + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i32); + + (if xneg { -x } else { x }, if yneg { -y } else { y }) + }) + .unwrap(); + Sensor { sx, sy, bx, by } + }) + }) + .collect() +} + +fn solution(mut input: Vec, line: i32) -> usize { + let mut beacons = HashSet::new(); + let mut set = HashSet::new(); + + input.sort_unstable_by_key(|c| c.sx); + + for Sensor { sx, sy, bx, by } in input { + if by == line { + beacons.insert(bx); + } + + let area = (bx - sx).abs() + (by - sy).abs(); + for ix in sx - area..=sx + area { + if inside((sx, sy), (ix, line)) <= area { + set.insert(ix); + }; + } + } + + set.len() - beacons.len() +} + +#[inline] +const fn inside((sx, sy): (i32, i32), (px, py): (i32, i32)) -> i32 { + (sx - px).abs() + (sy - py).abs() +} + +fn main() { + let output = parse(INPUTS[0]); + let score = solution(output, 10); + println!("{}", score); + let output = parse(INPUTS[1]); + let score = solution(output, 2000000); + println!("{}", score); +} +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse(INPUTS[1]); + let result = solution(input, 2000000); + test::black_box(result); + }) +} diff --git a/src/day15/2.rs b/src/day15/2.rs index e69de29..cca491b 100644 --- a/src/day15/2.rs +++ b/src/day15/2.rs @@ -0,0 +1,106 @@ +#![feature(test)] +extern crate test; + +const INPUTS: [&str; 2] = [include_str!("./sample.txt"), include_str!("./input.txt")]; + +#[derive(Debug)] +struct Sensor { + sx: i64, + sy: i64, + + area: i64, +} + +fn parse(input: &str) -> Vec { + input + .lines() + .filter(|c| !c.is_empty()) + .filter_map(|line| { + line.split_once(':').map(|(sensor, beacon)| { + let (sx, sy) = sensor + .split_once(',') + .map(|(x, y)| { + let xneg = x.contains('-'); + let yneg = y.contains('-'); + let x = x + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i64); + let y = y + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i64); + + (if xneg { -x } else { x }, if yneg { -y } else { y }) + }) + .unwrap(); + let (bx, by) = beacon + .split_once(',') + .map(|(x, y)| { + let xneg = x.contains('-'); + let yneg = y.contains('-'); + let x = x + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i64); + let y = y + .bytes() + .filter(|c| (b'0'..=b'9').contains(c)) + .fold(0, |a, x| (a * 10) + (x - b'0') as i64); + + (if xneg { -x } else { x }, if yneg { -y } else { y }) + }) + .unwrap(); + Sensor { + sx, + sy, + area: (sx - bx).abs() + (sy - by).abs(), + } + }) + }) + .collect() +} + +fn solution(input: Vec, line: i64) -> i64 { + for j in 0..=line { + let mut i = 0; + + 'out: while i <= line { + for beacon in input.iter() { + if inside((beacon.sx, beacon.sy), (i, j)) <= beacon.area { + let dy = (j - beacon.sy).abs(); + let dx = (beacon.sx - i) + (beacon.area - dy) + 1; + i += dx; + + continue 'out; + } + } + + return i * 4000000 + j; + } + } + + 0 +} + +#[inline] +const fn inside((sx, sy): (i64, i64), (px, py): (i64, i64)) -> i64 { + (sx - px).abs() + (sy - py).abs() +} + +fn main() { + let output = parse(INPUTS[0]); + let score = solution(output, 20); + println!("{}", score); + let output = parse(INPUTS[1]); + let score = solution(output, 4000000); + println!("{}", score); +} +#[bench] +fn solution_bench(b: &mut test::Bencher) { + b.iter(|| { + let input = parse(INPUTS[1]); + let result = solution(input, 4000000); + test::black_box(result); + }) +} diff --git a/src/day15/input.txt b/src/day15/input.txt new file mode 100644 index 0000000..d7ba5ed --- /dev/null +++ b/src/day15/input.txt @@ -0,0 +1,38 @@ +Sensor at x=220580, y=684270: closest beacon is at x=436611, y=263737 +Sensor at x=3329538, y=3016377: closest beacon is at x=3355914, y=2862466 +Sensor at x=2605308, y=2023938: closest beacon is at x=2197530, y=2271330 +Sensor at x=1810202, y=3423309: closest beacon is at x=1829362, y=3182862 +Sensor at x=480296, y=3999646: closest beacon is at x=1694700, y=4178942 +Sensor at x=46556, y=1283362: closest beacon is at x=-91140, y=1441882 +Sensor at x=3741660, y=3959257: closest beacon is at x=3537901, y=3368697 +Sensor at x=3399994, y=700264: closest beacon is at x=3748004, y=2000000 +Sensor at x=1531981, y=3801761: closest beacon is at x=1694700, y=4178942 +Sensor at x=193367, y=2712458: closest beacon is at x=-91140, y=1441882 +Sensor at x=3199067, y=2194575: closest beacon is at x=3748004, y=2000000 +Sensor at x=1878117, y=2578817: closest beacon is at x=2197530, y=2271330 +Sensor at x=2439089, y=3168242: closest beacon is at x=1829362, y=3182862 +Sensor at x=273443, y=171076: closest beacon is at x=436611, y=263737 +Sensor at x=3680413, y=2477027: closest beacon is at x=3748004, y=2000000 +Sensor at x=3620241, y=2904998: closest beacon is at x=3355914, y=2862466 +Sensor at x=1728351, y=2895399: closest beacon is at x=1829362, y=3182862 +Sensor at x=1894207, y=1168355: closest beacon is at x=2197530, y=2271330 +Sensor at x=856867, y=3271314: closest beacon is at x=1829362, y=3182862 +Sensor at x=3056788, y=2626224: closest beacon is at x=3355914, y=2862466 +Sensor at x=3598024, y=3322247: closest beacon is at x=3537901, y=3368697 +Sensor at x=1662543, y=3128823: closest beacon is at x=1829362, y=3182862 +Sensor at x=3992558, y=1933059: closest beacon is at x=3748004, y=2000000 +Sensor at x=1844282, y=2994285: closest beacon is at x=1829362, y=3182862 +Sensor at x=3604375, y=3668021: closest beacon is at x=3537901, y=3368697 +Sensor at x=2569893, y=3911832: closest beacon is at x=1694700, y=4178942 +Sensor at x=117970, y=37503: closest beacon is at x=436611, y=263737 +Sensor at x=3951385, y=3125577: closest beacon is at x=3537901, y=3368697 +Sensor at x=2482373, y=2648092: closest beacon is at x=2197530, y=2271330 +Sensor at x=915040, y=1835970: closest beacon is at x=-91140, y=1441882 +Sensor at x=3047883, y=3301452: closest beacon is at x=3537901, y=3368697 +Sensor at x=117432, y=1503889: closest beacon is at x=-91140, y=1441882 +Sensor at x=1136011, y=261705: closest beacon is at x=436611, y=263737 +Sensor at x=2343111, y=66183: closest beacon is at x=2081841, y=-807749 +Sensor at x=608229, y=955721: closest beacon is at x=436611, y=263737 +Sensor at x=1189379, y=3999750: closest beacon is at x=1694700, y=4178942 +Sensor at x=766640, y=26597: closest beacon is at x=436611, y=263737 +Sensor at x=3891093, y=2110588: closest beacon is at x=3748004, y=2000000 diff --git a/src/day15/sample.txt b/src/day15/sample.txt new file mode 100644 index 0000000..a612424 --- /dev/null +++ b/src/day15/sample.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