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

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

GitHub

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

参考記事

Advent of Code Day 2: Gift Shop をRustで解いた

Day 2: Gift Shop

問題文は、Day 2: Gift Shopを読んでください。
数字の範囲インプットが渡されて、数字が繰り返しでていると不正IDとみなし、不正IDを検出して全部を足すという問題です。
Part 1は、半分で割ったところの前後で一致するかどうか。
Part 2は、Part 1のルールに加えて、999や565656などもあわせて検出してほしいという問題です。

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

Part 1

Part 1
defmodule AwesomeInvalidIDCheckerPart1 do
  def run(number) do
    charlist = number
    |> Integer.to_string() 
    |> String.to_charlist()

    maybe_invalid = charlist
    |> Enum.frequencies
    |> Enum.all?(fn {_, cnt} -> rem(cnt, 2) == 0 end)

    if maybe_invalid do
      len = Enum.count(charlist)
      head = charlist |> Enum.slice(0..(div(len, 2) - 1))
      tail = charlist |> Enum.slice(div(len, 2)..(len - 1))
      head == tail
    else
      false
    end
  end
end

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

  defp solve(list_of_ranges) do
    list_of_ranges
    |> Enum.reduce(0, fn range, acc ->
      range
      |> Enum.reduce(acc, fn number, acc ->
        fun(AwesomeInvalidIDCheckerPart1.run(number), number, acc)
      end)
    end)
  end

  defp fun(true, number, acc), do: number + acc
  defp fun(false, _number, acc), do: acc

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

  defp parse(range) do
    %{"first" => first, "last" => last} = Regex.named_captures(~r/(?<first>\d+)-(?<last>\d+)/, range)
    Range.new(String.to_integer(first), String.to_integer(last))
  end
end

input = """
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
"""

AdventOfCode2025Day2Part1.run(input)

Part 2

Part 2
defmodule AwesomeInvalidIDCheckerPart2 do
  def run(number) do
    charlist = number
    |> Integer.to_string() 
    |> String.to_charlist()

    if Enum.count(charlist) > 1 do
      1..div(Enum.count(charlist), 2)
      |> Enum.any?(fn count ->
        [head | tail] = Enum.chunk_every(charlist, count)
        Enum.all?(tail, & &1 == head)
      end)
    else
      false
    end
  end
end

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

  defp solve(list_of_ranges) do
    list_of_ranges
    |> Enum.reduce(0, fn range, acc ->
      range
      |> Enum.reduce(acc, fn number, acc ->
        fun(AwesomeInvalidIDCheckerPart2.run(number), number, acc)
      end)
    end)
  end

  defp fun(true, number, acc), do: number + acc
  defp fun(false, _number, acc), do: acc

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

  defp parse(range) do
    %{"first" => first, "last" => last} = Regex.named_captures(~r/(?<first>\d+)-(?<last>\d+)/, range)
    Range.new(String.to_integer(first), String.to_integer(last))
  end
end

input = """
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124
"""

AdventOfCode2025Day2Part2.run(input)

さいごに

今回は自力で全部解けました。力技で解けました。Part 2は本番データで誤答をだしました。以下の警告をヒントに、「あーね」と自力で修正ができました。よかった :tada:

warning: Range.new/2 and first..last default to a step of -1 when last < first. Use Range.new(first, last, -1) or first..last//-1, or pass 1 if that was your intention

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

Advent of Code 2025を解くことは、闘魂活動だと思います。

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