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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/examples/aoc2018/.gitignore +2 -0
  3. data/examples/aoc2018/day10.rb +61 -0
  4. data/examples/aoc2018/day11.rb +66 -0
  5. data/examples/aoc2018/day12.rb +61 -0
  6. data/examples/aoc2018/day13.rb +167 -0
  7. data/examples/aoc2018/day14.rb +31 -0
  8. data/examples/aoc2018/day14_2.rb +71 -0
  9. data/examples/aoc2018/day15.rb +271 -0
  10. data/examples/aoc2018/day16.rb +158 -0
  11. data/examples/aoc2018/day17.rb +203 -0
  12. data/examples/aoc2018/day18.rb +113 -0
  13. data/examples/aoc2018/day18_rspec.rb +131 -0
  14. data/examples/aoc2018/day19.rb +145 -0
  15. data/examples/aoc2018/day20.rb +103 -0
  16. data/examples/aoc2018/day21.rb +158 -0
  17. data/examples/aoc2018/day21_v2.rb +137 -0
  18. data/examples/aoc2018/day21_v3.rb +157 -0
  19. data/examples/aoc2018/day21_v4.rb +141 -0
  20. data/examples/aoc2018/day22.rb +212 -0
  21. data/examples/aoc2018/day23.rb +148 -0
  22. data/examples/aoc2018/day24.rb +156 -0
  23. data/examples/aoc2018/day25.rb +52 -0
  24. data/examples/aoc2018/day9.rb +51 -0
  25. data/examples/aoc2018/day9_circular.rb +125 -0
  26. data/examples/aoc2018/inputs/day10_input.txt +395 -0
  27. data/examples/aoc2018/inputs/day11_input.txt +1 -0
  28. data/examples/aoc2018/inputs/day12_input.txt +34 -0
  29. data/examples/aoc2018/inputs/day12_input2.txt +16 -0
  30. data/examples/aoc2018/inputs/day13_input.txt +150 -0
  31. data/examples/aoc2018/inputs/day13_test.txt +6 -0
  32. data/examples/aoc2018/inputs/day14_input.txt +1 -0
  33. data/examples/aoc2018/inputs/day15_input.txt +32 -0
  34. data/examples/aoc2018/inputs/day15_input10.txt +32 -0
  35. data/examples/aoc2018/inputs/day15_input11.txt +32 -0
  36. data/examples/aoc2018/inputs/day15_input12.txt +32 -0
  37. data/examples/aoc2018/inputs/day15_input13.txt +32 -0
  38. data/examples/aoc2018/inputs/day15_input14.txt +32 -0
  39. data/examples/aoc2018/inputs/day15_input2.txt +7 -0
  40. data/examples/aoc2018/inputs/day15_input3.txt +9 -0
  41. data/examples/aoc2018/inputs/day15_input4.txt +7 -0
  42. data/examples/aoc2018/inputs/day15_input5.txt +7 -0
  43. data/examples/aoc2018/inputs/day15_input6.txt +7 -0
  44. data/examples/aoc2018/inputs/day15_input7.txt +7 -0
  45. data/examples/aoc2018/inputs/day15_input8.txt +5 -0
  46. data/examples/aoc2018/inputs/day15_input9.txt +7 -0
  47. data/examples/aoc2018/inputs/day15_test.txt +9 -0
  48. data/examples/aoc2018/inputs/day16_input.txt +3865 -0
  49. data/examples/aoc2018/inputs/day17_input.txt +2229 -0
  50. data/examples/aoc2018/inputs/day17_input_test.txt +8 -0
  51. data/examples/aoc2018/inputs/day18_input.txt +50 -0
  52. data/examples/aoc2018/inputs/day18_test.txt +10 -0
  53. data/examples/aoc2018/inputs/day19_input.txt +48 -0
  54. data/examples/aoc2018/inputs/day20_input.txt +1 -0
  55. data/examples/aoc2018/inputs/day21_input.txt +32 -0
  56. data/examples/aoc2018/inputs/day22_input.txt +2 -0
  57. data/examples/aoc2018/inputs/day23_input.txt +1000 -0
  58. data/examples/aoc2018/inputs/day23_input2.txt +9 -0
  59. data/examples/aoc2018/inputs/day24_input.txt +24 -0
  60. data/examples/aoc2018/inputs/day25_input.txt +1483 -0
  61. data/examples/aoc2018/inputs/day9_input.txt +1 -0
  62. data/lib/cem.rb +0 -6
  63. data/lib/cem/ccommon.rb +45 -0
  64. data/lib/cem/cruzzles.rb +93 -38
  65. data/lib/cem/version.rb +1 -1
  66. 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]