1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
#!/usr/bin/env ruby
input = $stdin.readlines.map(&:strip).reject(&:empty?)
class Machine
def initialize(rs)
@rs = rs
end
def addr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] + @rs[b]
nrs
end
def addi(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] + b
nrs
end
def mulr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] * @rs[b]
nrs
end
def muli(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] * b
nrs
end
def banr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] & @rs[b]
nrs
end
def bani(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] & b
nrs
end
def borr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] | @rs[b]
nrs
end
def bori(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] | b
nrs
end
def setr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a]
nrs
end
def seti(a, b, c)
nrs = @rs.dup
nrs[c] = a
nrs
end
def gtir(a, b, c)
nrs = @rs.dup
nrs[c] = a > @rs[b] ? 1 : 0
nrs
end
def gtri(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] > b ? 1 : 0
nrs
end
def gtrr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] > @rs[b] ? 1 : 0
nrs
end
def eqir(a, b, c)
nrs = @rs.dup
nrs[c] = a == @rs[b] ? 1 : 0
nrs
end
def eqri(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] == @rs[b] ? 1 : 0
nrs
end
def eqrr(a, b, c)
nrs = @rs.dup
nrs[c] = @rs[a] == @rs[b] ? 1 : 0
nrs
end
def oprs(a, b, c)
[
addr(a, b, c), addi(a, b, c),
mulr(a, b, c), muli(a, b, c),
banr(a, b, c), bani(a, b, c),
borr(a, b, c), bori(a, b, c),
setr(a, b, c), seti(a, b, c),
gtir(a, b, c), gtri(a, b, c), gtrr(a, b, c),
eqir(a, b, c), eqri(a, b, c), eqrr(a, b, c)
]
end
end
gt3 = 0
input.each_slice(3) do |sample|
sample[0] =~ /Before: \[(\d+), (\d+), (\d+), (\d+)\]/
break if $1.nil?
m = Machine.new([$1.to_i, $2.to_i, $3.to_i, $4.to_i])
sample[1] =~ /\d+ (\d+) (\d+) (\d+)/
oprs = m.oprs($1.to_i, $2.to_i, $3.to_i)
sample[2] =~ /After: \[(\d+), (\d+), (\d+), (\d+)\]/
gt3 += 1 if oprs.count([$1.to_i, $2.to_i, $3.to_i, $4.to_i]) > 2
end
puts gt3
|