aoc

My solutions for the Advent of Code
git clone https://git.tronto.net/aoc
Download | Log | Files | Refs | README

commit 6fb3f5aa5a2c076bd6263fca2b105d5837513c25
parent 9479971937ce37d5e7f2d6813b5af9087fdc9d3e
Author: Sebastiano Tronto <sebastiano@tronto.net>
Date:   Wed,  9 Jul 2025 10:23:07 +0200

Day 23 2022

Diffstat:
A2022/23/a.rs | 24++++++++++++++++++++++++
A2022/23/b.rs | 12++++++++++++
A2022/23/common.rs | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/23/input | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A2022/23/test | 7+++++++
5 files changed, 200 insertions(+), 0 deletions(-)

diff --git a/2022/23/a.rs b/2022/23/a.rs @@ -0,0 +1,24 @@ +use std::cmp::{min, max}; +mod common; +use common::*; + +fn size(elves: &Vec<(i64, i64)>) -> usize { + let mut imax = i64::MIN; + let mut jmax = i64::MIN; + let mut imin = i64::MAX; + let mut jmin = i64::MAX; + for e in elves { + imax = max(imax, e.0); + jmax = max(jmax, e.1); + imin = min(imin, e.0); + jmin = min(jmin, e.1); + } + ((imax-imin+1) * (jmax-jmin+1)) as usize +} + +fn main() { + let (mut elves, mut lookup) = read_from_stdin(); + let _ = play(&mut elves, &mut lookup, 10); + let result = size(&elves) - elves.len(); + println!("{result}"); +} diff --git a/2022/23/b.rs b/2022/23/b.rs @@ -0,0 +1,12 @@ +mod common; +use common::*; + +fn main() { + const MAX_TURNS: usize = 1000; + let (mut elves, mut lookup) = read_from_stdin(); + if let Some(n) = play(&mut elves, &mut lookup, MAX_TURNS) { + println!("{}", n+1); + } else { + panic!("Not enough turns ({}), try increasing MAX_TURNS", MAX_TURNS); + } +} diff --git a/2022/23/common.rs b/2022/23/common.rs @@ -0,0 +1,83 @@ +use std::collections::{HashMap, HashSet}; + +const DIRECTIONS: [[(i64, i64); 3]; 4] = [ + [(-1, 0), (-1, 1), (-1, -1)], + [(1, 0), (1, 1), (1, -1)], + [(0, -1), (1, -1), (-1, -1)], + [(0, 1), (1, 1), (-1, 1)] +]; + +pub fn read_from_stdin() -> (Vec<(i64, i64)>, HashMap<(i64, i64), usize>) { + let mut v = vec![]; + let mut lookup = HashMap::new(); + let mut line = String::new(); + let mut i = 0; + while std::io::stdin().read_line(&mut line).unwrap() > 0 { + let bytes = line.as_bytes(); + for j in 0..bytes.len() { + if bytes[j] == b'#' { + lookup.insert((i, j as i64), v.len()); + v.push((i, j as i64)); + } + } + i += 1; + line.clear(); + } + (v, lookup) +} + +pub fn free_around(e: (i64, i64), m: &HashMap<(i64, i64), usize>) -> bool { + for d in [ + (-1, -1), (-1, 0), (-1, 1), + ( 0, -1), ( 0, 1), + ( 1, -1), ( 1, 0), ( 1, 1) + ] { + if m.contains_key(&(e.0 + d.0, e.1 + d.1)) { return false; } + } + true +} + +pub fn play( + elves: &mut Vec<(i64, i64)>, + lookup: &mut HashMap<(i64, i64), usize>, + nturns: usize +) -> Option<usize> { + let mut claimed = HashMap::<(i64, i64), usize>::new(); + let mut stopped = HashSet::<(i64, i64)>::new(); + for t in 0..nturns { + // First half + for i in 0..elves.len() { + let e = elves[i]; + if free_around(e, &lookup) { continue; } + for j in 0..4 { + let d = DIRECTIONS[(t+j)%4].iter() + .map(|x| (e.0+x.0, e.1+x.1)) + .collect::<Vec<_>>(); + if !lookup.contains_key(&d[0]) && + !lookup.contains_key(&d[1]) && + !lookup.contains_key(&d[2]) + { + if claimed.contains_key(&d[0]) { stopped.insert(d[0]); } + claimed.insert(d[0], i); + break; + } + } + } + + // Second half + let mut any_moved = false; + for (moveto, i) in &claimed { + if stopped.contains(&moveto) { continue; } + any_moved = true; + lookup.remove(&elves[*i]); + elves[*i] = *moveto; + lookup.insert(elves[*i], *i); + } + if !any_moved { return Some(t); } + + // Cleanup + claimed.clear(); + stopped.clear(); + } + None +} diff --git a/2022/23/input b/2022/23/input @@ -0,0 +1,74 @@ +#.....###.....#.###....#.#..#...###..#..#....#.#.......#.##.###.####.#...# +##.#..#.#.#.#..##.##......####.##.##...#...##..#.....####..#.#..###...#..# +.#.###...##.#.###.#..##.#..#.###..#.###..#..##.##.########....#...#...##.. +##.#...#.##..#...############.#..#..##.#.#.#.####....#.##....#...##.####.. +##.#.###....#.##.##.#.####....####.###.#..#...#####.#..###.#.###.....#.#.. +.#..#####.#...###..#..#..###..#.#...#.###.###.#.##.#.....#.#.##.##.#.....# +#.#...##..#.###.##.##.##........#.#.##....#..##...#..#####..##..#....#.##. +###....###..#..#.....#..####...###.#.#....#.#.#.#..##.###.#..#..######.... +#..#..#...#.#.#.#....#.#.##.#.#.#.#######..#.##...##..####.###.##.#.###.#. +###.##...#...##..#...#.##.##.##.#.#.#.#..#.#.#...###....#.#.##.....###.... +....##...##.#.##.#..#...#..#...#.##.#...##..#...#.##...##..#.#.##..#.#.... +##.....#.##....##...###.#.#####...####.###....#######.#.....##.#.#..#.##.. +.......#####..#.###.#...###..##.##..#.#.###...#..#..##..##.#..#.#..#..##.. +#.#..###.#.#.#..#####....###.#..#.#.###...##....#.#.####.##...#....#.#.#.. +..#.....##.#.#..###.#...######.##....#####.###...####.#####.##..#...###.#. +.#.####.......##.###.#..#####.#######...##.#.###..#......##..#...#.#.#.#.. +##.###.....#.##..#.#.#.#.#..##....####.#...#.###...#.####..#.#......#..#.# +####.......##....######.#.#.#.#..#.##.###.....#...#.#..#.#.###..#.###..##. +##..###..###...##...#.#..##.#..#.#.#.#...#..##..#.#..#....#...##...##.###. +#....#.....####..##.#........#.#..#...#...##...##.#..#..#.#.#.#..#......## +#.#.#..#..##.####......#..#####.#.##..##..##...####.###..#####...#.#..##.# +####.#.##.....#..####.##.####.#####...#####.#....##....#..#..#.###.#.##.#. +..#.##.##.##.#.#...#.###..#.##.######..#..#...#.###..###.###.#.#.#..#.#.#. +..##..##..#..#####...##.###...###.###########.#..#######..#.#.#....####### +#.###.#.##..######.###..##...#..##.#.###..##..#..#.#.#..#.##.#.#..#.#.#### +#....#.##...##..#.#.####.......#.#.###.#......###......#..##...#..#.####.. +##.####..######.####....#.###.##..#.#.##.#.#..##.#..##.#.##.#.##.#####..#. +#######.####.#.##.########..#..###.###.###...##......#..##.#.#####...#...# +#..##.#.#..######.##.##..#....#..##.#.#####.##..#.##.##..#..###.#.##..##.# +..#.#.#..##...####....##.#.#..####..#.#####.###.#..##.....#..##..##.#.#..# +#.###..####....####..###.#.####.#.##....#.##.###.##.###########..#..###.## +..##.##.##.#.####......####...##..#....#####...#.#....#####..#.#####..##.# +#..##...#...###.#..#.##.##.#.#.#....#..##.###.###.##........#..####.##...# +...#####.####..###........#.##...##....#...#..#...##..###..#####...######. +..#..##..#.......##.#....###..######.##.####.##..##.....##.###.#.#####.#.# +..#.#...#.......##.##.###..#.#.#...#########..###...#....#...#.###.#..#.## +#.#..#..######..#........##..###.##..#.##.#.#..#.#....##.#.#..#.#...#.#.#. +#....#.#.#####.###......#..#..##.##...#......##..#.###..##.####.######.#.. +#..#.....#..####.#...##.####..######.#.#.###..##.....##.#.##.######.#.#### +....###.#######..#.##..########.....#.#..##..#.#..#.##....#.#..#..#..##.#. +#..#.##.#.#.#.##.#.#.....#..#..#...#..##..##.#..#.##.#.#.#...##.##.#...#.# +.#.######.#..##.#.##.....##.#.##.#.#....######..##..##.#...#...#.#.###..## +.#.#..#..#..#..##.#.####.#.####.#....#.#.###.###.#..###..##.#...#.###.###. +##.#.##..###.####.#.#.###.#......#####.###.######.#..######.#...#.#.####.. +###.####..#.###....#.....#.#.##.#.##.#####...##.#...#####.#.###.#..##..... +##..#.#..#.####.#.####...###.#.##..#####.#..###...#####.####..#...#.##.#.# +..##.#####..##.#####..#..#..#..#...##..#.###..##.#....##...#...#.#.##...## +##...#.##..#.##...#.#.####..#.#...####..#.##.#.#...#####.##..#######.##... +.#..####.##...#.#...##..#..###.#####.#.#.#.#..##..##.###.....#...#..####.. +.##..#...#.###.####.#.#...#...#####..#..#.#.##...#...##..#.#..#.#.#.###..# +###.##.####.##....#.#..#.##.##..###.####..##..#.####.....#.#.###..#.###### +#.##.#.##.#..#..#.#......##.#.##.#..#.#.#.....###.....#......###....#..### +.#..#..#....#..#.#...#..#..##......##...###.###.##...#...#.....#...###.### +#..##..#..##.#....###...#......#.######..#.###..#.#....#......#.##..#.#### +.#...##.#..#####..##...#####.#....#######....#.....###....#..###.##..#..#. +.###.#.##..#..#..##..#....#...#.##.##.##.#..#...##..#..##...##..######.### +#....#.#####.###..#.#.......##..##...##..#.###..#####.#..#..##.#..#....##. +##..#......#######...#.##.###..#.....##..#.####.###.##.#..####.#.#####.##. +..#....###.#........#..######.#...##.......##.#.###.##.#...#.##....##.#... +###.....#..##.####.#..###..#..#####.##.##.#######.#.####.####......#.##.## +..#...#...#######.#.####....#.####..#..#..##.#.#.###..#.#####.##.#.....#.# +###.#.#..#.####.##...#.#####.##.####..#.#.###.#..#...#..#########.###.#.## +..######.########..###.#.#.###.#.#.#.#.####.#...#..##...##.#####..##...#.# +...#.#...##.#....####.###..#..#..#..##..###.##..#.#....#..#...######.##.## +#####.##..#..##..#####.#..#..#..###.##..##...###....#.###.#.#.##...###..## +..#.##.#....####..#.#..###.#.#..##...#..##....####.............#.#.#..#.## +.###...#.#....#..#.######....###.....#..#...##..##.#....##...#.###....###. +.#.####..#.#.###..###.#..###.#..#..#######....###.......#....###.#...#.### +###.#.###.#..#.#..###.#.....#.##..#.#.####..###...#...#####...####...##... +.#..##..#.##..#..##..######.###.##.....##..#..#.##...####.#...#####..###.# +..##...######.#.#...#.#.#####.##.##...##.##....#.#####...###....#.#.#.#..# +##..#.#.#....##.####.#.##.##.#.#.##......#...##..##...##.#####...#..#..##. +...####.#..###....#.###.#.#.........#....####..#........#.###..####.##...# +.##.##.#####...##.....##.#..#####..##.....#....##......#.#..###..###..##.. diff --git a/2022/23/test b/2022/23/test @@ -0,0 +1,7 @@ +....#.. +..###.# +#...#.# +.#...## +#.###.. +##.#.## +.#..#..