aboutsummaryrefslogtreecommitdiff
path: root/day16/part1
blob: 228d55acd8fbb61a3af80847f3997e95a9356870 (plain)
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