完)Advent of CodeをAlteryxでやってみた2023

Advent of code

2020年からこのシリーズに参加していますが、2020年は別のアカウントを使っていたので、★の数は残っていないのですが、一昨年は35個の星を獲得しました。昨年はコンプリート(★50個)、果たして今年は?というところで開始した2023年でした。

今年も拡張機能を使わなくてもクリアできた年となりました。

今年?学んだ?こと

  • やっぱり反復マクロ
  • 可視化は有効(XY座標でMAP化か、ネットワーク解析ツールでグラフ化)
  • マクロ外でしっかり型を確定させましょう(初期値がバイト型でスタートして、途中からNullで死亡とか・・・)
  • 初めてちゃんとダイクストラ法使った気がします
  • 空間処理が役に立ちました!(10、18)
  • ポリゴンの面積を出すには測量法で(英語だとShoelace formula
  • 複雑すぎる正規表現ダメゼッタイ(時間もかかるし正しい答えが出ない)
  • 正規表現関数より単純なリプレイス関数の方が高速
  • ソートツールでは辞書は使わない方が高速(特に日本語辞書を使うと20倍低速、英語辞書でも2倍遅い)
  • ウィークリーチャレンジ遊びで作ったLCMマクロが役に立った(今年2回も使いました。8と20)
  • データ量が多いときに去年使えた「レコード数のしばり」がうまく機能しませんでした。このせいで12、17のクリアに時間がかかりました・・・。とはいえ、枝刈りは有効。
  • 昔からプログラムやってる人はAoC対策で専用のライブラリを持っていたりするので、汎用的に使えるものは用意したほうがいいですね・・・。

ダイクストラ法は、すべてのノードデータを保持しておかないといけないので、繰り返しマクロが遅いAlteryxだとデータ量(ノード数)が多いと厳しいですね・・・。他にもA*アルゴリズムというのがあるので、これも試してみたいところです。

高難易度問題の解き方

やばい回数の繰り返し(1億回)とか同時に起こるのは何回目か?系は、結果からパターンを発見して再計算するか、LCMで解けるケースが多いので、ブルートフォースで無理やりせずにパターンを見つけましょう(もしくは結果のLCMを取る)。力技では解けません(太陽滅亡まで生きていられるのなら・・・)。

どうしてもロジックをがんばるしかない問題もあります。去年は13、今年は12、20あたりが高難易度のロジックの作成が必要でした。

ロジックをどうにかしないといけない問題は難しいですが、パターン発見系はRedditのメガスレッドが大きな助けになります。

データ量の多い時に使える細かいチューニングテクニック

  • 移動履歴(History)を持っていて、移動距離を求めたいとします。例えば、1-1,1-2,1-3であれば3歩です。これをREGEX_COUNTMATCH(History, “-“)で行うこともできますし、LENGTH(REPLACECHAR(Hostory,”0123456789,”,””))と書くこともできます。この場合は後者の方が高速です。単純なことは単純な関数で行いましょう。正規表現は高度なことができる分、オーバーヘッドが大きいようです。
  • ソートツールは、辞書ベースのソートができます。しかし、不要ならこの機能は切っておきましょう。特に日本語辞書(Japanese(Japan)(Phonetic))は辞書なしに比べて20倍以上遅いです。例として、辞書なしなら13,414.75ミリ秒で終わる処理が、英語辞書で28,062.75ミリ秒、日本語辞書に至っては231,710.72ミリ秒かかりました。

まとめ

今年の苦労問題は、12、17、20、24でした。12は正規表現の罠にハマりました。シンプルな正規表現でいきましょう(複雑すぎると答えが出ない)。17はそもそも最後まで通して動かすのにも時間がかかりましたし、細かいバグを連発していたのに気がつくのが遅かったのが今回苦戦した理由です。

今回の戦績です。

Part2含めてPrivate Leaderboardでトップは取れませんでした。今年は強力な方々が多かったです。1/3時点で7名が完走しています。全体的に、去年に比べると明らかに星の数が多いです(そして、去年お見かけしていないお名前もいくつも見かけます)。

また来年!

コメント

タイトルとURLをコピーしました