Factor console code into a separate file.
This commit is contained in:
parent
2688950560
commit
d1e15ca2c9
36
console.cr
Normal file
36
console.cr
Normal file
|
@ -0,0 +1,36 @@
|
|||
def parse(input)
|
||||
input.lines.map do |s|
|
||||
code, int = s.split(" ")
|
||||
{code, int.to_i32}
|
||||
end
|
||||
end
|
||||
|
||||
def run(prog)
|
||||
acc = 0
|
||||
pc = 0
|
||||
visited = Set(Int32).new
|
||||
input = Channel(Int32).new
|
||||
output = Channel({Symbol, Int32}).new
|
||||
spawn do
|
||||
loop do
|
||||
if pc >= prog.size
|
||||
output.send({:term, acc})
|
||||
break
|
||||
elsif visited.includes? pc
|
||||
output.send({:inf, acc})
|
||||
break
|
||||
end
|
||||
|
||||
visited << pc
|
||||
code, int = prog[pc]
|
||||
case code
|
||||
when "acc"
|
||||
acc += int
|
||||
when "jmp"
|
||||
pc += int - 1
|
||||
end
|
||||
pc += 1
|
||||
end
|
||||
end
|
||||
{input, output}
|
||||
end
|
34
day8.cr
34
day8.cr
|
@ -1,41 +1,21 @@
|
|||
require "advent"
|
||||
INPUT = input(2020, 8).lines.map do |s|
|
||||
code, int = s.split(" ")
|
||||
{code, int.to_i32}
|
||||
end
|
||||
require "./console.cr"
|
||||
|
||||
def run(prog)
|
||||
acc = 0
|
||||
pc = 0
|
||||
visited = Set(Int32).new
|
||||
loop do
|
||||
return {:term, acc} if pc >= prog.size
|
||||
return {:inf, acc} if visited.includes? pc
|
||||
|
||||
visited << pc
|
||||
code, int = prog[pc]
|
||||
case code
|
||||
when "acc"
|
||||
acc += int
|
||||
when "jmp"
|
||||
pc += int - 1
|
||||
end
|
||||
pc += 1
|
||||
end
|
||||
end
|
||||
INPUT = input(2020, 8)
|
||||
|
||||
def part1
|
||||
run(INPUT)[1]
|
||||
run(parse(INPUT))[1].receive[1]
|
||||
end
|
||||
|
||||
def part2
|
||||
jnp = INPUT.find_indices { |e| e[0] == "jmp" || e[0] == "nop" }
|
||||
input = parse(INPUT)
|
||||
jnp = input.find_indices { |e| e[0] == "jmp" || e[0] == "nop" }
|
||||
jnp.each do |i|
|
||||
prog = INPUT.clone
|
||||
prog = input.clone
|
||||
op, int = prog[i]
|
||||
prog[i] = {op.tr("jmpnop", "nopjmp"), int}
|
||||
|
||||
code, acc = run(prog)
|
||||
code, acc = run(prog)[1].receive
|
||||
return acc if code == :term
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue
Block a user