this repo has no description
1defmodule GravAssist do
2 def calc([op, _, _ | rest], a \\ 12, b \\ 2) do
3 hd(execute([op, a, b | rest]))
4 end
5
6 def execute(bytecode) when is_list(bytecode), do: execute(:array.from_list(bytecode))
7 def execute(bytecode), do: eval(bytecode, 0)
8
9 defp eval(bytecode, ic) do
10 case :array.get(ic, bytecode) do
11 99 -> :array.to_list(bytecode)
12 op when op in 1..2 ->
13 pos_a = :array.get(ic + 1, bytecode)
14 pos_b = :array.get(ic + 2, bytecode)
15 pos_r = :array.get(ic + 3, bytecode)
16
17 result = compute(op, :array.get(pos_a, bytecode), :array.get(pos_b, bytecode))
18
19 new_bc = :array.set(pos_r, result, bytecode)
20
21 eval(new_bc, ic + 4)
22 _ -> :error
23 end
24 end
25
26 defp compute(1, a, b), do: a + b
27 defp compute(2, a, b), do: a * b
28end
29
30data =
31 IO.read(:line)
32 |> String.split(",")
33 |> Enum.map(&String.to_integer(String.trim(&1)))
34
35IO.inspect(GravAssist.calc(data), label: :sol1)
36
37for(a <- 0..99,
38 b <- 0..99,
39 19690720 == GravAssist.calc(data, a, b),
40 do: {a, b})
41|> IO.inspect(label: :sol2)