Skip to content
This repository was archived by the owner on Sep 20, 2025. It is now read-only.

Commit a3b9c88

Browse files
committed
Day 21 Ruby solutions
1 parent 7aad91c commit a3b9c88

File tree

2 files changed

+152
-0
lines changed

2 files changed

+152
-0
lines changed

21-1.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/usr/bin/env ruby
2+
3+
$monkeys = {}
4+
5+
class Monkey
6+
def initialize(name, operation)
7+
number_format = /^(?<num>[[:digit:]]+)$/
8+
calc_format = /^(?<m1>[[:alpha:]]+) (?<op>[-+*\/]) (?<m2>[[:alpha:]]+)$/
9+
10+
@operation = operation
11+
@name = name
12+
@value = nil
13+
14+
if m = number_format.match(@operation)
15+
@value = m['num'].to_i
16+
else
17+
m = calc_format.match(@operation)
18+
@m1 = m['m1']
19+
@op = m['op']
20+
@m2 = m['m2']
21+
end
22+
end
23+
24+
def value
25+
return @value if @value
26+
27+
@value = $monkeys[@m1].value.send(@op, $monkeys[@m2].value)
28+
end
29+
30+
def to_s
31+
"<#{self.class}: #{@name} = #{@operation} (#{@value})>"
32+
end
33+
34+
alias inspect to_s
35+
end
36+
37+
38+
input = File.read('21.input').lines
39+
40+
monkey_format = /^(?<name>[[:alpha:]]+): (?<op>.*)$/
41+
42+
input.each do |line|
43+
m = monkey_format.match line
44+
$monkeys[m['name']] = Monkey.new(m['name'], m['op'])
45+
end
46+
47+
print $monkeys['root'].value, "\n"

21-2.rb

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env ruby
2+
3+
$monkeys = {}
4+
5+
class IsHuman < ::StandardError
6+
end
7+
8+
class Monkey
9+
def initialize(name, operation)
10+
number_format = /^(?<num>[[:digit:]]+)$/
11+
calc_format = /^(?<m1>[[:alpha:]]+) (?<op>[-+*\/=]) (?<m2>[[:alpha:]]+)$/
12+
13+
@operation = operation
14+
@name = name
15+
@value = nil
16+
17+
if m = number_format.match(@operation)
18+
@value = m['num'].to_i
19+
else
20+
m = calc_format.match(@operation)
21+
@m1 = m['m1']
22+
@op = m['op']
23+
@op = '==' if @name == 'root'
24+
@m2 = m['m2']
25+
end
26+
end
27+
28+
def value
29+
raise IsHuman if setting? and @name == 'humn'
30+
return @value if @value
31+
32+
@value = $monkeys[@m1].value.send(@op, $monkeys[@m2].value)
33+
end
34+
35+
def set_equal!(value)
36+
if @name == 'humn'
37+
@value = value
38+
return
39+
end
40+
41+
begin
42+
left = $monkeys[@m1].value
43+
rescue IsHuman
44+
left = nil
45+
end
46+
begin
47+
right = $monkeys[@m2].value
48+
rescue IsHuman
49+
right = nil
50+
end
51+
52+
case @op
53+
when '=='
54+
$monkeys[@m1].set_equal!(right) if right
55+
$monkeys[@m2].set_equal!(left) if left
56+
when '+'
57+
$monkeys[@m1].set_equal!(value - right) if right
58+
$monkeys[@m2].set_equal!(value - left) if left
59+
when '-'
60+
$monkeys[@m1].set_equal!(value + right) if right
61+
$monkeys[@m2].set_equal!(left - value) if left
62+
when '*'
63+
$monkeys[@m1].set_equal!(value / right) if right
64+
$monkeys[@m2].set_equal!(value / left) if left
65+
when '/'
66+
$monkeys[@m1].set_equal!(value * right) if right
67+
$monkeys[@m2].set_equal!(left / value) if left
68+
end
69+
end
70+
71+
def to_s
72+
"<#{self.class}: #{@name} = #{@operation} (#{@value})>"
73+
end
74+
75+
alias inspect to_s
76+
77+
def self.setting=(maybe)
78+
@@setting = maybe
79+
end
80+
81+
def self.setting
82+
@@setting ||= false
83+
end
84+
85+
private
86+
87+
def setting?
88+
self.class.setting
89+
end
90+
end
91+
92+
93+
input = File.read('21.input').lines
94+
95+
monkey_format = /^(?<name>[[:alpha:]]+): (?<op>.*)$/
96+
97+
input.each do |line|
98+
m = monkey_format.match line
99+
$monkeys[m['name']] = Monkey.new(m['name'], m['op'])
100+
end
101+
102+
Monkey.setting = true
103+
$monkeys['root'].set_equal! nil
104+
Monkey.setting = false
105+
print $monkeys['humn'].value, "\n"

0 commit comments

Comments
 (0)