🎅

Advent of Code 2024 Day 2: Red-Nosed Reports

2024/12/17に公開

このページは

2024 年の Advent of Code の Day2 の記事です。 Day1 はこちら。

https://zenn.dev/yasuharu519/articles/bb6f740564e282

Day 2: Red-Nosed Reports

今回は以下のような数列が与えられたときに条件を満たすものかチェックを行い、条件を満たす数列がいくつあるかを求めるというもの。

7 6 4 2 1

Part1

カウントする条件としては

  • 数列が単調に増えるもしくは減るようになっている
    • 同じ値が続くのは許容されないので、狭義単調増加数列もしくは狭義単調減少数列であるかどうか
  • 数列の項の差の絶対値が 1 から 3 の間であるかどうか

を満たすものを数える。

Python ではこのような感じでジェネレータに対して all() を使ってカウントすれば良さそう。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day2/part1.py

Rust で上記のように 項の差をとる方法がわからなかったが、どうやら windows() という関数がスライスや Vec に対して実装されているようで、これを使えば実装できることがわかった。
例えば windows(2) とするとすべての項のペアを取得することができ、最後の一つ前の項と最後の項のペアを取得したところで終了し、 OutOfBounds にもならない。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/rust/src/bin/2-1.rs

Part2

Part2 では Part1 のファイルはそのままで、条件が一つだけ追加される。間違いのある項を 1 つだけ許容するというもので、その場合はそれ以外の項を残して Part1 と同じようにチェックを行う。

Python の場合は、あるインデックスをスキップしたリストを l[:i] + l[i+1:] のように作成してチェックを行った。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/python/day2/part2.py

Rust の場合も処理の内容は同じ。配列のあるインデックスをスキップした配列を作成するには、 l[..i].iter().chain(l[i+1..].iter()) のように chain() 関数を使えばいいらしい。

https://github.com/yasuharu519/advent-of-code-2024/blob/main/rust/src/bin/2-2.rs

Day 3 に続きます。

https://zenn.dev/yasuharu519/articles/f6102eedfce78c

Discussion