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

ElixirAdvent Calendar 2024

Day 3

Advent of code 2024 Day 3 Part 1 & Part 2 を Livebook で楽しむ

Last updated at Posted at 2024-12-03

はじめに

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 の入力を取得します

スクリーンショット 2024-12-03 15.42.32.png

私の答え

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

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 に画像を生成してもらいました

aoc2024_day3.jpeg

Day 3 はほぼ正規表現の問題でした

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