🎅

Advent of Code 2024 4: Ceres Search

2024/12/21に公開

このページは

2024 年の Advent of Code の Day4 の記事です。 Day3 はこちら。

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

Day 4: Ceres Search

Day 4 は word search を行う問題で、入力としては "X", "M", "A", "S" の文字が二次元状に配置された文字列が与えられます。

Part1

Part1 では、与えられた文字列の中から "XMAS" という文字が縦横斜めにいくつ並んでいるかを数えるというもの。

順番に上から文字列を見ていって "X" が見つかったらそこから縦横斜めに進めて "XMAS" になっているかを確認すれば良さそうですね。

Python の場合だと、 for..else が使えるので、条件に合わないときは break してそれ以外の場合のみカウントを行うようにしました。

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

Rust 版は慣れてなくて長くなってしまっている気もするけどこんな感じに。

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

Part2

Part2 では、Part1 のように "XMAS" が並んでいるものではなく、

M.S
.A.
M.S

のように、A が中心になって文字列全体が X 状になっているパターンを探すという問題です。

これがなんだかややこしくて悩んだのですが、結局 A を中心にして各文字の位置を保存しておいて、同じ文字同士である必要がある index のペアを探して行くことにしました。

左上の文字から時計回りに 0, 1, 2, 3 という index を付けるとすると、

  • (0, 1) が同じ文字, (2, 3) が同じ文字
  • (0, 3) が同じ文字, (1, 2) が同じ文字

のどちらかのパターンになると考えられます。

まず中心となる "A" の文字を探していって、その周辺の文字が上記のいずれかのパターンになるかをチェックしました。M と S が反転しているパターンも探しています。

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

Rust 版の実装もほぼ変わらず

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

Day 5 に続きます。

https://zenn.dev/yasuharu519/articles/0c32f0eb2ffc98

Discussion