From 956b34bc80397fd57ea6f31034266f507fa868da Mon Sep 17 00:00:00 2001 From: kageru Date: Fri, 8 Dec 2023 07:05:56 +0100 Subject: [PATCH] wip: day8 --- 2023/src/bin/day08.rs | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/2023/src/bin/day08.rs b/2023/src/bin/day08.rs index 884d481..977076f 100644 --- a/2023/src/bin/day08.rs +++ b/2023/src/bin/day08.rs @@ -7,7 +7,7 @@ use aoc2023::{boilerplate, common::*}; const DAY: usize = 08; type Parsed<'a> = (Vec, HashMap<&'a str, (&'a str, &'a str)>); -#[derive(Debug, PartialEq, Copy, Clone)] +#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash)] enum Direction { Left, Right, @@ -27,18 +27,30 @@ fn parse_input(raw: &str) -> Parsed { (directions, map) } -fn part1((directions, map): &Parsed) -> usize { +fn part1(parsed: &Parsed) -> usize { + steps_until(parsed, "AAA", "ZZZ") +} + +fn steps_until((directions, map): &Parsed, start: &str, target: &str) -> usize { + let mut visited = HashMap::new(); directions .iter() + .enumerate() .cycle() - .scan("AAA", |pos, dir| { + .enumerate() + .scan(start, |pos, (i, (j, dir))| { let next = match dir { Direction::Left => map.get(pos)?.0, Direction::Right => map.get(pos)?.1, }; - if next == "ZZZ" { + if next.ends_with("Z") { + println!("Found ghost after {}", i + 1); + } + if pos == &next || next.ends_with(target) || visited.contains_key(&(next, j)) { + println!("Stopping at {pos} (next {next}) after {i} steps"); None } else { + visited.insert((next, j), i); *pos = next; Some(next) } @@ -48,9 +60,24 @@ fn part1((directions, map): &Parsed) -> usize { } fn part2(parsed: &Parsed) -> usize { + for (start, _) in parsed.1.iter().filter(|(start, _)| start.ends_with("A")) { + println!("{}", steps_until(parsed, start, start)); + } unimplemented!() } +#[cfg(test)] +const TEST_INPUT_P2: &str = "LR + +11A = (11B, XXX) +11B = (XXX, 11Z) +11Z = (11B, XXX) +22A = (22B, XXX) +22B = (22C, 22C) +22C = (22Z, 22Z) +22Z = (22B, 22B) +XXX = (XXX, XXX)"; + boilerplate! { TEST_INPUT == "LLR @@ -59,9 +86,9 @@ BBB = (AAA, ZZZ) ZZZ = (ZZZ, ZZZ)", tests: { part1: { TEST_INPUT => 6 }, - part2: { TEST_INPUT => 0 }, + part2: { TEST_INPUT_P2 => 6 }, }, bench1 == 12083, - bench2 == 0, + bench2 == 0, // 183359899573 too low bench_parse: |(v, m): &Parsed| { assert_eq!(m["AAA"], ("MJJ", "QBJ")); (v.len(), v[0]) } => (281, Direction::Left), }