Powered by AppSignal & Oban Pro

AOC 2025 Day 1

2025/day_01.livemd

AOC 2025 Day 1

Section

defmodule Day01 do
  @start_position 50

  def data(:test) do
    ~s(L68
L30
R48
L5
R60
L55
L1
L99
R14
L82
)
  end

  def data(:real) do
    File.read!("data.txt")
  end

  defp prep(data) do
    String.trim(data)
    |> String.split("\n")
    |> Enum.map(&String.split_at(&1, 1))
    |> Enum.map(fn {d, tick} ->
      {d, String.to_integer(tick)}
    end)
  end

  def part_01(rotations) do
    prep(rotations)
    |> Enum.reduce(%{position: @start_position, zeroes: 0}, fn {d, tick}, acc ->
      new_position =
        case d do
          "L" -> Integer.mod(acc.position - tick, 100)
          "R" -> Integer.mod(acc.position + tick, 100)
        end

      new_zero = if new_position == 0, do: acc.zeroes + 1, else: acc.zeroes
      %{acc | position: new_position, zeroes: new_zero}
    end)
  end
end

Day01.data(:test)
|> Day01.part_01()