Powered by AppSignal & Oban Pro

AoC 2015 Day 10

2015/day10.livemd

AoC 2015 Day 10

Mix.install([:kino])

defmodule Utils do
  def split(line, sep \\ "") do
    String.split(line, sep, trim: true)
  end

  def split_all_lines(text, sep \\ "") do
    text
    |> String.split("\n", trim: true)
    |> Enum.map(&split(&1, sep))
  end

  def to_numbers(number) when is_binary(number) do
    String.to_integer(number)
  end

  def to_numbers(numbers) when is_list(numbers) do
    Enum.map(numbers, &to_numbers/1)
  end

  def to_matrix(text, sep \\ "") do
    text
    |> split_all_lines(sep)
    |> then(fn data ->
      for {row, r} <- Enum.with_index(data), {col, c} <- Enum.with_index(row) do
        {{r, c}, col}
      end
    end)
    |> Map.new()
  end
end

Setup

import Utils
input = Kino.Input.textarea("Input:")
text = Kino.Input.read(input)
data = String.to_integer(text)

P1

defmodule P do
  def solve(data, n) do
    Stream.iterate(Integer.digits(data), &run/1) |> Enum.at(n) |> length
  end

  def run(n) do
    n
    |> Enum.chunk_while(
      [],
      fn
        n, [] -> {:cont, [n]}
        n, [n | _] = ns -> {:cont, [n | ns]}
        m, ns -> {:cont, ns, [m]}
      end,
      fn acc -> {:cont, acc, []} end
    )
    |> Enum.flat_map(fn [n | _] = ns ->
      [length(ns), n]
    end)
  end
end

P.solve(data, 40)

P2

P.solve(data, 50)