9
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 7を解いてみます。
できるだけGenerative AIsの力を使わずに解いてみます。

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

GitHub

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

参考記事

Advent of Code 2025 Day 7: Laboratories をRustで解いた

Day 7: Laboratories

問題文は、Day 7: Laboratoriesを読んでください。

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

Part 1

Part 1
  • 入力を行ごとにcharlistへ変換し、上から順に処理
  • Sの位置を見つけ、MapSetでビームの列位置を管理
  • 各行で、ビームがスプリッター^に当たったら左右に分岐(i-1とi+1)、元の位置は削除
  • MapSetなので同じ列に複数ビームが合流しても1本扱い
  • スプリットするたびにカウント+1、最終的なカウントが答え
defmodule AdventOfCode2025Day7Part1Solver do
  def solve(list_of_charlists) do
    list_of_charlists
    |> Enum.reduce({nil, 0}, &do_solve/2)
    |> elem(1)
  end

  def do_solve(charlist, {nil, 0}) do
    s_index = Enum.find_index(charlist, & &1 == ?S)
    {MapSet.new([s_index]), 0}
  end

  def do_solve(charlist, {map_set, count}) do
    Enum.reduce(map_set, {map_set, count}, fn i, {acc_map_set, acc_count} ->
      if Enum.at(charlist, i) == ?^ do
        new_map_set = acc_map_set |> MapSet.delete(i) |> MapSet.put(i - 1) |> MapSet.put(i + 1)
        {new_map_set, acc_count + 1}
      else
        {acc_map_set, acc_count}
      end
    end)
  end
end

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

  defp solve(list_of_charlists), do: AdventOfCode2025Day7Part1Solver.solve(list_of_charlists)

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

input = """
.......S.......
...............
.......^.......
...............
......^.^......
...............
.....^.^.^.....
...............
....^.^...^....
...............
...^.^...^.^...
...............
..^...^.....^..
...............
.^.^.^.^.^...^.
...............
"""

AdventOfCode2025Day7Part1.run(input)

Part 2

Part 2
  • Part 1と同様に上から順に処理するが、MapSetではなくMapで「列位置 => 経路数」を管理
  • スプリッター^に当たると世界が分岐し、左右それぞれに経路数を引き継ぐ
  • 同じ列に複数経路が合流したら経路数を加算(Map.update)
  • 最終行まで処理後、全列の経路数を合計したものが答え(= 粒子が取りうる全経路の数)
defmodule AdventOfCode2025Day7Part2Solver do
  def solve(list_of_charlists) do
    list_of_charlists
    |> Enum.reduce(nil, &do_solve/2)
    |> Map.values()
    |> Enum.sum()
  end

  def do_solve(charlist, nil) do
    s_index = Enum.find_index(charlist, & &1 == ?S)
    %{s_index => 1}
  end

  def do_solve(charlist, map) do
    Enum.reduce(map, map, fn {i, count}, acc ->
      if Enum.at(charlist, i) == ?^ do
        acc |> Map.delete(i) |> Map.update(i - 1, count, & &1 + count) |> Map.update(i + 1, count, & &1 + count)
      else
        acc
      end
    end)
  end
end

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

  defp solve(list_of_charlists), do: AdventOfCode2025Day7Part2Solver.solve(list_of_charlists)

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

input = """
.......S.......
...............
.......^.......
...............
......^.^......
...............
.....^.^.^.....
...............
....^.^...^....
...............
...^.^...^.^...
...............
..^...^.....^..
...............
.^.^.^.^.^...^.
...............
"""

AdventOfCode2025Day7Part2.run(input)

さいごに

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

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

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

9
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
9
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?