はじめに
Advent of code 2024 Day 13 の Part 1 を解きます
問題文はこちら
実装したノートブックはこちら
セットアップ
Kino AOC をインストールします
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Kino AOC の使い方はこちらを参照
入力の取得
"Advent of Code Helper" スマートセルを追加し、 Day 13 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
回答
入力例で考えます
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 に画像を生成してもらいました
Part 1 は素直に解けば良いだけでしたが、、、
Part 2 はこちら