cem 0.1.4 → 0.1.5

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