adventofcode

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

commit
5cea89071e5b5f2baa882c61af47b48874c1b539
parent
e6a6b5e9b9860736af6280316ab81ad095c51f95
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2022-12-23 09:18
2022-12-23

Diffstat

A 2022/23/input.txt 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2022/23/solution.rs 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A 2022/23/test.txt 7 +++++++

3 files changed, 212 insertions, 0 deletions


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

@@ -0,0 +1,73 @@
   -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 .##..###.####.#..#####.###..###..#......##...#.....####..###..#..##.#.##.
   -1    67 ......###.#..#...#..#.#.##.#.###...##.#.#....####.#..#.######.#.#...####.
   -1    68 ...#.##.####....##..##.#.###.###.....#..###...####..##..######.#..##.....
   -1    69 .....####.....###.#.#.......#####.#.#....##...#####..#..#.#..#.#.#..##.##
   -1    70 ##..##.#..##..#..#.#####..##.####.#...#.#..#..###..#..#....#...#.###.##..
   -1    71 #.#..#.#########.####..#####..####.#.#####....#.#..##...#..####.#..###.#.
   -1    72 #..##.###.##..#....#...#..#.##..#..###..#####..#######.#####....#.##.....
   -1    73 ####.####.########.#.###....#.#..#..#.#.#.#..#....#..#.....#..##..#.##.#.

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

@@ -0,0 +1,132 @@
   -1     1 #[path = "../lib.rs"] mod lib;
   -1     2 
   -1     3 enum Dir {
   -1     4     North,
   -1     5     East,
   -1     6     South,
   -1     7     West,
   -1     8 }
   -1     9 
   -1    10 const DIRS: [Dir; 4] = [Dir::North, Dir::South, Dir::West, Dir::East];
   -1    11 
   -1    12 
   -1    13 fn get_input() -> Vec<(i64, i64)> {
   -1    14     let mut elves = vec![];
   -1    15     for (y, line) in lib::iter_input().enumerate() {
   -1    16         for (x, c) in line.chars().enumerate() {
   -1    17             if c == '#' {
   -1    18                 elves.push((x as i64, y as i64));
   -1    19             }
   -1    20         }
   -1    21     }
   -1    22     return elves;
   -1    23 }
   -1    24 
   -1    25 fn render(elves: &Vec<(i64, i64)>) {
   -1    26     let x1 = elves.iter().map(|(x, _)| *x).min().unwrap();
   -1    27     let y1 = elves.iter().map(|(_, y)| *y).min().unwrap();
   -1    28     let x2 = elves.iter().map(|(x, _)| *x).max().unwrap();
   -1    29     let y2 = elves.iter().map(|(_, y)| *y).max().unwrap();
   -1    30 
   -1    31     for y in y1..=y2 {
   -1    32         for x in x1..=x2 {
   -1    33             if elves.contains(&(x, y)) {
   -1    34                 print!("#");
   -1    35             } else {
   -1    36                 print!(".");
   -1    37             }
   -1    38         }
   -1    39         print!("\n");
   -1    40     }
   -1    41     print!("\n");
   -1    42 }
   -1    43 
   -1    44 fn propose_move(elves: &Vec<(i64, i64)>, x: i64, y: i64, offset: usize) -> (i64, i64) {
   -1    45     if !elves.iter().any(|(x2, y2)| (*x2, *y2) != (x, y) && (*x2 - x).abs() <= 1 && (*y2 - y).abs() <= 1) {
   -1    46         return (x, y);
   -1    47     }
   -1    48 
   -1    49     for dir_i in 0..4 {
   -1    50         match DIRS[(dir_i + offset) % 4] {
   -1    51             Dir::North => {
   -1    52                 if !elves.iter().any(|(x2, y2)| *y2 == y - 1 && (*x2 - x).abs() <= 1) {
   -1    53                     return (x, y - 1);
   -1    54                 }
   -1    55             },
   -1    56             Dir::East => {
   -1    57                 if !elves.iter().any(|(x2, y2)| *x2 == x + 1 && (*y2 - y).abs() <= 1) {
   -1    58                     return (x + 1, y);
   -1    59                 }
   -1    60             },
   -1    61             Dir::South => {
   -1    62                 if !elves.iter().any(|(x2, y2)| *y2 == y + 1 && (*x2 - x).abs() <= 1) {
   -1    63                     return (x, y + 1);
   -1    64                 }
   -1    65             },
   -1    66             Dir::West => {
   -1    67                 if !elves.iter().any(|(x2, y2)| *x2 == x - 1 && (*y2 - y).abs() <= 1) {
   -1    68                     return (x - 1, y);
   -1    69                 }
   -1    70             },
   -1    71         }
   -1    72     }
   -1    73     return (x, y);
   -1    74 }
   -1    75 
   -1    76 fn do_round(elves: &Vec<(i64, i64)>, offset: usize) -> (Vec<(i64, i64)>, bool) {
   -1    77     let mut tmp = vec![];
   -1    78     let mut changed = false;
   -1    79 
   -1    80     for (x, y) in elves.iter() {
   -1    81         let proposed = propose_move(elves, *x, *y, offset);
   -1    82         tmp.push(proposed);
   -1    83         changed |= proposed != (*x, *y);
   -1    84     }
   -1    85 
   -1    86     let mut result = vec![];
   -1    87 
   -1    88     for i in 0..elves.len() {
   -1    89         let (x, y) = tmp[i];
   -1    90         if tmp.iter().filter(|(x2, y2)| *x2 == x && *y2 == y).count() == 1 {
   -1    91             result.push((x, y));
   -1    92         } else {
   -1    93             result.push(elves[i]);
   -1    94         }
   -1    95     }
   -1    96 
   -1    97     // println!("==== Round {} ====", offset);
   -1    98     // render(&result);
   -1    99 
   -1   100     return (result, changed);
   -1   101 }
   -1   102 
   -1   103 fn part1(init: &Vec<(i64, i64)>, rounds: usize) -> i64 {
   -1   104     let mut elves = do_round(init, 0).0;
   -1   105     for i in 1..rounds {
   -1   106         elves = do_round(&elves, i).0;
   -1   107     }
   -1   108 
   -1   109     let x1 = elves.iter().map(|(x, _)| x).min().unwrap();
   -1   110     let y1 = elves.iter().map(|(_, y)| y).min().unwrap();
   -1   111     let x2 = elves.iter().map(|(x, _)| x).max().unwrap();
   -1   112     let y2 = elves.iter().map(|(_, y)| y).max().unwrap();
   -1   113 
   -1   114     return (x2 + 1 - x1) * (y2 + 1 - y1) - elves.len() as i64;
   -1   115 }
   -1   116 
   -1   117 fn part2(init: &Vec<(i64, i64)>) -> usize {
   -1   118     let mut state = do_round(init, 0);
   -1   119     for i in 1.. {
   -1   120         state = do_round(&state.0, i);
   -1   121         if !state.1 {
   -1   122             return i + 1;
   -1   123         }
   -1   124     }
   -1   125     unreachable!();
   -1   126 }
   -1   127 
   -1   128 fn main() {
   -1   129     let elves = get_input();
   -1   130     println!("part1: {}", part1(&elves, 10));
   -1   131     println!("part2: {}", part2(&elves));
   -1   132 }

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

@@ -0,0 +1,7 @@
   -1     1 ....#..
   -1     2 ..###.#
   -1     3 #...#.#
   -1     4 .#...##
   -1     5 #.###..
   -1     6 ##.#.##
   -1     7 .#..#..