cem 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/examples/aoc2018/.gitignore +2 -0
- data/examples/aoc2018/day10.rb +61 -0
- data/examples/aoc2018/day11.rb +66 -0
- data/examples/aoc2018/day12.rb +61 -0
- data/examples/aoc2018/day13.rb +167 -0
- data/examples/aoc2018/day14.rb +31 -0
- data/examples/aoc2018/day14_2.rb +71 -0
- data/examples/aoc2018/day15.rb +271 -0
- data/examples/aoc2018/day16.rb +158 -0
- data/examples/aoc2018/day17.rb +203 -0
- data/examples/aoc2018/day18.rb +113 -0
- data/examples/aoc2018/day18_rspec.rb +131 -0
- data/examples/aoc2018/day19.rb +145 -0
- data/examples/aoc2018/day20.rb +103 -0
- data/examples/aoc2018/day21.rb +158 -0
- data/examples/aoc2018/day21_v2.rb +137 -0
- data/examples/aoc2018/day21_v3.rb +157 -0
- data/examples/aoc2018/day21_v4.rb +141 -0
- data/examples/aoc2018/day22.rb +212 -0
- data/examples/aoc2018/day23.rb +148 -0
- data/examples/aoc2018/day24.rb +156 -0
- data/examples/aoc2018/day25.rb +52 -0
- data/examples/aoc2018/day9.rb +51 -0
- data/examples/aoc2018/day9_circular.rb +125 -0
- data/examples/aoc2018/inputs/day10_input.txt +395 -0
- data/examples/aoc2018/inputs/day11_input.txt +1 -0
- data/examples/aoc2018/inputs/day12_input.txt +34 -0
- data/examples/aoc2018/inputs/day12_input2.txt +16 -0
- data/examples/aoc2018/inputs/day13_input.txt +150 -0
- data/examples/aoc2018/inputs/day13_test.txt +6 -0
- data/examples/aoc2018/inputs/day14_input.txt +1 -0
- data/examples/aoc2018/inputs/day15_input.txt +32 -0
- data/examples/aoc2018/inputs/day15_input10.txt +32 -0
- data/examples/aoc2018/inputs/day15_input11.txt +32 -0
- data/examples/aoc2018/inputs/day15_input12.txt +32 -0
- data/examples/aoc2018/inputs/day15_input13.txt +32 -0
- data/examples/aoc2018/inputs/day15_input14.txt +32 -0
- data/examples/aoc2018/inputs/day15_input2.txt +7 -0
- data/examples/aoc2018/inputs/day15_input3.txt +9 -0
- data/examples/aoc2018/inputs/day15_input4.txt +7 -0
- data/examples/aoc2018/inputs/day15_input5.txt +7 -0
- data/examples/aoc2018/inputs/day15_input6.txt +7 -0
- data/examples/aoc2018/inputs/day15_input7.txt +7 -0
- data/examples/aoc2018/inputs/day15_input8.txt +5 -0
- data/examples/aoc2018/inputs/day15_input9.txt +7 -0
- data/examples/aoc2018/inputs/day15_test.txt +9 -0
- data/examples/aoc2018/inputs/day16_input.txt +3865 -0
- data/examples/aoc2018/inputs/day17_input.txt +2229 -0
- data/examples/aoc2018/inputs/day17_input_test.txt +8 -0
- data/examples/aoc2018/inputs/day18_input.txt +50 -0
- data/examples/aoc2018/inputs/day18_test.txt +10 -0
- data/examples/aoc2018/inputs/day19_input.txt +48 -0
- data/examples/aoc2018/inputs/day20_input.txt +1 -0
- data/examples/aoc2018/inputs/day21_input.txt +32 -0
- data/examples/aoc2018/inputs/day22_input.txt +2 -0
- data/examples/aoc2018/inputs/day23_input.txt +1000 -0
- data/examples/aoc2018/inputs/day23_input2.txt +9 -0
- data/examples/aoc2018/inputs/day24_input.txt +24 -0
- data/examples/aoc2018/inputs/day25_input.txt +1483 -0
- data/examples/aoc2018/inputs/day9_input.txt +1 -0
- data/lib/cem.rb +0 -6
- data/lib/cem/ccommon.rb +45 -0
- data/lib/cem/cruzzles.rb +93 -38
- data/lib/cem/version.rb +1 -1
- metadata +62 -2
@@ -0,0 +1,158 @@
|
|
1
|
+
#
|
2
|
+
# https://adventofcode.com/2018/day/21 part 1 and part 2
|
3
|
+
#
|
4
|
+
# Does not use any 'cem' functions
|
5
|
+
#
|
6
|
+
# Why this took long: Did not understand the question.
|
7
|
+
#
|
8
|
+
require 'set'
|
9
|
+
|
10
|
+
lines = File.readlines("inputs/day21_input.txt", chomp: true)
|
11
|
+
|
12
|
+
commandQueue = []
|
13
|
+
|
14
|
+
reg = [0,0,0,0,0,0]
|
15
|
+
|
16
|
+
ip = nil
|
17
|
+
lines.each { |line|
|
18
|
+
|
19
|
+
if line =~ /^#ip ([+-]?\d+)$/
|
20
|
+
ip = $1.to_i
|
21
|
+
end
|
22
|
+
|
23
|
+
if line =~ /^(\w+) ([+-]?\d+) ([+-]?\d+) ([+-]?\d+)$/
|
24
|
+
verb = $1
|
25
|
+
v1 = $2.to_i
|
26
|
+
v2 = $3.to_i
|
27
|
+
v3 = $4.to_i
|
28
|
+
|
29
|
+
commandQueue << [verb, v1, v2, v3]
|
30
|
+
end
|
31
|
+
}
|
32
|
+
|
33
|
+
commandQueue.each { |x|
|
34
|
+
puts x.inspect
|
35
|
+
} if false
|
36
|
+
|
37
|
+
ipp = 0
|
38
|
+
iteration = 0
|
39
|
+
|
40
|
+
s = Set.new
|
41
|
+
last = nil
|
42
|
+
|
43
|
+
while ipp >= 0 && ipp < commandQueue.size
|
44
|
+
|
45
|
+
reg[ip] = ipp
|
46
|
+
command = commandQueue[ipp]
|
47
|
+
|
48
|
+
puts iteration.to_s.rjust(13) + " " + command.inspect.ljust(40) + " " + reg.inspect if iteration % (1024*1024) == 0
|
49
|
+
iteration += 1
|
50
|
+
|
51
|
+
case command[0]
|
52
|
+
|
53
|
+
when "addr"
|
54
|
+
# addr (add register) stores into register C the result of adding register A and register B.
|
55
|
+
reg[command[3]] = reg[command[1]] + reg[command[2]]
|
56
|
+
|
57
|
+
when "addi"
|
58
|
+
# addi (add immediate) stores into register C the result of adding register A and value B.
|
59
|
+
reg[command[3]] = reg[command[1]] + command[2]
|
60
|
+
|
61
|
+
when "mulr"
|
62
|
+
# mulr (multiply register) stores into register C the result of multiplying register A and register B.
|
63
|
+
reg[command[3]] = reg[command[1]] * reg[command[2]]
|
64
|
+
|
65
|
+
when "muli"
|
66
|
+
# muli (multiply immediate) stores into register C the result of multiplying register A and value B.
|
67
|
+
reg[command[3]] = reg[command[1]] * command[2]
|
68
|
+
|
69
|
+
when "banr"
|
70
|
+
# banr (bitwise AND register) stores into register C the result of the bitwise AND of register A and register B.
|
71
|
+
reg[command[3]] = reg[command[1]] & reg[command[2]]
|
72
|
+
|
73
|
+
when "bani"
|
74
|
+
# bani (bitwise AND immediate) stores into register C the result of the bitwise AND of register A and value B.
|
75
|
+
reg[command[3]] = reg[command[1]] & command[2]
|
76
|
+
|
77
|
+
when "borr"
|
78
|
+
# borr (bitwise OR register) stores into register C the result of the bitwise OR of register A and register B.
|
79
|
+
reg[command[3]] = reg[command[1]] | reg[command[2]]
|
80
|
+
|
81
|
+
when "bori"
|
82
|
+
# bori (bitwise OR immediate) stores into register C the result of the bitwise OR of register A and value B.
|
83
|
+
reg[command[3]] = reg[command[1]] | command[2]
|
84
|
+
|
85
|
+
when "setr"
|
86
|
+
# setr (set register) copies the contents of register A into register C. (Input B is ignored.)
|
87
|
+
reg[command[3]] = reg[command[1]]
|
88
|
+
|
89
|
+
when "seti"
|
90
|
+
# seti (set immediate) stores value A into register C. (Input B is ignored.)
|
91
|
+
reg[command[3]] = command[1]
|
92
|
+
|
93
|
+
when "gtir"
|
94
|
+
# gtir (greater-than immediate/register) sets register C to 1 if value A is greater than register B. Otherwise, register C is set to 0.
|
95
|
+
reg[command[3]] = command[1] > reg[command[2]] ? 1 : 0
|
96
|
+
|
97
|
+
when "gtri"
|
98
|
+
# gtri (greater-than register/immediate) sets register C to 1 if register A is greater than value B. Otherwise, register C is set to 0.
|
99
|
+
reg[command[3]] = reg[command[1]] > command[2] ? 1 : 0
|
100
|
+
|
101
|
+
if command[1] == 0
|
102
|
+
puts command[2]
|
103
|
+
raise
|
104
|
+
end
|
105
|
+
|
106
|
+
when "gtrr"
|
107
|
+
# gtrr (greater-than register/register) sets register C to 1 if register A is greater than register B. Otherwise, register C is set to 0.
|
108
|
+
reg[command[3]] = reg[command[1]] > reg[command[2]] ? 1 : 0
|
109
|
+
|
110
|
+
if command[1] == 0
|
111
|
+
puts reg[command[2]]
|
112
|
+
raise
|
113
|
+
end
|
114
|
+
|
115
|
+
when "eqir"
|
116
|
+
# eqir (equal immediate/register) sets register C to 1 if value A is equal to register B. Otherwise, register C is set to 0.
|
117
|
+
reg[command[3]] = command[1] == reg[command[2]] ? 1 : 0
|
118
|
+
|
119
|
+
when "eqri"
|
120
|
+
# eqri (equal register/immediate) sets register C to 1 if register A is equal to value B. Otherwise, register C is set to 0.
|
121
|
+
reg[command[3]] = reg[command[1]] == command[2] ? 1 : 0
|
122
|
+
|
123
|
+
|
124
|
+
when "eqrr"
|
125
|
+
# eqrr (equal register/register) sets register C to 1 if register A is equal to register B. Otherwise, register C is set to 0.
|
126
|
+
reg[command[3]] = reg[command[1]] == reg[command[2]] ? 1 : 0
|
127
|
+
|
128
|
+
if command[2] == 0
|
129
|
+
if s.size == 0
|
130
|
+
puts "Part 1: #{reg[command[1]]}"
|
131
|
+
end
|
132
|
+
|
133
|
+
puts "#{s.size.to_s.rjust(10)} - #{reg[command[1]]}" if s.size % 64 == 0
|
134
|
+
|
135
|
+
if s.include?(reg[command[1]])
|
136
|
+
puts "Part 2: #{last}"
|
137
|
+
exit
|
138
|
+
end
|
139
|
+
s.add reg[command[1]]
|
140
|
+
last = reg[command[1]]
|
141
|
+
end
|
142
|
+
|
143
|
+
else
|
144
|
+
puts "error" # raise "Error"
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
if reg[0] != 0
|
149
|
+
puts reg[0]
|
150
|
+
exit
|
151
|
+
end
|
152
|
+
|
153
|
+
ipp = reg[ip]
|
154
|
+
ipp += 1
|
155
|
+
end
|
156
|
+
|
157
|
+
puts reg.inspect
|
158
|
+
puts reg[0]
|
@@ -0,0 +1,137 @@
|
|
1
|
+
#
|
2
|
+
# https://adventofcode.com/2018/day/21 part 1 and part 2
|
3
|
+
#
|
4
|
+
# Does not use any 'cem' functions
|
5
|
+
#
|
6
|
+
# Using Lambdas instead of interpreting each command.
|
7
|
+
#
|
8
|
+
require 'set'
|
9
|
+
|
10
|
+
lines = File.readlines("inputs/day21_input.txt", chomp: true)
|
11
|
+
|
12
|
+
commandQueue = []
|
13
|
+
|
14
|
+
@reg = [0,0,0,0,0,0]
|
15
|
+
@s = Set.new
|
16
|
+
@last = nil
|
17
|
+
|
18
|
+
ip = nil
|
19
|
+
lines.each { |line|
|
20
|
+
|
21
|
+
if line =~ /^#ip ([+-]?\d+)$/
|
22
|
+
ip = $1.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
if line =~ /^(\w+) ([+-]?\d+) ([+-]?\d+) ([+-]?\d+)$/
|
26
|
+
verb = $1
|
27
|
+
v1 = $2.to_i
|
28
|
+
v2 = $3.to_i
|
29
|
+
v3 = $4.to_i
|
30
|
+
|
31
|
+
commandQueue << case verb
|
32
|
+
|
33
|
+
when "addr"
|
34
|
+
# addr (add @register) stores into @register C the result of adding @register A and @register B.
|
35
|
+
Proc.new { @reg[v3] = @reg[v1] + @reg[v2] }
|
36
|
+
|
37
|
+
when "addi"
|
38
|
+
# addi (add immediate) stores into @register C the result of adding @register A and value B.
|
39
|
+
Proc.new { @reg[v3] = @reg[v1] + v2 }
|
40
|
+
|
41
|
+
when "mulr"
|
42
|
+
# mulr (multiply @register) stores into @register C the result of multiplying @register A and @register B.
|
43
|
+
Proc.new { @reg[v3] = @reg[v1] * @reg[v2] }
|
44
|
+
|
45
|
+
when "muli"
|
46
|
+
# muli (multiply immediate) stores into @register C the result of multiplying @register A and value B.
|
47
|
+
Proc.new { @reg[v3] = @reg[v1] * v2 }
|
48
|
+
|
49
|
+
when "banr"
|
50
|
+
# banr (bitwise AND @register) stores into @register C the result of the bitwise AND of @register A and @register B.
|
51
|
+
Proc.new { @reg[v3] = @reg[v1] & @reg[v2] }
|
52
|
+
|
53
|
+
when "bani"
|
54
|
+
# bani (bitwise AND immediate) stores into @register C the result of the bitwise AND of @register A and value B.
|
55
|
+
Proc.new { @reg[v3] = @reg[v1] & v2 }
|
56
|
+
|
57
|
+
when "borr"
|
58
|
+
# borr (bitwise OR @register) stores into @register C the result of the bitwise OR of @register A and @register B.
|
59
|
+
Proc.new { @reg[v3] = @reg[v1] | @reg[v2] }
|
60
|
+
|
61
|
+
when "bori"
|
62
|
+
# bori (bitwise OR immediate) stores into @register C the result of the bitwise OR of @register A and value B.
|
63
|
+
Proc.new { @reg[v3] = @reg[v1] | v2 }
|
64
|
+
|
65
|
+
when "setr"
|
66
|
+
# setr (set @register) copies the contents of @register A into @register C. (Input B is ignored.)
|
67
|
+
Proc.new { @reg[v3] = @reg[v1] }
|
68
|
+
|
69
|
+
when "seti"
|
70
|
+
# seti (set immediate) stores value A into @register C. (Input B is ignored.)
|
71
|
+
Proc.new { @reg[v3] = v1 }
|
72
|
+
|
73
|
+
when "gtir"
|
74
|
+
# gtir (greater-than immediate/@register) sets @register C to 1 if value A is greater than @register B. Otherwise, @register C is set to 0.
|
75
|
+
Proc.new { @reg[v3] = v1 > @reg[v2] ? 1 : 0 }
|
76
|
+
|
77
|
+
when "gtri"
|
78
|
+
# gtri (greater-than @register/immediate) sets @register C to 1 if @register A is greater than value B. Otherwise, @register C is set to 0.
|
79
|
+
Proc.new { @reg[v3] = @reg[v1] > v2 ? 1 : 0 }
|
80
|
+
|
81
|
+
when "gtrr"
|
82
|
+
# gtrr (greater-than @register/@register) sets @register C to 1 if @register A is greater than @register B. Otherwise, @register C is set to 0.
|
83
|
+
Proc.new { @reg[v3] = @reg[v1] > @reg[v2] ? 1 : 0 }
|
84
|
+
|
85
|
+
when "eqir"
|
86
|
+
# eqir (equal immediate/register) sets register C to 1 if value A is equal to register B. Otherwise, register C is set to 0.
|
87
|
+
Proc.new { @reg[v3] = v1 == @reg[v2] ? 1 : 0 }
|
88
|
+
|
89
|
+
when "eqri"
|
90
|
+
# eqri (equal register/immediate) sets register C to 1 if register A is equal to value B. Otherwise, register C is set to 0.
|
91
|
+
Proc.new { @reg[v3] = @reg[v1] == v2 ? 1 : 0 }
|
92
|
+
|
93
|
+
|
94
|
+
when "eqrr"
|
95
|
+
# eqrr (equal register/register) sets register C to 1 if register A is equal to register B. Otherwise, register C is set to 0.
|
96
|
+
Proc.new { @reg[v3] = @reg[v1] == @reg[v2] ? 1 : 0
|
97
|
+
|
98
|
+
if v2 == 0
|
99
|
+
if @s.size == 0
|
100
|
+
puts "Part 1: #{@reg[v1]}"
|
101
|
+
end
|
102
|
+
|
103
|
+
puts "#{@s.size.to_s.rjust(10)} - #{@reg[v1]}" if @s.size % 64 == 0
|
104
|
+
|
105
|
+
if @s.include?(@reg[v1])
|
106
|
+
puts "Part 2: #{@last}"
|
107
|
+
exit
|
108
|
+
end
|
109
|
+
@s.add @reg[v1]
|
110
|
+
@last = @reg[v1]
|
111
|
+
end
|
112
|
+
}
|
113
|
+
|
114
|
+
else
|
115
|
+
puts "error" # raise "Error"
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
}
|
120
|
+
|
121
|
+
ipp = 0
|
122
|
+
iteration = 0
|
123
|
+
|
124
|
+
while ipp >= 0 && ipp < commandQueue.size
|
125
|
+
|
126
|
+
@reg[ip] = ipp
|
127
|
+
commandQueue[ipp].call()
|
128
|
+
ipp = @reg[ip]
|
129
|
+
ipp += 1
|
130
|
+
|
131
|
+
#puts iteration.to_s.rjust(13) + " " + command.inspect.ljust(40) + " " + reg.inspect if iteration % (1024*1024) == 0
|
132
|
+
#iteration += 1
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
puts @reg.inspect
|
137
|
+
puts @reg[0]
|
@@ -0,0 +1,157 @@
|
|
1
|
+
#
|
2
|
+
# https://adventofcode.com/2018/day/21 part 1 and part 2
|
3
|
+
#
|
4
|
+
# Does not use any 'cem' functions
|
5
|
+
#
|
6
|
+
# Version 3: Put everything into a single Proc (did not help much)
|
7
|
+
#
|
8
|
+
require 'set'
|
9
|
+
|
10
|
+
lines = File.readlines("inputs/day21_input.txt", chomp: true)
|
11
|
+
|
12
|
+
commandQueue = []
|
13
|
+
|
14
|
+
@reg = [0,0,0,0,0,0]
|
15
|
+
@s = Set.new
|
16
|
+
@last = nil
|
17
|
+
|
18
|
+
def command(verb, v1, v2, v3)
|
19
|
+
|
20
|
+
case verb
|
21
|
+
when "addr"
|
22
|
+
# addr (add @register) stores into @register C the result of adding @register A and @register B.
|
23
|
+
" @reg[#{v3}] = @reg[#{v1}] + @reg[#{v2}] "
|
24
|
+
|
25
|
+
when "addi"
|
26
|
+
# addi (add immediate) stores into @register C the result of adding @register A and value B.
|
27
|
+
" @reg[#{v3}] = @reg[#{v1}] + #{v2} "
|
28
|
+
|
29
|
+
when "mulr"
|
30
|
+
# mulr (multiply @register) stores into @register C the result of multiplying @register A and @register B.
|
31
|
+
" @reg[#{v3}] = @reg[#{v1}] * @reg[#{v2}] "
|
32
|
+
|
33
|
+
when "muli"
|
34
|
+
# muli (multiply immediate) stores into @register C the result of multiplying @register A and value B.
|
35
|
+
" @reg[#{v3}] = @reg[#{v1}] * #{v2} "
|
36
|
+
|
37
|
+
when "banr"
|
38
|
+
# banr (bitwise AND @register) stores into @register C the result of the bitwise AND of @register A and @register B.
|
39
|
+
" @reg[#{v3}] = @reg[#{v1}] & @reg[#{v2}] "
|
40
|
+
|
41
|
+
when "bani"
|
42
|
+
# bani (bitwise AND immediate) stores into @register C the result of the bitwise AND of @register A and value B.
|
43
|
+
" @reg[#{v3}] = @reg[#{v1}] & #{v2} "
|
44
|
+
|
45
|
+
when "borr"
|
46
|
+
# borr (bitwise OR @register) stores into @register C the result of the bitwise OR of @register A and @register B.
|
47
|
+
" @reg[#{v3}] = @reg[#{v1}] | @reg[#{v2}] "
|
48
|
+
|
49
|
+
when "bori"
|
50
|
+
# bori (bitwise OR immediate) stores into @register C the result of the bitwise OR of @register A and value B.
|
51
|
+
" @reg[#{v3}] = @reg[#{v1}] | #{v2} "
|
52
|
+
|
53
|
+
when "setr"
|
54
|
+
# setr (set @register) copies the contents of @register A into @register C. (Input B is ignored.)
|
55
|
+
" @reg[#{v3}] = @reg[#{v1}] "
|
56
|
+
|
57
|
+
when "seti"
|
58
|
+
# seti (set immediate) stores value A into @register C. (Input B is ignored.)
|
59
|
+
" @reg[#{v3}] = #{v1} "
|
60
|
+
|
61
|
+
when "gtir"
|
62
|
+
# gtir (greater-than immediate/@register) sets @register C to 1 if value A is greater than @register B. Otherwise, @register C is set to 0.
|
63
|
+
" @reg[#{v3}] = #{v1} > @reg[#{v2}] ? 1 : 0 "
|
64
|
+
|
65
|
+
when "gtri"
|
66
|
+
# gtri (greater-than @register/immediate) sets @register C to 1 if @register A is greater than value B. Otherwise, @register C is set to 0.
|
67
|
+
" @reg[#{v3}] = @reg[#{v1}] > #{v2} ? 1 : 0 "
|
68
|
+
|
69
|
+
when "gtrr"
|
70
|
+
# gtrr (greater-than @register/@register) sets @register C to 1 if @register A is greater than @register B. Otherwise, @register C is set to 0.
|
71
|
+
" @reg[#{v3}] = @reg[#{v1}] > @reg[#{v2}] ? 1 : 0 "
|
72
|
+
|
73
|
+
when "eqir"
|
74
|
+
# eqir (equal immediate/register) sets register C to 1 if value A is equal to register B. Otherwise, register C is set to 0.
|
75
|
+
" @reg[#{v3}] = #{v1} == @reg[#{v2}] ? 1 : 0 "
|
76
|
+
|
77
|
+
when "eqri"
|
78
|
+
# eqri (equal register/immediate) sets register C to 1 if register A is equal to value B. Otherwise, register C is set to 0.
|
79
|
+
" @reg[#{v3}] = @reg[#{v1}] == #{v2} ? 1 : 0 "
|
80
|
+
|
81
|
+
when "eqrr"
|
82
|
+
# eqrr (equal register/register) sets register C to 1 if register A is equal to register B. Otherwise, register C is set to 0.
|
83
|
+
" @reg[#{v3}] = @reg[#{v1}] == @reg[#{v2}] ? 1 : 0
|
84
|
+
|
85
|
+
if #{v2} == 0
|
86
|
+
if @s.size == 0
|
87
|
+
puts \"Part 1: \#{@reg[#{v1}]}\"
|
88
|
+
end
|
89
|
+
|
90
|
+
puts \"\#{@s.size.to_s.rjust(10)} - \#{@reg[#{v1}]}\" if @s.size % 64 == 0
|
91
|
+
|
92
|
+
if @s.include?(@reg[#{v1}])
|
93
|
+
puts \"Part 2: \#{@last}\"
|
94
|
+
exit
|
95
|
+
end
|
96
|
+
@s.add @reg[#{v1}]
|
97
|
+
@last = @reg[#{v1}]
|
98
|
+
end
|
99
|
+
"
|
100
|
+
|
101
|
+
else
|
102
|
+
puts "error" # raise "Error"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
ipid = 0
|
109
|
+
ip = nil
|
110
|
+
lines.each { |line|
|
111
|
+
|
112
|
+
if line =~ /^#ip ([+-]?\d+)$/
|
113
|
+
ip = $1.to_i
|
114
|
+
end
|
115
|
+
|
116
|
+
if line =~ /^(\w+) ([+-]?\d+) ([+-]?\d+) ([+-]?\d+)$/
|
117
|
+
verb = $1
|
118
|
+
v1 = $2.to_i
|
119
|
+
v2 = $3.to_i
|
120
|
+
v3 = $4.to_i
|
121
|
+
|
122
|
+
p = command(verb, v1, v2, v3)
|
123
|
+
|
124
|
+
puts p
|
125
|
+
|
126
|
+
commandQueue << p
|
127
|
+
|
128
|
+
end
|
129
|
+
}
|
130
|
+
|
131
|
+
ippMax = commandQueue.size
|
132
|
+
|
133
|
+
commandQueue = "case ipp\n" + commandQueue.each_with_index.map { |v, i|
|
134
|
+
"when #{i}\n #{v}\n"
|
135
|
+
}.join("\n") + "\nend"
|
136
|
+
|
137
|
+
ipp = 0
|
138
|
+
iteration = 0
|
139
|
+
|
140
|
+
puts commandQueue
|
141
|
+
commandQueue = eval("
|
142
|
+
while #ipp >= 0 && ipp < ippMax
|
143
|
+
|
144
|
+
@reg[ip] = ipp
|
145
|
+
|
146
|
+
#{commandQueue}
|
147
|
+
|
148
|
+
ipp = @reg[ip]
|
149
|
+
ipp += 1
|
150
|
+
|
151
|
+
end")
|
152
|
+
|
153
|
+
#{commandQueue} }")
|
154
|
+
|
155
|
+
|
156
|
+
puts @reg.inspect
|
157
|
+
puts @reg[0]
|