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

Day 5「Cafeteria」
タイトルは「食堂」。
Day4で壁を突き破ってとうとうカフェテリアに到達しました。なぜか在庫管理システムが一新され、食堂で調理をするにあたり、どの食材が新鮮で、新鮮じゃないのか、というのがわからなくなっているようです(繁忙期にシステム一新するなよ・・・)。
以下のようなインプットです。
3-5
10-14
16-20
12-18
1
5
8
11
17
32
空白行を境に、上は新鮮な原材料のIDリストです。ハイフンで繋がれた数字の間はすべて新鮮です。3-5なら、3、4、5はすべて新鮮です。
下半分は食材のIDリストです。
ところで、新鮮な原材料のIDリストですが、、、、
3-5
10-14
16-20
12-18
よく見ると、一部重複していることを覚えておいてください。
Part1では、新鮮な食材が何個あるかをカウントします。つまり、新鮮なIDリストの範囲内のものがいくつあるか、をカウントします。
Part2は上半分のみ使います。新鮮な食材がいくつあるのか、原材料IDの数をカウントします。つまり重複しているIDがあれば、それらは重複してカウントしなくて良い、ということです。
・ネ
・
・タ
・
・バ
・
・レ
Part1、2を解いてみる
Part1は2025年のAoCで最も簡単なものの一つかもしれません。新鮮なIDは、列分割ツールで分割し、行生成ツールで全数値を作成し、原材料リストとマッチングする、、、とテストデータはうまくいきます。これを本番データでやると・・・終わりません。
本番データを見てみると、、、「540454167785597-540711647857062」という感じでばかでかい数値になっています。差分を取ると、257480071465とかになるので、2500万とかですね・・・行数的にやばい行数になるので、さていったいどれくらい時間がかかるのか、という状態です。
ここは素直にフィールド付加ツールで各範囲とIDの全パターンを検査するしかありません。ただ、そんなに難しい話でもないかと思います。
ということで、本番データをよく見てからやらないと無駄な作業をさせられることになるので気をつけましょう。
Part2ですが、重複をうまく除去していく必要があります。
コミュニティを見直すとみなさんシンプルな方法でやっていたので、たぶん自分の方法はややこしくやっていると思いますが、基本的に反復マクロで処理をしています。
つまり、まず、範囲同士の全パターンを作成します(たとえば、1-2、3-6、4-6とあれば、1-2と3-6、3-6と4-6、1-2と4-6の組み合わせができます)。この範囲同士が被っていれば左側の数値を範囲1,2の最小値、右側の数値を範囲1,2の最大値にします。
これを被るものがなくなるまで反復的に実施します。
実際の実装方法としてはデータの持ち方、作り方、処理の仕方で細部は異なるかと思います。


コミュニティの主流は複数行フォーミュラのみで実行するパターンです。
ちょっと追加でやってみました。まず、ソートし重複も取り除きましょう。その後、大きい方の数と次のレコードの小さい方を比較し、次のレコードの小さい数を超えていたら、次のレコードの小さい数を前のレコードの大きい方の数+1と置き換えます。大きい方マイナス小さい方でマイナスの数は捨てて合計すれば完了です。
細かいところがあわず悩みましたが、こういうロジックでできるようです。

まとめ
- 過去も今回みたいな場合分けでやってたのでマクロなしのパターンは思いつきませんでした。まぁ、場合分けの方はロジック的にヌケモレが出るわけではないので安心って感じです。
- ただ、場合分けは時間がかかるのがポイントです。反復マクロにせざるを得ないので、その分時間がかかっている、というのもあります。
- これも過去似たようなことをしたことあるので、今年はそういう年なのでしょうか?
- 初日あたりが難しいのに比べると、難易度が落ち着いた感じはありますが、25日換算だともう10日レベルなので難しいのがそろそろ来そうに思います。

コメント