3
1

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 2015 Day 12 Part 1 & Part 2 を Livebook で楽しむ

Last updated at Posted at 2024-11-25

はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 12 の Part 1 と Part 2 を解きます

問題文はこちら

実装したノートブックはこちら

セットアップ

Kino AOC をインストールします

Mix.install([
  {:kino_aoc, "~> 0.1"}
])

Kino AOC の使い方はこちらを参照

入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 12 の入力を取得します

スクリーンショット 2024-11-25 21.34.01.png

私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

Part 1

回答

Jason.decode! で JSON 文字列を Map と List の構造に変換できます

Map と List の改造構造を再帰的に探索し、整数なら合計していくモジュールを定義し亜mす

defmodule SumIntegers do
  def sum_integers(data) when is_integer(data), do: data

  def sum_integers(data) when is_map(data) do
    data
    |> Map.values()
    |> Enum.map(&sum_integers/1)
    |> Enum.sum()
  end

  def sum_integers(data) when is_list(data) do
    data
    |> Enum.map(&sum_integers/1)
    |> Enum.sum()
  end

  def sum_integers(_data), do: 0
end
puzzle_input
|> String.split("\n")
|> Enum.map(fn row -> Jason.decode!(row) end)
|> SumIntegers.sum_integers()

Part 2

回答

階層が Map で値に "red" を含む場合、合計を 0 にします

defmodule SumIntegers do
  def sum_integers(data) when is_integer(data), do: data

  def sum_integers(data) when is_map(data) do
    values = Map.values(data)

    if Enum.find(values, fn value -> value == "red" end) do
      0
    else
      values
      |> Enum.map(&sum_integers/1)
      |> Enum.sum()
    end
  end

  def sum_integers(data) when is_list(data) do
    data
    |> Enum.map(&sum_integers/1)
    |> Enum.sum()
  end

  def sum_integers(_data), do: 0
end
puzzle_input
|> String.split("\n")
|> Enum.map(fn row -> Jason.decode!(row) end)
|> SumIntegers.sum_integers()

まとめ

Map と List の階層を再帰的に探索する問題でした

パターンマッチでシンプルに実装できますね

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?