parent
7a2dee465d
commit
73ca0bca60
@ -0,0 +1,55 @@
|
||||
require "set"
|
||||
|
||||
class Program
|
||||
attr_reader :accumulator
|
||||
|
||||
def initialize(instructions)
|
||||
@instructions = instructions
|
||||
@accumulator = 0
|
||||
@pc = 0
|
||||
end
|
||||
|
||||
def run
|
||||
seen = Set.new
|
||||
|
||||
loop do
|
||||
break if @pc == @instructions.size
|
||||
|
||||
fail if seen.include?(@pc)
|
||||
seen << @pc
|
||||
|
||||
op, arg = @instructions.fetch(@pc)
|
||||
case op
|
||||
when :acc
|
||||
@accumulator += arg
|
||||
@pc += 1
|
||||
when :jmp
|
||||
@pc += arg
|
||||
when :nop
|
||||
@pc += 1
|
||||
else
|
||||
fail
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
instructions = ARGF.read.scan(/(\w+) ([-+]\d+)/).map {|op,arg| [op.to_sym, arg.to_i] }
|
||||
uncorrupt = { nop: :jmp, jmp: :nop }
|
||||
(0...instructions.size).select {|i|
|
||||
op, _ = instructions.fetch(i)
|
||||
uncorrupt.has_key?(op)
|
||||
}.map {|i|
|
||||
attempt = instructions.clone
|
||||
instruction = attempt.fetch(i)
|
||||
attempt[i] = [uncorrupt.fetch(instruction[0]), instruction[1]]
|
||||
attempt
|
||||
}.each do |i|
|
||||
program = Program.new(i)
|
||||
begin
|
||||
program.run
|
||||
rescue
|
||||
next
|
||||
end
|
||||
puts "accumulator: #{program.accumulator}"
|
||||
end
|
Loading…
Reference in new issue