Advent of Codeをデータ分析ツールAlteryxでやってみるシリーズ、2025年2日目です。
※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方、1日目。

Day 2「Gift Shop」
タイトルは「お土産屋さん」。
1日目で中に入れたエルフたちは、おみやげ屋さんに到着したらしいのですが、どうやら無効な商品IDを持つデータを大量に追加してしまったらしく(なんてことを!)、それを見つけるのが今回のストーリーです。
インプットは以下のようなデータです。カンマ区切りで各レコードは区切られていますが、2つの数字がハイフンで繋がっており、これは2つの数字の間の数を検査しろ、ということです。
11-22,95-115,998-1012,1188511880-1188511890,222220-222224,
1698522-1698528,446443-446449,38593856-38593862,565653-565659,
824824821-824824827,2121212118-2121212124
不正なIDは、Part1では、ある数字の並びを二回繰り返したものらしいです。Part2は、ある数字の並びを何回か繰り返しているものです。
例えば、11や22は不正なID。1010や123123も同様です。Part2では、121212などは12を3回繰り返しているということで不正なIDとなります。
最終的には、不正なIDを発見し合計したものがパズルの答えです。
・ネ
・
・タ
・
・バ
・
・レ
Part1、2を解いてみる
なんだかオリジナルの問題文は難しいのですが、整理すると非常に簡単に思えてきますね・・・。
なんとなく正規表現を使えばできそうな雰囲気もありますが、よく理解していないと難しそうに思います。実際のところは、知っていれば秒殺できてしまう問題でした。私はこの正規表現がわからなかったので、地道に解きました。
Part1は、数値を半分に割って左半分、右半分が同じであればオッケーという感じで比較的単純な式で完了です。
Left([number_str],Length([number_str])/2)=Right([number_str],Length([number_str])/2)
AND MOD(Length([number_str]),2)=0
MOD=0としているのは、数値の長さが偶数の時のみなので、その判定用です。
Part2は、いろんな方法があると思いますが、今回は以下のような方法を取りました。
- それぞれ対象の数値に対して、数値の桁数に対して桁数÷2までの数字を1から作成する(何文字のマッチングを行うか)
- 1のうち、桁数に対して割り切れるもののみ残す
- 数値の桁数に対して、桁数÷(1で作成した数値)まで、1からさらに作成する(例えば、桁数が4なら、1,2をそれぞれの数値に対して作成する)
- 1と3を使って文字を切り出す
- 切り出した文字が各パターンに対して何個同じものがあるかカウントを取る
- 5のカウント×(3で作った数値)が数値の桁数と一致するものが正解
という手順で欲しい数値が抽出されます。ユニークを取って合計を取れば完了です。
ワークフローは以下のとおりです。

ちなみに、正規表現の場合、以下の正規表現でPart1はクリアです。
(\d+)\1
これは数値をキャプチャし、キャプチャしたあとに残った数値がキャプチャしたものと同じである、というパターンです。
Part2の正規表現が難関!かと思いきや、知っていれば以下のとおりです。
(\d+)\1+
Part1が複数回繰り返しできるものが欲しい、ということですよね?

まとめ
- 正規表現ルートをあっさりあきらめたので、結果的に構築に時間がかかりました・・・。
- 正規表現ルートにいくと、Geminiに聞くしかなさそうだったので自重したというのもあります・・・。
- 急がば回れ
- Part1はあっさり終わったんですが、またもやPart2はハマり気味でした・・・。
- とはいえ、これくらいの難易度ならまぁ頭の数日としては受け入れられる感じです・・・。

コメント