はじめに
Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます
本記事では Day 3 の Part 2 を解きます
問題文はこちら
実装したノートブックはこちら
Part 1 はこちら
セットアップ
Kino AOC をインストールします
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Kino AOC の使い方はこちらを参照
入力の取得
"Advent of Code Helper" スマートセルを追加し、 Day 3 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
回答
Enum.reduce
で以下のものを保持しながら進めます
- 移動するのがサンタ(
0
)かロボサンタ(1
)か:s
- サンタの現在地の座標:
{sx, sy}
- ロボサンタの現在地の座標:
{rx, ry}
- 通過した場所の座標配列:
houses
s
をトグルしながらサンタとロボサンタの座標を更新しつつ、通過した座標を記録して行きます
最後に houses
の重複を排除して個数を算出します
puzzle_input
|> String.codepoints()
|> Enum.reduce({{0, {0, 0}, {0, 0}}, [{0, 0}]}, fn direction, {{s, {sx, sy}, {rx, ry}}, houses} ->
{x, y} = if s == 0, do: {sx, sy}, else: {rx, ry}
new_point =
case direction do
">" -> {x + 1, y}
"<" -> {x - 1, y}
"^" -> {x, y + 1}
_ -> {x, y - 1}
end
new_sr =
if s == 0 do
{1, new_point, {rx, ry}}
else
{0, {sx, sy}, new_point}
end
{new_sr, [new_point | houses]}
end)
|> elem(1)
|> Enum.uniq()
|> length()
まとめ
問題文から ChatGPT に画像を生成してもらいました
サンタとロボサンタを行ったり来たりするので少し複雑になりましたが、まだ素直に書けば通りますね