4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Advent of Code 2025 Day 3を解いてみます。
できるだけGenerative AIsの力を使わずに解いてみます。

今年はDay 12までなのかな? あとで増えるのかな。

GitHub

Livebookのnotebook集を公開しておきます。
livebooks

参考記事

Advent of Code 2025 Day 3: Lobby をRustで解いた

Day 3: Lobby

問題文は、Day 3: Lobbyを読んでください。
Part 1を汎用的につくれば、Part 2も解ける形です。私にとっては解きやすかったです。これまでのところDay 1が一番苦戦しました。個人の感想です。

私の解答は折りたたんでおきます。

Part 1

Part 1

各行の数字列から「2桁の数」を作ります。ルールは:

  • 十の位: 最後の1文字を除いた範囲から最大値を選ぶ
  • 一の位: 十の位で選んだ位置より右側から最大値を選ぶ

全行の合計が答えです。

defmodule AdventOfCode2025Day3Part1Solver do
  def run(list_of_lists) do
    list_of_lists
    |> Enum.reduce(0, fn list, acc ->
      upper = Enum.slice(list, 0..-2//1) |> Enum.max()
      uppser_index = Enum.find_index(list, & &1 == upper)
      lower = Enum.slice(list, (uppser_index + 1)..-1//1) |> Enum.max()

      acc + upper * 10 + lower
    end)
  end
end

defmodule AdventOfCode2025Day3Part1 do
  def run(input) do
    input
    |> parse_input()
    |> solve()
  end

  defp solve(list_of_lists) do
    AdventOfCode2025Day3Part1Solver.run(list_of_lists)
  end

  defp parse_input(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&parse/1)
  end

  defp parse(line) do
    line
    |> String.to_charlist()
    |> Enum.map(& &1 - ?0)
  end
end

input = """
987654321111111
811111111111119
234234234234278
818181911112111
"""

AdventOfCode2025Day3Part1.run(input)

Part 2

Part 2

各行の数字列から「12桁の数」を作ります。ルールは:

  • 最上位桁: 最後の11文字を除いた範囲から最大値を選ぶ
  • 次の桁: 前の桁で選んだ位置より右側(かつ残り桁数分を確保)から最大値を選ぶ
  • これを12回繰り返す

全行の合計が答えです。

Part 1の2桁版を12桁に拡張した問題。12..1//-1 で桁数をカウントダウンしながら、各桁の最大値とそのインデックスを追跡しています。

defmodule AdventOfCode2025Day3Part2Solver do
  def run(list_of_lists) do
    list_of_lists
    |> Enum.reduce(0, fn list, acc ->
      12..1//-1
      |> Enum.reduce({0, -1}, 
        fn i, {acc, index} ->
          {max, new_index} = Enum.slice(list, (index + 1)..-i//1) |> find_max()
          {(10 ** (i - 1)) * max + acc, new_index + index + 1} 
      end)
      |> elem(0)
      |> Kernel.+(acc)
    end)
    
  end

  defp find_max(list) do
    max = Enum.max(list)
    index = Enum.find_index(list, & &1 == max)
    {max, index}
  end
end

defmodule AdventOfCode2025Day3Part2 do
  def run(input) do
    input
    |> parse_input()
    |> solve()
  end

  defp solve(list_of_lists) do
    AdventOfCode2025Day3Part2Solver.run(list_of_lists)
  end

  defp parse_input(input) do
    input
    |> String.split("\n", trim: true)
    |> Enum.map(&parse/1)
  end

  defp parse(line) do
    line
    |> String.to_charlist()
    |> Enum.map(& &1 - ?0)
  end
end

input = """
987654321111111
811111111111119
234234234234278
818181911112111
"""

AdventOfCode2025Day3Part2.run(input)

さいごに

今回は自力で全部解けました。力技で解けました。よかった :tada:

どこまでできるかわかりませんが、たまには自分で書くこともしたほうがよさそうなので、Advent of Code 2025を引き続き解いて行くことを楽しみたいと思います。

Advent of Code 2025を解くことは、闘魂活動だと思います。
あなたもぜひお好きなプログラミング言語で解いてみてください!

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?