Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

Advent of code day 13

2024/livebooks/day-13.livemd

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)