Last active
December 9, 2019 03:53
-
-
Save mgates/0030aadde4b6f2f7d07e36f2e8bcf96a to your computer and use it in GitHub Desktop.
advent 2019 day 7
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Thing | |
def do_it_all(input) | |
opts = [] | |
[0,1,2,3,4].permutation.each do |perms| | |
out = 0 | |
#puts perms.inspect | |
(0..4).each do |amp| | |
inp = [perms[amp], out] | |
#puts inp.inspect | |
out = do_it(inp, input) | |
end | |
puts [perms, out].inspect | |
opts << [perms, out] | |
puts | |
puts opts.sort_by {|a| a.last.last.last}.map(&:inspect) | |
end | |
end | |
def do_it_all_better(code) | |
Thread.abort_on_exception = true | |
opts = [] | |
all_opts = [] | |
[5,6,7,8,9].reverse.permutation.each do |perms| | |
threads = [] | |
queues = [Queue.new, Queue.new, Queue.new, Queue.new, Queue.new] | |
#puts perms.inspect | |
(0..4).each do |amp| | |
inq = queues[amp - 1] | |
outq = queues[amp] | |
inq.push perms[amp] | |
inq.push(0) if amp == 0 | |
name = ("A".."E").to_a[amp] | |
threads << Thread.new(inq, code, outq, name) do |inq, code, outq, name| | |
puts [inq, code, outq, name].inspect | |
do_it(inq, code, outq, name) | |
end | |
end | |
opts << threads.map(&:join).map(&:value) | |
puts | |
puts ["ASDF", perms, opts.last.last ].inspect | |
all_opts << ["ASDF", perms, opts.last.last ] | |
end | |
puts all_opts.sort_by(&:last).map(&:inspect) | |
end | |
def do_it(inq, code, output, name) | |
puts "starting #{name}" | |
nums = code.dup | |
pos = 0 | |
while true | |
#puts [nums[pos], [pos], nums].inspect if name == "A" | |
if nums[pos] < 100 | |
opcode = nums[pos] | |
p1mode_par = true | |
p2mode_par = true | |
p3mode_par = true | |
else | |
op = nums[pos].to_s | |
opcode = op.slice(-2..-1).to_i | |
p1mode_par = op[-3] == "0" || op[-3].nil? | |
p2mode_par = op[-4] == "0" || op[-4].nil? | |
p3mode_par = op[-5] == "0" || op[-5].nil? | |
end | |
case opcode | |
when 99 | |
out = output.pop | |
puts "#{name}: DONE! #{out}\n" | |
output.push out | |
return out | |
when 1 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
p2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
p3 = nums[pos + 3] | |
raise "narpe: #{pos}, #{op} #{p1} #{p2} #{p3}, #{[p1mode_par , p2mode_par, p3mode_par].inspect} \n#{nums.inspect}" if p3 > nums.length | |
(nums[p3] = p1 + p2) | |
pos += 4 | |
when 2 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
p2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
p3 = nums[pos + 3] | |
raise "nirpe" if p3 > nums.length | |
(nums[p3] = p1 * p2) | |
pos += 4 | |
when 3 | |
p1 = p1mode_par ? nums[pos + 1] : pos + 1 | |
popped = inq.pop | |
puts "#{name}: << #{popped}" | |
nums[p1] = popped | |
pos += 2 | |
when 4 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
puts "#{name} >>> #{p1}" | |
output.push p1 | |
#raise "#{p1}, #{pos}, #{nums.inspect}" unless p1 == 0 | |
pos += 2 | |
when 4 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
puts "#{name} >>> #{p1}" | |
output.push p1 | |
#raise "#{p1}, #{pos}, #{nums.inspect}" unless p1 == 0 | |
pos += 2 | |
when 5 | |
val = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
val2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
pos = val == 0 ? pos + 3 : val2 | |
when 6 | |
val = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
val2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
pos = val == 0 ? val2 : pos + 3 | |
when 7 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
p2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
p3 = nums[pos + 3] | |
nums[p3] = p1 < p2 ? 1 : 0 | |
pos = pos + 4 | |
when 8 | |
p1 = p1mode_par ? nums[nums[pos + 1]] : nums[pos + 1] | |
p2 = p2mode_par ? nums[nums[pos + 2]] : nums[pos + 2] | |
p3 = nums[pos + 3] | |
nums[p3] = p1 == p2 ? 1 : 0 | |
pos = pos + 4 | |
else | |
raise "wtf: #{pos}: #{nums[pos]}\n#{nums.inspect}" | |
end | |
end | |
end | |
end | |
#Thing.new.do_it(1, *ARGF.read.chomp.split(",").map(&:to_i)).inspect | |
#Thing.new.do_it(5, *ARGF.read.chomp.split(",").map(&:to_i)) | |
#Thing.new.do_it_all(ARGF.read.chomp.split(",").map(&:to_i)) | |
Thing.new.do_it_all_better(ARGF.read.chomp.split(",").map(&:to_i)) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,23,3,24,1002,24,10,24,1002,23,-1,23, 101,5,23,23,1,24,23,23,4,23,99,0,0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54,-5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4,53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3,8,1001,8,10,8,105,1,0,0,21,42,51,76,101,118,199,280,361,442,99999,3,9,101,5,9,9,102,2,9,9,1001,9,4,9,102,2,9,9,4,9,99,3,9,1002,9,3,9,4,9,99,3,9,1002,9,4,9,1001,9,3,9,1002,9,5,9,101,3,9,9,1002,9,2,9,4,9,99,3,9,101,4,9,9,1002,9,2,9,1001,9,3,9,1002,9,3,9,101,4,9,9,4,9,99,3,9,101,3,9,9,1002,9,3,9,101,2,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment