cem 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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]
|