5
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 13 Part 1 を Livebook で楽しむ

Last updated at Posted at 2024-12-18

はじめに

Advent of code 2024 Day 13 の Part 1 を解きます

問題文はこちら

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

セットアップ

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

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

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

入力の取得

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

スクリーンショット 2024-12-18 16.44.58.png

私の答え

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

回答

入力例で考えます

sample_input =
  """
  Button A: X+94, Y+34
  Button B: X+22, Y+67
  Prize: X=8400, Y=5400
  
  Button A: X+26, Y+66
  Button B: X+67, Y+21
  Prize: X=12748, Y=12176
  
  Button A: X+17, Y+86
  Button B: X+84, Y+37
  Prize: X=7870, Y=6450
  
  Button A: X+69, Y+23
  Button B: X+27, Y+71
  Prize: X=18641, Y=10279
  """
  |> String.trim()

まずはクレーンゲーム機毎に A ボタン、 B ボタン、 プライズの情報を読み込みます

parse_machines = fn input ->
  input
  |> String.split("\n\n")
  |> Enum.map(fn machine_rows ->
    Regex.named_captures(
      ~r/\+(?<ax>\d+).*\+(?<ay>\d+)\n.*\+(?<bx>\d+).*\+(?<by>\d+)\n.*=(?<px>\d+).*=(?<py>\d+)/,
      machine_rows
    )
  end)
  |> Enum.map(fn %{"ax" => ax, "ay" => ay, "bx" => bx, "by" => by, "px" => px, "py" => py} ->
    %{
      a: %{x: String.to_integer(ax), y: String.to_integer(ay)},
      b: %{x: String.to_integer(bx), y: String.to_integer(by)},
      prize: %{x: String.to_integer(px), y: String.to_integer(py)}
    }
  end)
end
machines = parse_machines.(sample_input)

実行結果

[
  %{a: %{y: 34, x: 94}, b: %{y: 67, x: 22}, prize: %{y: 5400, x: 8400}},
  %{a: %{y: 66, x: 26}, b: %{y: 21, x: 67}, prize: %{y: 12176, x: 12748}},
  %{a: %{y: 86, x: 17}, b: %{y: 37, x: 84}, prize: %{y: 6450, x: 7870}},
  %{a: %{y: 23, x: 69}, b: %{y: 71, x: 27}, prize: %{y: 10279, x: 18641}}
]

A ボタンと B ボタンは最大でも 100 回しか押さないので、その範囲でプライズが取得できる組み合わせを探索します

get_prize = fn %{a: %{x: ax, y: ay}, b: %{x: bx, y: by}, prize: %{x: px, y: py}} ->
  for num_a <- 0..100,
      num_b <- 0..100,
      num_a * ax + num_b * bx == px,
      num_a * ay + num_b * by == py do
    {num_a, num_b}
  end
end

各クレーンゲーム機で探索した結果のコスト(A ボタンは 3 トークン、 B ボタンは 1 トークン)を合計します

get_cost = fn machines ->
  machines
  |> Enum.map(fn machine ->
    machine
    |> get_prize.()
    |> Enum.map(fn {num_a, num_b} ->
      num_a * 3 + num_b
    end)
    |> case do
      [] -> 0
      costs -> Enum.min(costs)
    end
  end)
  |> Enum.sum()
end
get_cost.(machines)

実行結果

480

実際の入力に対して実行します

puzzle_input
|> parse_machines.()
|> get_cost.()

まとめ

問題文から ChatGPT に画像を生成してもらいました

aoc2024_day13_1.png

Part 1 は素直に解けば良いだけでしたが、、、

Part 2 はこちら

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