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

Advent of code 2015 Day 3 Part 2 を Livebook で楽しむ

Last updated at Posted at 2024-11-19

はじめに

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

スクリーンショット 2024-11-19 18.08.41.png

私の答え

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

回答

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

robo_santa.jpeg

サンタとロボサンタを行ったり来たりするので少し複雑になりましたが、まだ素直に書けば通りますね

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