Day 8 Part 2
This commit is contained in:
parent
9a5568d1cf
commit
9d08bca079
1 changed files with 52 additions and 0 deletions
|
|
@ -35,6 +35,58 @@ defmodule Day8 do
|
||||||
program = parse_program(read_input())
|
program = parse_program(read_input())
|
||||||
find_loop(program, 0, 0, %{})
|
find_loop(program, 0, 0, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run(program, pc, acc, history, term_pc) do
|
||||||
|
{next_pc, next_acc} = tick(program, pc, acc)
|
||||||
|
count = Map.get(history, next_pc, 0)
|
||||||
|
|
||||||
|
cond do
|
||||||
|
count > 0 -> :loop
|
||||||
|
next_pc == term_pc -> {:term, next_acc}
|
||||||
|
next_pc > term_pc -> :wtf
|
||||||
|
true -> run(program, next_pc, next_acc, Map.put(history, next_pc, count + 1), term_pc)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def mod(program, ridx) do
|
||||||
|
Enum.with_index(program)
|
||||||
|
|> Enum.map(fn {{op, val}, idx} ->
|
||||||
|
if idx == ridx do
|
||||||
|
case op do
|
||||||
|
"nop" -> {"jmp", val}
|
||||||
|
"jmp" -> {"nop", val}
|
||||||
|
_ -> {op, val}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{op, val}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def mods(program) do
|
||||||
|
Stream.with_index(program)
|
||||||
|
|> Stream.filter(fn {{op, _val}, _idx} ->
|
||||||
|
case op do
|
||||||
|
"acc" -> false
|
||||||
|
"nop" -> true
|
||||||
|
"jmp" -> true
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|> Stream.map(fn {_, idx} -> mod(program, idx) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2 do
|
||||||
|
program = parse_program(read_input())
|
||||||
|
term_pc = Enum.count(program)
|
||||||
|
|
||||||
|
Enum.reduce_while(mods(program), nil, fn modded_program, _ ->
|
||||||
|
case run(modded_program, 0, 0, %{}, term_pc) do
|
||||||
|
:loop -> {:cont, nil}
|
||||||
|
{:term, acc} -> {:halt, acc}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
Day8.part1() |> IO.inspect()
|
Day8.part1() |> IO.inspect()
|
||||||
|
Day8.part2() |> IO.inspect()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue