Advent of code day 13
Mix.install([
{:kino, "~> 0.5.0"}
])
Setup input
example = Kino.Input.textarea("Please paste your input example:")
input = Kino.Input.textarea("Please paste your real input:")
Parse
claws =
example
|> Kino.Input.read()
|> String.split("\n\n", trim: true)
|> Enum.map(fn line ->
Regex.scan(~r/\d+/, line)
|> Enum.map(fn [n | []] -> String.to_integer(n) end)
|> List.to_tuple()
end)
defmodule Solver do
# nice!
def crammer_rule({ax, ay, bx, by, px, py}) do
det = ax * by - bx * ay
x = px * by - bx * py
y = ax * py - px * ay
# ensure its a integer
if det == 0 or rem(x, det) != 0 or rem(y, det) != 0,
do: 0,
else: 3 * div(x, det) + div(y, det)
end
end
Part 01
Enum.reduce(claws, 0, fn claw, acc ->
Solver.crammer_rule(claw) + acc
end)
Part 02
Enum.reduce(claws, 0, fn claw, acc ->
{ax, ay, bx, by, px, py} = claw
claw = {ax, ay, bx, by, px + 10_000_000_000_000, py + 10_000_000_000_000}
Solver.crammer_rule(claw) + acc
end)