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"
|
require "advent"
|
||||||
INPUT = input(2020, 8).lines.map do |s|
|
require "./console.cr"
|
||||||
code, int = s.split(" ")
|
|
||||||
{code, int.to_i32}
|
|
||||||
end
|
|
||||||
|
|
||||||
def run(prog)
|
INPUT = input(2020, 8)
|
||||||
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
|
|
||||||
|
|
||||||
def part1
|
def part1
|
||||||
run(INPUT)[1]
|
run(parse(INPUT))[1].receive[1]
|
||||||
end
|
end
|
||||||
|
|
||||||
def part2
|
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|
|
jnp.each do |i|
|
||||||
prog = INPUT.clone
|
prog = input.clone
|
||||||
op, int = prog[i]
|
op, int = prog[i]
|
||||||
prog[i] = {op.tr("jmpnop", "nopjmp"), int}
|
prog[i] = {op.tr("jmpnop", "nopjmp"), int}
|
||||||
|
|
||||||
code, acc = run(prog)
|
code, acc = run(prog)[1].receive
|
||||||
return acc if code == :term
|
return acc if code == :term
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user