aboutsummaryrefslogtreecommitdiff
path: root/day18/part2
blob: 8a930dc2effc46d2c5a0ed8aa93a088cf476e009 (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
#!/usr/bin/env ruby

def valof(reg_file, reg_or_int)
  if reg_or_int >= 'a' && reg_or_int <= 'z' then
    return reg_file[reg_or_int] || 0
  end
  return reg_or_int.to_i
end

input = $stdin.readlines.map(&:chomp)

reg0 = {"p" => 0}
reg1 = {"p" => 1}
pc0 = 0
pc1 = 0
q0 = []
q1 = []
running0 = true
running1 = true
count = 0

loop do
  running0 = false if pc0 < 0 || pc0 >= input.length
  running1 = false if pc1 < 0 || pc1 >= input.length

  if running0 then
    istr = input[pc0].split
    case istr[0]
    when 'snd'
      q1 << valof(reg0, istr[1])
      count += 1
    when 'set'
      reg0[istr[1]] = valof(reg0, istr[2])
    when 'add'
      reg0[istr[1]] = valof(reg0, istr[1]) + valof(reg0, istr[2])
    when 'mul'
      reg0[istr[1]] = valof(reg0, istr[1]) * valof(reg0, istr[2])
    when 'mod'
      reg0[istr[1]] = valof(reg0, istr[1]) % valof(reg0, istr[2])
    when 'rcv'
      if q0.empty? then
        pc0 -= 1
      else
        reg0[istr[1]] = q0.shift
      end
    when 'jgz'
      if valof(reg0, istr[1]) > 0 then
        pc0 += valof(reg0, istr[2])
        pc0 -= 1
      end
    end
    pc0 += 1
  end

  if running1 then
    istr = input[pc1].split
    case istr[0]
    when 'snd'
      q0 << valof(reg1, istr[1])
    when 'set'
      reg1[istr[1]] = valof(reg1, istr[2])
    when 'add'
      reg1[istr[1]] = valof(reg1, istr[1]) + valof(reg1, istr[2])
    when 'mul'
      reg1[istr[1]] = valof(reg1, istr[1]) * valof(reg1, istr[2])
    when 'mod'
      reg1[istr[1]] = valof(reg1, istr[1]) % valof(reg1, istr[2])
    when 'rcv'
      if q1.empty? then
        pc1 -= 1
      else
        reg1[istr[1]] = q1.shift
      end
    when 'jgz'
      if valof(reg1, istr[1]) > 0 then
        pc1 += valof(reg1, istr[2])
        pc1 -= 1
      end
    end
    pc1 += 1
  end

  break if !running0 && !running1
  break if input[pc0].split[0] == 'rcv' && q0.empty? && !running1
  break if input[pc1].split[0] == 'rcv' && q1.empty? && !running0
  break if input[pc0].split[0] == 'rcv' && q0.empty? &&
           input[pc1].split[0] == 'rcv' && q1.empty?
end

puts count