Skip to content

Commit 322f177

Browse files
committed
Year 2024 Day 17
1 parent 62a1f7b commit 322f177

File tree

7 files changed

+126
-4
lines changed

7 files changed

+126
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ Performance is reasonable even on older hardware, for example a 2011 MacBook Pro
8888
| 14 | [Restroom Redoubt](https://adventofcode.com/2024/day/14) | [Source](src/year2024/day14.rs) | 74 |
8989
| 15 | [Warehouse Woes](https://adventofcode.com/2024/day/15) | [Source](src/year2024/day15.rs) | 303 |
9090
| 16 | [Reindeer Maze](https://adventofcode.com/2024/day/16) | [Source](src/year2024/day16.rs) | 422 |
91+
| 17 | [Chronospatial Computer](https://adventofcode.com/2024/day/17) | [Source](src/year2024/day17.rs) | 7 |
9192

9293
## 2023
9394

benches/benchmark.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,5 @@ benchmark!(year2023
8888

8989
benchmark!(year2024
9090
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
91-
day14, day15, day16
91+
day14, day15, day16, day17
9292
);

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,5 @@ library!(year2023 "Restore global snow production."
6868

6969
library!(year2024 "Locate the Chief Historian in time for the big Christmas sleigh launch."
7070
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
71-
day14, day15, day16
71+
day14, day15, day16, day17
7272
);

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,5 @@ run!(year2023
142142

143143
run!(year2024
144144
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
145-
day14, day15, day16
145+
day14, day15, day16, day17
146146
);

src/year2024/day17.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
//! # Chronospatial Computer
2+
use crate::util::parse::*;
3+
4+
pub fn parse(input: &str) -> Vec<u64> {
5+
input.iter_unsigned::<u64>().collect()
6+
}
7+
8+
pub fn part1(input: &[u64]) -> String {
9+
let mut computer =
10+
Computer { program: &input[3..], ip: 0, a: input[0], b: input[1], c: input[2] };
11+
let mut out = Vec::new();
12+
13+
while let Some(n) = computer.run() {
14+
let digit = (n as u8 + b'0') as char;
15+
out.push(digit);
16+
out.push(',');
17+
}
18+
19+
out.pop();
20+
out.iter().collect()
21+
}
22+
23+
pub fn part2(input: &[u64]) -> u64 {
24+
let mut valid = vec![0];
25+
26+
for &out in input.iter().skip(3).rev() {
27+
let mut next = Vec::new();
28+
29+
for v in valid {
30+
for n in 0..8 {
31+
let a = (v << 3) | n;
32+
let mut computer =
33+
Computer { program: &input[3..], ip: 0, a, b: input[1], c: input[2] };
34+
35+
if let Some(result) = computer.run() {
36+
if result == out {
37+
next.push(a);
38+
}
39+
}
40+
}
41+
}
42+
43+
valid = next;
44+
}
45+
46+
*valid.iter().min().unwrap()
47+
}
48+
49+
struct Computer<'a> {
50+
program: &'a [u64],
51+
ip: usize,
52+
a: u64,
53+
b: u64,
54+
c: u64,
55+
}
56+
57+
impl Computer<'_> {
58+
fn run(&mut self) -> Option<u64> {
59+
while self.ip < self.program.len() {
60+
let combo = |index| match self.program[index] {
61+
0..4 => self.program[index],
62+
4 => self.a,
63+
5 => self.b,
64+
6 => self.c,
65+
_ => unreachable!(),
66+
};
67+
68+
match self.program[self.ip] {
69+
0 => self.a >>= combo(self.ip + 1),
70+
1 => self.b ^= self.program[self.ip + 1],
71+
2 => self.b = combo(self.ip + 1) % 8,
72+
3 => {
73+
if self.a != 0 {
74+
self.ip = self.program[self.ip + 1] as usize;
75+
continue;
76+
}
77+
}
78+
4 => self.b ^= self.c,
79+
5 => {
80+
let out = combo(self.ip + 1) % 8;
81+
self.ip += 2;
82+
return Some(out);
83+
}
84+
6 => self.b = self.a >> combo(self.ip + 1),
85+
7 => self.c = self.a >> combo(self.ip + 1),
86+
_ => unreachable!(),
87+
}
88+
89+
self.ip += 2;
90+
}
91+
92+
None
93+
}
94+
}

tests/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,5 @@ test!(year2023
8181

8282
test!(year2024
8383
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
84-
day14, day15, day16
84+
day14, day15, day16, day17
8585
);

tests/year2024/day17.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use aoc::year2024::day17::*;
2+
3+
const FIRST_EXAMPLE: &str = "\
4+
Register A: 729
5+
Register B: 0
6+
Register C: 0
7+
8+
Program: 0,1,5,4,3,0";
9+
10+
const SECOND_EXAMPLE: &str = "\
11+
Register A: 2024
12+
Register B: 0
13+
Register C: 0
14+
15+
Program: 0,3,5,4,3,0";
16+
17+
#[test]
18+
fn part1_test() {
19+
let input = parse(FIRST_EXAMPLE);
20+
assert_eq!(part1(&input), "4,6,3,5,6,3,5,2,1,0");
21+
}
22+
23+
#[test]
24+
fn part2_test() {
25+
let input = parse(SECOND_EXAMPLE);
26+
assert_eq!(part2(&input), 117440);
27+
}

0 commit comments

Comments
 (0)