Skip to content

Commit ccef6dd

Browse files
committed
Year 2024 Day 24
1 parent a48877c commit ccef6dd

File tree

7 files changed

+243
-4
lines changed

7 files changed

+243
-4
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ Performance is reasonable even on older hardware, for example a 2011 MacBook Pro
9595
| 21 | [Keypad Conundrum](https://adventofcode.com/2024/day/21) | [Source](src/year2024/day21.rs) | 111 |
9696
| 22 | [Monkey Market](https://adventofcode.com/2024/day/22) | [Source](src/year2024/day22.rs) | 1350 |
9797
| 23 | [LAN Party](https://adventofcode.com/2024/day/23) | [Source](src/year2024/day23.rs) | 43 |
98+
| 24 | [Crossed Wires](https://adventofcode.com/2024/day/24) | [Source](src/year2024/day24.rs) | - |
9899

99100
## 2023
100101

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, day17, day18, day19, day20, day21, day22, day23
91+
day14, day15, day16, day17, day18, day19, day20, day21, day22, day23, day24
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, day17, day18, day19, day20, day21, day22, day23
71+
day14, day15, day16, day17, day18, day19, day20, day21, day22, day23, day24
7272
);

src/main.rs

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

139139
run!(year2024
140140
day01, day02, day03, day04, day05, day06, day07, day08, day09, day10, day11, day12, day13,
141-
day14, day15, day16, day17, day18, day19, day20, day21, day22, day23
141+
day14, day15, day16, day17, day18, day19, day20, day21, day22, day23, day24
142142
);

src/year2024/day24.rs

Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
//! # Crossed Wires
2+
use crate::util::hash::*;
3+
use crate::util::parse::*;
4+
5+
pub fn parse(input: &str) -> &str {
6+
input
7+
}
8+
9+
pub fn part1(input: &str) -> u64 {
10+
let (prefix, suffix) = input.split_once("\n\n").unwrap();
11+
12+
let mut names = FastMap::new();
13+
let mut cache = FastMap::new();
14+
let mut ops = FastMap::new();
15+
16+
for line in prefix.lines() {
17+
let (key, value) = line.split_once(": ").unwrap();
18+
19+
let size = names.len();
20+
let index = *names.entry(key).or_insert(size);
21+
22+
cache.insert(index, value.unsigned::<u64>());
23+
}
24+
25+
for line in suffix.lines() {
26+
let tokens: Vec<_> = line.split(' ').collect();
27+
let op = tokens[1];
28+
29+
let size = names.len();
30+
let left = *names.entry(tokens[0]).or_insert(size);
31+
32+
let size = names.len();
33+
let right = *names.entry(tokens[2]).or_insert(size);
34+
35+
let size = names.len();
36+
let to = *names.entry(tokens[4]).or_insert(size);
37+
38+
ops.insert(to, (left, op, right));
39+
}
40+
41+
let mut result = 0;
42+
43+
for i in (0..64).rev() {
44+
let key = format!("z{i:02}");
45+
if let Some(&key) = names.get(key.as_str()) {
46+
result = (result << 1) | helper(&mut cache, &mut ops, key);
47+
}
48+
}
49+
50+
result
51+
}
52+
53+
pub fn part2(_input: &str) -> String {
54+
// let (_, suffix) = input.split_once("\n\n").unwrap();
55+
// let mut wires = FastMap::new();
56+
57+
// println!("digraph G {{");
58+
59+
// for i in 0..46 {
60+
// if i < 45 {
61+
// let key = format!("x{i:02}");
62+
// println!(" {} [pos=\"{},{}!\"]", key, i * 2, 5);
63+
// let value = key.clone();
64+
// wires.insert(key, vec![value]);
65+
66+
// let key = format!("y{i:02}");
67+
// println!(" {} [pos=\"{},{}!\"]", key, i * 2 + 1, 5);
68+
// let value = key.clone();
69+
// wires.insert(key, vec![value]);
70+
// }
71+
72+
// let key = format!("z{i:02}");
73+
// println!(" {} [pos=\"{},{}!\"]", key, i * 2, 0);
74+
// }
75+
76+
// println!();
77+
78+
// for (name, line) in suffix.lines().enumerate() {
79+
// let tokens: Vec<_> = line.split(' ').collect();
80+
// let [_, _, _, _, to] = tokens[..] else { unreachable!() };
81+
// wires.entry(String::from(to)).or_insert_with(Vec::new).push(format!("{name}"));
82+
// }
83+
84+
// let mut second = FastMap::new();
85+
86+
// for (name, line) in suffix.lines().enumerate() {
87+
// let tokens: Vec<_> = line.split(' ').collect();
88+
// let [left, op, right, _, to] = tokens[..] else { unreachable!() };
89+
90+
// let shape = match op {
91+
// "AND" => "square",
92+
// "OR" => "hexagon",
93+
// "XOR" => "triangle",
94+
// _ => unreachable!(),
95+
// };
96+
97+
// if left.starts_with('x') || right.starts_with('x') {
98+
// let i: usize = left.unsigned();
99+
// if op == "AND" {
100+
// println!("{} [pos=\"{},{}!\"]", name, i * 2 + 1, 4);
101+
// second.insert(to, i);
102+
// }
103+
// if op == "XOR" {
104+
// println!("{} [pos=\"{},{}!\"]", name, i * 2, 4);
105+
// second.insert(to, i);
106+
// }
107+
// }
108+
// if to.starts_with('z') {
109+
// let i: usize = to.unsigned();
110+
// println!("{} [pos=\"{},{}!\"]", name, i * 2, 1);
111+
// }
112+
113+
// println!(" {name} [shape={shape}]");
114+
// for edge in &wires[&String::from(left)] {
115+
// println!(" {edge} -> {name} [label=\"{left}\"]");
116+
// }
117+
// for edge in &wires[&String::from(right)] {
118+
// println!(" {edge} -> {name} [label=\"{right}\"]");
119+
// }
120+
// }
121+
122+
// for (name, line) in suffix.lines().enumerate() {
123+
// let tokens: Vec<_> = line.split(' ').collect();
124+
// let [left, op, right, _, _] = tokens[..] else { unreachable!() };
125+
126+
// if op == "AND" {
127+
// if let Some(i) = second.get(left) {
128+
// println!("{} [pos=\"{},{}!\"]", name, i * 2 + 1, 3);
129+
// }
130+
// if let Some(i) = second.get(right) {
131+
// println!("{} [pos=\"{},{}!\"]", name, i * 2 + 1, 3);
132+
// }
133+
// }
134+
// if op == "OR" {
135+
// if let Some(i) = second.get(left) {
136+
// println!("{} [pos=\"{},{}!\"]", name, i * 2 + 1, 2);
137+
// }
138+
// if let Some(i) = second.get(right) {
139+
// println!("{} [pos=\"{},{}!\"]", name, i * 2 + 1, 2);
140+
// }
141+
// }
142+
// }
143+
144+
// for i in 0..46 {
145+
// let key = format!("z{i:02}");
146+
// for edge in &wires[&key] {
147+
// println!(" {edge} -> {key}");
148+
// }
149+
// }
150+
151+
String::from("n/a")
152+
}
153+
154+
fn helper(
155+
cache: &mut FastMap<usize, u64>,
156+
ops: &mut FastMap<usize, (usize, &str, usize)>,
157+
key: usize,
158+
) -> u64 {
159+
if let Some(&value) = cache.get(&key) {
160+
return value;
161+
}
162+
163+
let (left, op, right) = ops[&key];
164+
let left = helper(cache, ops, left);
165+
let right = helper(cache, ops, right);
166+
167+
let value = match op {
168+
"AND" => left & right,
169+
"OR" => left | right,
170+
"XOR" => left ^ right,
171+
_ => unreachable!(),
172+
};
173+
174+
cache.insert(key, value);
175+
value
176+
}

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, day17, day18, day19, day20, day21, day22, day23
84+
day14, day15, day16, day17, day18, day19, day20, day21, day22, day23, day24
8585
);

tests/year2024/day24.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use aoc::year2024::day24::*;
2+
3+
const EXAMPLE: &str = "\
4+
x00: 1
5+
x01: 0
6+
x02: 1
7+
x03: 1
8+
x04: 0
9+
y00: 1
10+
y01: 1
11+
y02: 1
12+
y03: 1
13+
y04: 1
14+
15+
ntg XOR fgs -> mjb
16+
y02 OR x01 -> tnw
17+
kwq OR kpj -> z05
18+
x00 OR x03 -> fst
19+
tgd XOR rvg -> z01
20+
vdt OR tnw -> bfw
21+
bfw AND frj -> z10
22+
ffh OR nrd -> bqk
23+
y00 AND y03 -> djm
24+
y03 OR y00 -> psh
25+
bqk OR frj -> z08
26+
tnw OR fst -> frj
27+
gnj AND tgd -> z11
28+
bfw XOR mjb -> z00
29+
x03 OR x00 -> vdt
30+
gnj AND wpb -> z02
31+
x04 AND y00 -> kjc
32+
djm OR pbm -> qhw
33+
nrd AND vdt -> hwm
34+
kjc AND fst -> rvg
35+
y04 OR y02 -> fgs
36+
y01 AND x02 -> pbm
37+
ntg OR kjc -> kwq
38+
psh XOR fgs -> tgd
39+
qhw XOR tgd -> z09
40+
pbm OR djm -> kpj
41+
x03 XOR y03 -> ffh
42+
x00 XOR y04 -> ntg
43+
bfw OR bqk -> z06
44+
nrd XOR fgs -> wpb
45+
frj XOR qhw -> z04
46+
bqk OR frj -> z07
47+
y03 OR x01 -> nrd
48+
hwm AND bqk -> z03
49+
tgd XOR rvg -> z12
50+
tnw OR pbm -> gnj";
51+
52+
#[test]
53+
fn part1_test() {
54+
let input = parse(EXAMPLE);
55+
assert_eq!(part1(input), 2024);
56+
}
57+
58+
#[test]
59+
fn part2_test() {
60+
let input = parse(EXAMPLE);
61+
assert_eq!(part2(input), "n/a");
62+
}

0 commit comments

Comments
 (0)