Advent of Code (2016) : Day 12
-- Problem --
You can find Part 1 of the problem statement
here. Part 2 is unlocked on successful completion of Part 1.
-- Solution in Elixir --
defmodule Aoc.Day12 do
def eval(register_map, instruction_pointer, instruction_list) when not instruction_pointer in 0..(length(instruction_list) - 1) do
register_map
end
def eval(register_map, instruction_pointer, instruction_list) do
case Enum.at(instruction_list, instruction_pointer) do
[:jnz, num, jump_by] when is_integer(num) and num == 0 -> eval(register_map, instruction_pointer + 1, instruction_list)
[:jnz, num, jump_by] when is_integer(num) -> eval(register_map, instruction_pointer + jump_by, instruction_list)
[:jnz, register, jump_by] ->
case register_map[register] == 0 do
true -> eval(register_map, instruction_pointer + 1, instruction_list)
false -> eval(register_map, instruction_pointer + jump_by, instruction_list)
end
[:inc, register] -> eval(%{register_map | register => register_map[register] + 1}, instruction_pointer + 1, instruction_list)
[:dec, register] -> eval(%{register_map | register => register_map[register] - 1}, instruction_pointer + 1, instruction_list)
[:cpy, num, register] when is_integer(num) -> eval(%{register_map | register => num}, instruction_pointer + 1, instruction_list)
[:cpy, register_src, register_dst] -> eval(%{register_map | register_dst => register_map[register_src]}, instruction_pointer + 1, instruction_list)
end
end
def parse_input() do
{:ok, input} = File.read("day12_input.txt")
String.split(input, "\n")
|> List.delete_at(-1)
|> Enum.map(&parse_instruction/1)
end
def parse_instruction(instruction_string) do
String.split(instruction_string)
|> Enum.map(fn(string) ->
case Integer.parse(string) do
:error -> String.to_atom(string)
{num, _} -> num
end
end)
end
def output_1() do
instruction_list = parse_input()
eval(%{:a => 0, :b => 0, :c => 1, :d => 0}, 0, instruction_list)
end
end
You can find all my Advent of Code (2016) solutions here.