adventofcode

git clone https://git.ce9e.org/adventofcode.git

commit
acb2230241fdf96bab3e3e953eee39563de62612
parent
6af372228cc5f33a27d4867774f288dcde5b873f
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-12-15 08:51
2022-12-15 (slow)

Diffstat

A 2022/15/input.txt 33 +++++++++++++++++++++++++++++++++
A 2022/15/solution.rs 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2022/15/test.txt 14 ++++++++++++++

3 files changed, 168 insertions, 0 deletions


diff --git a/2022/15/input.txt b/2022/15/input.txt

@@ -0,0 +1,33 @@
   -1     1 Sensor at x=2716507, y=2935757: closest beacon is at x=2710394, y=2763439
   -1     2 Sensor at x=3999794, y=3723425: closest beacon is at x=3369445, y=3597264
   -1     3 Sensor at x=3657442, y=1764502: closest beacon is at x=3049587, y=2338806
   -1     4 Sensor at x=3164509, y=3196584: closest beacon is at x=3369445, y=3597264
   -1     5 Sensor at x=2809936, y=2799950: closest beacon is at x=2710394, y=2763439
   -1     6 Sensor at x=2694454, y=2773569: closest beacon is at x=2710394, y=2763439
   -1     7 Sensor at x=10878, y=1715223: closest beacon is at x=325433, y=2000000
   -1     8 Sensor at x=803461, y=2606485: closest beacon is at x=325433, y=2000000
   -1     9 Sensor at x=675548, y=1606326: closest beacon is at x=325433, y=2000000
   -1    10 Sensor at x=2679411, y=2786440: closest beacon is at x=2710394, y=2763439
   -1    11 Sensor at x=2154234, y=2343200: closest beacon is at x=3049587, y=2338806
   -1    12 Sensor at x=2110512, y=354398: closest beacon is at x=1675167, y=-146032
   -1    13 Sensor at x=2791638, y=1261304: closest beacon is at x=3049587, y=2338806
   -1    14 Sensor at x=1312875, y=239990: closest beacon is at x=1675167, y=-146032
   -1    15 Sensor at x=3942335, y=797194: closest beacon is at x=3809420, y=402553
   -1    16 Sensor at x=2701618, y=2767691: closest beacon is at x=2710394, y=2763439
   -1    17 Sensor at x=3984844, y=228193: closest beacon is at x=3809420, y=402553
   -1    18 Sensor at x=2860718, y=2887510: closest beacon is at x=2710394, y=2763439
   -1    19 Sensor at x=3621521, y=3823030: closest beacon is at x=3369445, y=3597264
   -1    20 Sensor at x=3750994, y=3221696: closest beacon is at x=4361396, y=3105847
   -1    21 Sensor at x=182700, y=100955: closest beacon is at x=1675167, y=-146032
   -1    22 Sensor at x=2647016, y=2816460: closest beacon is at x=2710394, y=2763439
   -1    23 Sensor at x=3190979, y=2626436: closest beacon is at x=3049587, y=2338806
   -1    24 Sensor at x=2772574, y=2692795: closest beacon is at x=2710394, y=2763439
   -1    25 Sensor at x=3538486, y=282: closest beacon is at x=3809420, y=402553
   -1    26 Sensor at x=3688953, y=378293: closest beacon is at x=3809420, y=402553
   -1    27 Sensor at x=2698132, y=2757338: closest beacon is at x=2710394, y=2763439
   -1    28 Sensor at x=305105, y=3671091: closest beacon is at x=325433, y=2000000
   -1    29 Sensor at x=2715037, y=2453: closest beacon is at x=1675167, y=-146032
   -1    30 Sensor at x=3740685, y=2657814: closest beacon is at x=4174142, y=2733685
   -1    31 Sensor at x=3911207, y=340249: closest beacon is at x=3809420, y=402553
   -1    32 Sensor at x=1554097, y=1471192: closest beacon is at x=1675167, y=-146032
   -1    33 Sensor at x=1891025, y=3796582: closest beacon is at x=3369445, y=3597264

diff --git a/2022/15/solution.rs b/2022/15/solution.rs

@@ -0,0 +1,121 @@
   -1     1 // use std::collections::HashSet;
   -1     2 
   -1     3 #[path = "../lib.rs"] mod lib;
   -1     4 
   -1     5 fn get_input() -> Vec<(i64, i64, i64, i64)> {
   -1     6     return lib::iter_input().map(|line| {
   -1     7         let parts: Vec<&str> = line.split("=").collect();
   -1     8         return (
   -1     9             lib::split_once(parts[1], ',').unwrap().0.parse().unwrap(),
   -1    10             lib::split_once(parts[2], ':').unwrap().0.parse().unwrap(),
   -1    11             lib::split_once(parts[3], ',').unwrap().0.parse().unwrap(),
   -1    12             parts[4].parse().unwrap(),
   -1    13         );
   -1    14     }).collect();
   -1    15 }
   -1    16 
   -1    17 fn get_ranges(positions: &Vec<(i64, i64, i64, i64)>, y: i64) -> Vec<(i64, i64)> {
   -1    18     let mut ranges = vec![];
   -1    19 
   -1    20     for (xs, ys, xb, yb) in positions.iter() {
   -1    21         let d = (xs - xb).abs() + (ys - yb).abs();
   -1    22         let x1 = xs - d + (y - ys).abs();
   -1    23         let x2 = xs + d - (y - ys).abs();
   -1    24         ranges = merge(ranges, x1, x2);
   -1    25     }
   -1    26 
   -1    27     return ranges;
   -1    28 }
   -1    29 
   -1    30 fn render(v: &Vec<(i64, i64)>) {
   -1    31     for (x1, x2) in v.iter() {
   -1    32         print!("{}-{}, ", x1, x2);
   -1    33     }
   -1    34     print!("\n");
   -1    35 }
   -1    36 
   -1    37 fn merge(v: Vec<(i64, i64)>, b1: i64, b2: i64) -> Vec<(i64, i64)> {
   -1    38     if b1 > b2 {
   -1    39         return v;
   -1    40     }
   -1    41 
   -1    42     let mut result = vec![];
   -1    43     let mut new1 = b1;
   -1    44     let mut new2 = b2;
   -1    45     for (a1, a2) in v.into_iter() {
   -1    46         if a1 <= new2 && new1 <= a2 {
   -1    47             new1 = new1.min(a1);
   -1    48             new2 = new2.max(a2);
   -1    49         } else {
   -1    50             result.push((a1, a2));
   -1    51         }
   -1    52     }
   -1    53     result.push((new1, new2));
   -1    54     return result;
   -1    55 }
   -1    56 
   -1    57 fn remove(v: Vec<(i64, i64)>, b1: i64, b2: i64) -> Vec<(i64, i64)> {
   -1    58     let mut result = vec![];
   -1    59     for (a1, a2) in v.into_iter() {
   -1    60         if a1 <= b2 && b1 <= a2 {
   -1    61             if a1 < b1 {
   -1    62                 result.push((a1, b1 - 1));
   -1    63             }
   -1    64             if b2 < a2 {
   -1    65                 result.push((b2 + 1, a2));
   -1    66             }
   -1    67         } else {
   -1    68             result.push((a1, a2));
   -1    69         }
   -1    70     }
   -1    71     return result;
   -1    72 }
   -1    73 
   -1    74 fn count(v: Vec<(i64, i64)>) -> i64 {
   -1    75     return v.iter().map(|(x1, x2)| x2 - x1 + 1).sum();
   -1    76 }
   -1    77 
   -1    78 fn part1(positions: &Vec<(i64, i64, i64, i64)>) -> i64 {
   -1    79     // different value for test and real input
   -1    80     let y = if positions.len() == 14 { 10 } else { 2000000 };
   -1    81 
   -1    82     let mut ranges = get_ranges(positions, y);
   -1    83 
   -1    84     for (xs, ys, xb, yb) in positions.iter() {
   -1    85         if *ys == y {
   -1    86             ranges = remove(ranges, *xs, *xs);
   -1    87         }
   -1    88         if *yb == y {
   -1    89             ranges = remove(ranges, *xb, *xb);
   -1    90         }
   -1    91     }
   -1    92 
   -1    93     return count(ranges);
   -1    94 }
   -1    95 
   -1    96 fn part2(positions: &Vec<(i64, i64, i64, i64)>) -> i64 {
   -1    97     // different value for test and real input
   -1    98     let n = if positions.len() == 14 { 20 } else { 4000000 };
   -1    99 
   -1   100     for y in 0..=n {
   -1   101         let ranges = get_ranges(positions, y);
   -1   102         let mut foo = vec![(0, n)];
   -1   103         for (x1, x2) in ranges.iter() {
   -1   104             foo = remove(foo, *x1, *x2);
   -1   105         }
   -1   106         if !foo.is_empty() {
   -1   107             assert_eq!(foo.len(), 1);
   -1   108             assert_eq!(foo[0].0, foo[0].1);
   -1   109             let x = foo[0].0;
   -1   110             return x * 4000000 + y;
   -1   111         }
   -1   112     }
   -1   113 
   -1   114     return 0;
   -1   115 }
   -1   116 
   -1   117 fn main() {
   -1   118     let positions = get_input();
   -1   119     println!("part1: {}", part1(&positions));
   -1   120     println!("part2: {}", part2(&positions));
   -1   121 }

diff --git a/2022/15/test.txt b/2022/15/test.txt

@@ -0,0 +1,14 @@
   -1     1 Sensor at x=2, y=18: closest beacon is at x=-2, y=15
   -1     2 Sensor at x=9, y=16: closest beacon is at x=10, y=16
   -1     3 Sensor at x=13, y=2: closest beacon is at x=15, y=3
   -1     4 Sensor at x=12, y=14: closest beacon is at x=10, y=16
   -1     5 Sensor at x=10, y=20: closest beacon is at x=10, y=16
   -1     6 Sensor at x=14, y=17: closest beacon is at x=10, y=16
   -1     7 Sensor at x=8, y=7: closest beacon is at x=2, y=10
   -1     8 Sensor at x=2, y=0: closest beacon is at x=2, y=10
   -1     9 Sensor at x=0, y=11: closest beacon is at x=2, y=10
   -1    10 Sensor at x=20, y=14: closest beacon is at x=25, y=17
   -1    11 Sensor at x=17, y=20: closest beacon is at x=21, y=22
   -1    12 Sensor at x=16, y=7: closest beacon is at x=15, y=3
   -1    13 Sensor at x=14, y=3: closest beacon is at x=15, y=3
   -1    14 Sensor at x=20, y=1: closest beacon is at x=15, y=3