wip: day8
This commit is contained in:
parent
13daf93f49
commit
956b34bc80
|
@ -7,7 +7,7 @@ use aoc2023::{boilerplate, common::*};
|
|||
const DAY: usize = 08;
|
||||
type Parsed<'a> = (Vec<Direction>, 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),
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user