adventofcode

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

commit
c233d563941c3a4e30efc3af97ae664ec2a6c5d6
parent
005c5d2e09e5d7f5c1c573e18a20da3fb8227bea
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2023-12-23 18:48
2023-12-23

Diffstat

A 2023/21/input.txt 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/21/solution.rs 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2023/21/test.txt 11 +++++++++++

3 files changed, 244 insertions, 0 deletions


diff --git a/2023/21/input.txt b/2023/21/input.txt

@@ -0,0 +1,131 @@
   -1     1 ...................................................................................................................................
   -1     2 ...#.......#.##......#.#........#.........#...........................#.......#.....#.#.....#.#.#.......###....#...#..........#..#.
   -1     3 ..#..............#.#..#........#........##.##.#.......#..#...............#..#......#.##.....#..#.........#......#......#......#.##.
   -1     4 ....#........##....#.....##.....#.##...#....#.#.###.......................#...#...#.#..........#...#........#.............#.....#..
   -1     5 .....#.......###....#...............#.....#...#...#...##.#................#.......##...#..........#...#.......##..#........#.....#.
   -1     6 ..........#............................#............#.#.................................#.......#............##............#.#.....
   -1     7 .............#............###.#.#...............#....#.............#.......#.##.....##..#..#............##..........##.............
   -1     8 ...............#.#............#...#..#..#.##..#....#...........#..................##......#.#......#.#.#..........#.....#.#...#..#.
   -1     9 ..........##.#..#...#.......##.........#.............#.............###...................#.......#...#.#.#.....#####.........##....
   -1    10 ....#....#...#..#.....#..##.....#....#.........#..###.............#.#...........#.............#.##........#.#.#....#...##......##..
   -1    11 .......#.....#..#.#...........##.......##..#..#............##..#......#.......................#.......#.....#.#....................
   -1    12 .#..#...#.......#....#......#..#.#..........................#..##...................##.....#.........#.#........#........#...##....
   -1    13 ..#...#.#..#...#.#......#....#...........#...#...........#..#.#.#....##..........#.#....#.......##.#....#.....##..........#.....#..
   -1    14 .....#..#...........#.##.#............#.#.##.............#.....##.................#............#..##.....#...........##............
   -1    15 .....#.#....##....#............#......#...#............#....#.......#.#....#........#......#...#........#....#.............#.......
   -1    16 .....#........#.........##.#...#...#.#..#..#..............................#.........#.....................#.#..#..#.#........#..#..
   -1    17 .##.....#..#..........##..#.#........#.#.....#........#............#...#.....#..................#.#.........#...#.....#....###..#..
   -1    18 ...............##.....#.#.....#.....##..#..................###...............#.............#.......#....#...............#......#...
   -1    19 ...#......#.#.............#..#.......#...#..............#.........#....#....#.......................#...#.......#..#...##......#.#.
   -1    20 ..........#..#....#.#....#..#...#....##...#.......#..#.........##...#.#.##....#................#.....#.....#.........#.............
   -1    21 ...#..#..#...#..#..#.....................#............#............#####....#..#.........#....#....#..#.............#.#......#.#.#.
   -1    22 ......#....#....#.##.......#..##..#................#.....#..#.#................##.........#..##..##...........#..#.................
   -1    23 .....#.#..#......#......#....##...#............##...#.#.#......#.......#.......#..#.........#...#..#.....##...#.....#....#.........
   -1    24 ....#..#...#..#...........#..#.#..#...#.............#.#....#...##...........#.#...##........#.....#...#.....#.#...#......#..#.#....
   -1    25 .....#.#...#...#.#...##...#........###.............#..#...##....#............................#..#.........##.......#.....#....#....
   -1    26 ........#.##...................##......................#...#.....................#...................#..##.#....#....#.#....##...#.
   -1    27 .####.....#.......#........#..........................................#........#.#.#...........#........#..#....#......#....#..#...
   -1    28 .....#......#..###..#..##.....#.........................#..#...#....#.#.........#..#..................#..##........#....###...##.#.
   -1    29 ........#....#......###...#......#..............#......#.....#....#.....#.....#....##........................#.........#..#........
   -1    30 ........##..#........#........##.............##.##...#..#.......#.#.......#..##......#...............##..#...#.##...#..#......#....
   -1    31 ........##..#..#..##.#..................##......#.#.......##...#......#....###...#.........................#.....#..#..#.#.........
   -1    32 ............#......###.#......#............#..#..#...#.........#..#.....#.#...##......#.................#..........#....#.....#....
   -1    33 ..#.....##.#.......##........#.......#...#..#.......#......##.#....#.......#..........#....#..............#..#...##...#.#......#.#.
   -1    34 ..............#..###......##............#....#.....##.##......##................#..##....................#.......#.##..........#...
   -1    35 ............#.#.......##............#........#.##....#..#.........##.#....##.#........#....##...............#............##.##..#..
   -1    36 ..#..#..#...#...#....#.#...................###...#....#........##.........#..##......#....#................................#..#....
   -1    37 .#...............##................#.#.......#........#.....#.....###..#.##....##............###.........#....#....................
   -1    38 ...................#..#...........#..#.#..............#..#...............#.#.#.........##.........#...........#...####....#..#...#.
   -1    39 ..#...#........#.......#........#.....#..##.........##.#......##........#......#.#..#...#........#..........#..........#...#.......
   -1    40 ..#....#.#.##.#....##...........#.#..##.....##...##..#...##....#....#....#....###...#...#.........##..................#.#....##..#.
   -1    41 .##........#...#...##........#..#...#.....#.#....###....##.#........#..#.......#.........#...#....#...............#..##....#.....#.
   -1    42 .....#.......#....#..........###.....#..#..........#..#.......##..#......................##..##...............#.#....#..##..##..#..
   -1    43 .#......#...#...#..#.............#.#....#........#......##............####.#.........#.................#..............#..#.#....#..
   -1    44 ............#.#.#.............#..........#........##..##....#...............................#.#..#.....................##..##...#..
   -1    45 ................................#........#........#.....##....#....#.......#......................#..........................##....
   -1    46 ...##.###...#...........#..#.......#.....#................#.#..#......#...#....#..#......#....##......#..##........#..##.#.........
   -1    47 .#.........#...................#.....#.##.##.#.#.......#....#..#...#........##.##..#....##...##...#..#.............##.....#........
   -1    48 ....#.......#.#........#.##...#.........#......##.....#....##..##...#......#..#.........#..##......##.#..............##..#....#..#.
   -1    49 .#.......#................#....##......#...#....#.#......#.#..#...............###.........#.##.............###..........###....#...
   -1    50 ............#...........#...#......#.#..##......#..##..........#........#...##.........#...#.............#..............#..#.......
   -1    51 .#...#..##.............#........#..###........##................#...##..#......#...#.......#.#.........................##....#.....
   -1    52 .......##..........#......##....#............#..##.......##....##...#.......#...#........##..#.#...##........................#...#.
   -1    53 ..#....#...............##...#...#.#.#.....#.#....#...#.........#..#.......#..#..#....#......##...#....##.....#..#.........#......#.
   -1    54 .#..#......................#..#.#....#..#.##..#......###.......................#........#.#....#........#..#....#..................
   -1    55 ....#..............................#...##...............#...................#..#...##.#..#.....##......#...##................####..
   -1    56 ................................#......#....#...#..#......#.....#..........#..#...##......#............#.....##....#........##.....
   -1    57 ...............#...........#........#.#........#.#.#...#..#....#.......#..###..........#.#.#.#......#..#.......#..##.#.............
   -1    58 ....................#.#....#.....#........##...#.......#....###.#.........#......#......##.#..#..#...................#.........##..
   -1    59 .#.....................#.........##......#........##..................#..................##..#.........##.#............#...........
   -1    60 ............#...##.#..#................#........#......#...................#.#....##...#.#.....#.#.......#..#.....#.....#..........
   -1    61 .................#..............#..#......#......#.........#......#.#..#...#.#....................#...#.....#........#..#........#.
   -1    62 ............#.........#....#.......##..#.#...##.....#...##...........#............#..#.#.............#.........#.........#.........
   -1    63 ........#.............#......##..#.............#........#....#.##.#....#......#..........#....#....#......#....#.......#...........
   -1    64 ............#.#...#..#.......#....#.....##....................#.........###....#.#........#...##.......#....#..##...#.......#......
   -1    65 .........#...#........#...........#......#....#..#...#..........#..............#....#............#..#......#..#...#..#....#........
   -1    66 .................................................................S.................................................................
   -1    67 .........#.###....#........#..##........#.##.#......#.............#..........#.#.#.......#...#..#...#...#....#......#..............
   -1    68 ......#..#.....#.......#...##.###...........#..#...#.#.#..................###...#..#......##.#.##......#.......#..##.#......#......
   -1    69 ............#........#......#....#...#.#....#....#......#...........#.......##..#......#...#.....#.......##.........#...#..........
   -1    70 ...............#...........##.....#...#........#..#...#...........#..#..##....#.................##..#.....##..#.#......#.#.........
   -1    71 .........#....##..#...#.....#.....#.......#.#....#.........##..#.....##....#...#......#............#.......#....#....#...#.......#.
   -1    72 .......................#.#...#....#.#.....##......#............#.....#.#...##........##.....#...##.......##.#......................
   -1    73 ..................##..#.#........#...#.#.....#.##........##..#.......###..##......#..........#........#....#..#.#...##.#.......#...
   -1    74 ............#..............####...#..#..###.#.##....#.#.##...........#.......##......#.#............#.#........................#...
   -1    75 .#..............#.........#......#.......##...#.......................#.......#........#.......#........#.....#....#...............
   -1    76 ...............#......#........#...............#........#..##......###...#.......................#....##.........#.##..........#.#.
   -1    77 ...#..##.......#.#...#......#.....#.#...........#..##.###.#...............#.#........#............######.##.#...#..............#...
   -1    78 ....##...............#.....##....#.#.....................###..#...#.#...#.#...#.##............##...#..#.#........##.......##.......
   -1    79 ....#.#.#............#..#......###............#.#.####............#...###.........#.#...#.....#.##....#..........#.......#...###...
   -1    80 ......#.#.#.............#...#....#....#.####.......#.....###........#......#.##......##..#..##.......#..#....##............#.#.....
   -1    81 ..##.......#..........#....###.......#.###............#.....##....#....#.#...#.........#........#.......#..#.#.............#...##..
   -1    82 .........#.............#....##.........#....###.......#.....#...#.....#.#...#.#.#.....#....#...........###..#...........#.....#....
   -1    83 .#...#....#.##.........#...##....#..##.#....#.....##..#.#...............#.#...#...#.#.......#.#.#........#..#......................
   -1    84 .......##.#...............#...............#......#..#...##....#...#...#..#.......#.............#......#................#....###..#.
   -1    85 .....#.................#.............#.##.#..#...##.......#.....#........#..#.....#.......#........#..#...#...........#...#.....#..
   -1    86 ..#.#....#.#.#..........#.#......#......................##.#.#.#....#....#....#...............#..#.#.................#......#......
   -1    87 ...#.......#.....#........#....##...##.....#....##.....#....#..............#......#.....#.....#......#..##.............#.#.....###.
   -1    88 .#..............#.........#..........#..#.....##..##..#...#.......#.##......#...........##.......................#....#..#.........
   -1    89 ....###..........................#...#...#..###.#...#...............#...##...#...#.##...#..#...#.#...#...........#.............#...
   -1    90 .................##...........##.......#......#..#..................#.................#....#..#....#.#.............#.##..#....##.#.
   -1    91 ..#....#......#.#..................#...#..#........#.....#....#...##......#...###...........#..#..#..........#.............#.......
   -1    92 .#...#..#.##.#...#............#..#..#.#.....#.#..#..#.........##........#.......##.#.......#.....#.#........##..#............#.....
   -1    93 .##...###........#.#..............#...........#....#.##.......#.....##.........#..##.....#..#.................#.##...#...##......#.
   -1    94 ...#....#............#.#.........##.###.#.......#..##......##......#####.......#.............#.............#.#.#..#...#..#.....#.#.
   -1    95 ...#.###.....##..................#.###......#..#.#.#.#....#..#....#........##.#...#...#..#.....##.......................#.....#..#.
   -1    96 .......##.#..###.........................#..........#...#...#..#.....#.......#.#.....##...#....#.............#....##..#.##.#.......
   -1    97 .#.......#......#.##.................#.....#..#.............##....##.....#..#.#...........##.............#...##...........#........
   -1    98 ....#.........##.#..#.................##...#.#.......#.......#.....#....#.....#.#.........#..#........#......#..........#.#........
   -1    99 .#..#...#......#..##.....#..............##.###.......#..#.........##...............#.....#...#........#.........#....#.............
   -1   100 ....................#..#....................#....#..#....#..........#....#.....#.........#..#.................#.........#........#.
   -1   101 ....................................................#..........#....#..##....##........#............#.........#....#...#.........#.
   -1   102 ..#.........#.......#..#..................#.#....#.#..........#..................#..#..#...................#..#....................
   -1   103 ..##...#...##....#...#..........##.........................#.#....###.....#.....#....#...........#..#.............#....##....#...#.
   -1   104 ....#..#...#.....##...#..#...................#...#.........#.#..#...#............................#.........#..............##.#.....
   -1   105 .......#.......##.#.......#.....................#.....#............####.#.....#....#...............#.#....#......#.#...#...#.......
   -1   106 ........#.......#...#.##..#........................#...#...##..........#...#......##..#.......##.....#..#..........................
   -1   107 .....#...#.....#..#.........###..#..............#..#......#.##..........#..##.##.................#...#.##.............#.#.....#..#.
   -1   108 ..##..#............###...#..#....#..#.#.......#.......#.##....#.........#.#.#..................#.#...#.#......#.#.#................
   -1   109 ...........#.#...............#.....##.................##.#...##.......#.##..#..................##....#.#....#....##.#.....#.....#..
   -1   110 .........#........#...............................#.#..#..#.........##....#..#.#...........#..##.....#..###.......#..#.#.#..#...#..
   -1   111 ...........#......#.#.#.......#...#.....##..........#.....#...........##.##...#...........##.#.....#.#..##.#.#......#.......#...#..
   -1   112 ..#....##....#....#.........#...#......................#...............#.......#...........#....#........##..#.##.....#.....##.....
   -1   113 ....#........#......#....##......#.........#.......#.#......##.....#..##......#.........#...##....#..#..................#......#...
   -1   114 .........#...#..............................................###...........#............#..#......#....#..#...........#.#...........
   -1   115 ..#....#.#.#.#.#.............#.#.......#...................#..........#.......................##.#.#..#.#..#...#.......#...........
   -1   116 ..................#......#.#....####..###.....................#....#.#....#...........#.#.#....#.........#.##...............#......
   -1   117 .........##.#.#.........#..........#.......###..................#....#.....#..........##..#.#....#.....#..#.......#...#.....#......
   -1   118 .............####.........#...................#..........#.#.#....###....##........#.#..#....#..#..#............##........##.......
   -1   119 ........##.#.#..#...........##.#.....##......#.#............##..#..##...................#.#...#..##...####.#..#...........##.#.....
   -1   120 ..........#.............##...................#..#..........#.#......#...................#....#.....#..#...#...#.#.............#.#..
   -1   121 ......##..#..#.#.#....#..#..#.....##.#..#....#.....#..........#....................#..............#......##.......#.......#..##.#..
   -1   122 .......#.#...#.#..##.#........#.#.#.......#.....##.##...........#.............#...........#....##.#.#.....#.#..........#........#..
   -1   123 ..#....#....#..........#...#..........#.#....##......#.......#.#...#.................##..........#.#..##..#..............#....#....
   -1   124 .....................#............#......#..........##...............................#.#.#.#............#...#.....#.....#....#.....
   -1   125 ........#..#........#.......................#.....#....#...............................#...............#.#.##...#...#..#.....###...
   -1   126 ....#..#.#...#...........#.....#......#......#....#...##....................##........................#.##.....#......#.#......#...
   -1   127 .......#.#.....#......#....#.....#.....#............................................#....#...#...#.....#.#.#............###.#.#....
   -1   128 ......#.#.......##...#...#...#.....###..####...#........#.#................#.................#............#.....#..................
   -1   129 ...........##..............##...............##..........#..#..............##....#...#...#.##........#......#....#.##.#....#....###.
   -1   130 ....#..#.#......#..#.#.........#.....#......#..###.....#.#.......................#.....#......#....#..##....#....#....#.#.#........
   -1   131 ...................................................................................................................................

diff --git a/2023/21/solution.rs b/2023/21/solution.rs

@@ -0,0 +1,102 @@
   -1     1 use std::collections::VecDeque;
   -1     2 
   -1     3 #[path = "../lib.rs"]
   -1     4 mod lib;
   -1     5 
   -1     6 fn parse_input() -> (Vec<Vec<bool>>, usize, usize) {
   -1     7     let mut rocks = vec![];
   -1     8     let mut x0 = 0;
   -1     9     let mut y0 = 0;
   -1    10 
   -1    11     for (y, line) in lib::iter_input().enumerate() {
   -1    12         let mut row = vec![];
   -1    13         for (x, b) in line.bytes().enumerate() {
   -1    14             match b {
   -1    15                 b'.' => { row.push(false) }
   -1    16                 b'#' => { row.push(true) }
   -1    17                 b'S' => {
   -1    18                     row.push(false);
   -1    19                     x0 = x;
   -1    20                     y0 = y;
   -1    21                 }
   -1    22                 _ => unreachable!(),
   -1    23             };
   -1    24         }
   -1    25         rocks.push(row);
   -1    26     }
   -1    27     return (rocks, x0, y0);
   -1    28 }
   -1    29 
   -1    30 fn flood(rocks: &Vec<Vec<bool>>, x0: usize, y0: usize, factor: usize) -> Vec<Vec<usize>> {
   -1    31     let n = rocks.len();
   -1    32     let mut distance = vec![vec![usize::MAX; n * factor]; n * factor];
   -1    33     let mut queue = VecDeque::new();
   -1    34 
   -1    35     let offset = n * (factor / 2);
   -1    36     queue.push_back((x0 + offset, y0 + offset));
   -1    37     distance[y0 + offset][x0 + offset] = 0;
   -1    38 
   -1    39     while let Some((x, y)) = queue.pop_front() {
   -1    40         let mut neighbors = vec![];
   -1    41 
   -1    42         if x > 0 {
   -1    43             neighbors.push((x - 1, y));
   -1    44         }
   -1    45         if x + 1 < n * 5 {
   -1    46             neighbors.push((x + 1, y));
   -1    47         }
   -1    48         if y > 0 {
   -1    49             neighbors.push((x, y - 1));
   -1    50         }
   -1    51         if y + 1 < n * 5 {
   -1    52             neighbors.push((x, y + 1));
   -1    53         }
   -1    54 
   -1    55         let v = distance[y][x] + 1;
   -1    56         for (xx, yy) in neighbors.iter() {
   -1    57             if !rocks[*yy % n][*xx % n] && distance[*yy][*xx] > v {
   -1    58                 distance[*yy][*xx] = v;
   -1    59                 queue.push_back((*xx, *yy));
   -1    60             }
   -1    61         }
   -1    62     }
   -1    63 
   -1    64     return distance;
   -1    65 }
   -1    66 
   -1    67 fn count(distance: &Vec<Vec<usize>>, steps: usize) -> usize {
   -1    68     let mut count = 0;
   -1    69     for y in 0..distance.len() {
   -1    70         for x in 0..distance[0].len() {
   -1    71             if distance[y][x] <= steps && distance[y][x] % 2 == steps % 2 {
   -1    72                 count += 1;
   -1    73             }
   -1    74         }
   -1    75     }
   -1    76     return count;
   -1    77 }
   -1    78 
   -1    79 fn quad(c1: usize, c2: usize, c3: usize, k: usize) -> usize {
   -1    80     let a = (c3 - 2 * c2 + c1) / 2;
   -1    81     let c = c1;
   -1    82     let b = c2 - a - c;
   -1    83     return a * k * k + b * k + c;
   -1    84 }
   -1    85 
   -1    86 fn main() {
   -1    87     let (rocks, x0, y0) = parse_input();
   -1    88     assert!(rocks.len() == rocks[0].len());
   -1    89     let distance = flood(&rocks, x0, y0, 5);
   -1    90 
   -1    91     println!("part1: {}", count(&distance, 64));
   -1    92 
   -1    93     // I originally thought that the prism just repeats.
   -1    94     // Reddit told me to do quadratic interpolation instead and it worked.
   -1    95     let steps = 26_501_365;
   -1    96     let n = rocks.len();
   -1    97     assert!(steps % n == n / 2);
   -1    98     let c1 = count(&distance, n / 2);
   -1    99     let c2 = count(&distance, n + n / 2);
   -1   100     let c3 = count(&distance, 2 * n + n / 2);
   -1   101     println!("part2: {}", quad(c1, c2, c3, steps / n));
   -1   102 }

diff --git a/2023/21/test.txt b/2023/21/test.txt

@@ -0,0 +1,11 @@
   -1     1 ...........
   -1     2 .....###.#.
   -1     3 .###.##..#.
   -1     4 ..#.#...#..
   -1     5 ....#.#....
   -1     6 .##..S####.
   -1     7 .##..#...#.
   -1     8 .......##..
   -1     9 .##.#.####.
   -1    10 .##..##.##.
   -1    11 ...........