Skip to content

Commit 3edac6a

Browse files
committed
day 24, part 1
1 parent 8a6fa0c commit 3edac6a

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

2024/ruby/day24.rb

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
require_relative 'day'
2+
3+
class Day24 < Day # >
4+
5+
# @example
6+
# day.part1 #=> 4
7+
# @example larger
8+
# day = Day24.new(EXAMPLE_LARGER)
9+
# day.part1 #=> 2024
10+
def part1
11+
known_wires = {}
12+
to_be_determined = {}
13+
input
14+
.split("\n")
15+
.each do |line|
16+
case line
17+
when /\: /
18+
wire, signal = line.split(": ")
19+
known_wires[wire] = signal.to_i
20+
when /-\>/
21+
input1, gate, input2, wire = line.scan(/\w+/)
22+
to_be_determined[wire] = { inputs: [input1, input2], gate: gate }
23+
end
24+
end
25+
26+
while to_be_determined.keys.any? {|wire| wire.start_with?('z') } do
27+
puts to_be_determined.keys.inspect if ENV['DEBUG']
28+
to_be_determined
29+
.select {|wire, data| data[:inputs].all? {|input| known_wires.keys.include?(input) } }
30+
.each do |wire, data|
31+
known_wires[wire] =
32+
case data[:gate]
33+
when 'AND' ; known_wires[data[:inputs][0]] & known_wires[data[:inputs][1]]
34+
when 'OR' ; known_wires[data[:inputs][0]] | known_wires[data[:inputs][1]]
35+
when 'XOR' ; known_wires[data[:inputs][0]] ^ known_wires[data[:inputs][1]]
36+
else ; raise "lolwut: unknown gate #{data[:gate]}"
37+
end
38+
to_be_determined.delete(wire)
39+
end
40+
end
41+
42+
known_wires
43+
.select {|wire, signal| wire.start_with?('z') }
44+
.sort_by {|wire, signal| wire }
45+
.reverse
46+
.map {|wire, signal| signal.to_s }
47+
.join
48+
.to_i(2)
49+
end
50+
51+
# @example
52+
# day.part2 #=> 'how are you'
53+
def part2
54+
end
55+
56+
EXAMPLE_INPUT = File.read("../inputs/day24-example-input.txt")
57+
EXAMPLE_LARGER = <<~LARGER
58+
x00: 1
59+
x01: 0
60+
x02: 1
61+
x03: 1
62+
x04: 0
63+
y00: 1
64+
y01: 1
65+
y02: 1
66+
y03: 1
67+
y04: 1
68+
69+
ntg XOR fgs -> mjb
70+
y02 OR x01 -> tnw
71+
kwq OR kpj -> z05
72+
x00 OR x03 -> fst
73+
tgd XOR rvg -> z01
74+
vdt OR tnw -> bfw
75+
bfw AND frj -> z10
76+
ffh OR nrd -> bqk
77+
y00 AND y03 -> djm
78+
y03 OR y00 -> psh
79+
bqk OR frj -> z08
80+
tnw OR fst -> frj
81+
gnj AND tgd -> z11
82+
bfw XOR mjb -> z00
83+
x03 OR x00 -> vdt
84+
gnj AND wpb -> z02
85+
x04 AND y00 -> kjc
86+
djm OR pbm -> qhw
87+
nrd AND vdt -> hwm
88+
kjc AND fst -> rvg
89+
y04 OR y02 -> fgs
90+
y01 AND x02 -> pbm
91+
ntg OR kjc -> kwq
92+
psh XOR fgs -> tgd
93+
qhw XOR tgd -> z09
94+
pbm OR djm -> kpj
95+
x03 XOR y03 -> ffh
96+
x00 XOR y04 -> ntg
97+
bfw OR bqk -> z06
98+
nrd XOR fgs -> wpb
99+
frj XOR qhw -> z04
100+
bqk OR frj -> z07
101+
y03 OR x01 -> nrd
102+
hwm AND bqk -> z03
103+
tgd XOR rvg -> z12
104+
tnw OR pbm -> gnj
105+
LARGER
106+
end

0 commit comments

Comments
 (0)