Skip to content

Instantly share code, notes, and snippets.

@mgates
Last active December 9, 2019 03:53
Show Gist options
  • Save mgates/0030aadde4b6f2f7d07e36f2e8bcf96a to your computer and use it in GitHub Desktop.
Save mgates/0030aadde4b6f2f7d07e36f2e8bcf96a to your computer and use it in GitHub Desktop.
advent 2019 day 7
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))
3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0
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
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
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
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
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