はじめに
Advent of code 2024 Day 3 の Part 1 と Part 2 を解きます
問題文はこちら
実装したノートブックはこちら
セットアップ
Kino AOC をインストールします
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Kino AOC の使い方はこちらを参照
入力の取得
"Advent of Code Helper" スマートセルを追加し、 Day 3 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
Part 1
回答
問題文にある命令は mul\(\d+,\d+\)
という正規表現で取得可能です
Regex.scan
で該当箇所を全て取得し、数値に変換して掛け合わせ、合計します
Regex.scan(~r/mul\(\d+,\d+\)/, puzzle_input)
|> Enum.map(fn [mul] ->
Regex.scan(~r/\d+/, mul)
|> Enum.map(fn [str] ->
String.to_integer(str)
end)
|> Enum.product()
end)
|> Enum.sum()
Part 2
回答
正規表現 mul\(\d+,\d+\)|do[n't]*\(\)
で掛け算の命令または do()
または don't()
の箇所を取得します
Enum.reduce
で順番に処理していく際、現在が掛け算すべきなのかどうかをフラグとして管理します
Regex.scan(~r/mul\(\d+,\d+\)|do[n't]*\(\)/, puzzle_input)
|> Enum.reduce({true, 0}, fn [instruction], {do_flag, acc} ->
case {do_flag, instruction} do
{_, "do()"} -> {true, acc}
{_, "don't()"} -> {false, acc}
{true, mul} ->
product =
Regex.scan(~r/\d+/, mul)
|> Enum.map(fn [str] ->
String.to_integer(str)
end)
|> Enum.product()
{true, acc + product}
_ ->
{do_flag, acc}
end
end)
|> elem(1)
まとめ
問題文から ChatGPT に画像を生成してもらいました
Day 3 はほぼ正規表現の問題でした