はじめに
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 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
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 の階層を再帰的に探索する問題でした
パターンマッチでシンプルに実装できますね