Advent of CodeをAlteryxでやってみる2023_4日目

Advent of code

※過去記事はこちら。AlteryxユーザーのためのAdvent of Codeの始め方1日目2日目3日目

第四話 「Scratchcards」

タイトルは「スクラッチカード」。

第3話で無事にゴンドラに乗れたのですが、到着した先でなぜか大量のスクラッチカードをもらっています。そのスクラッチカードが今回のインプットです。以下のようになっています。

Card 1: 41 48 83 86 17 | 83 86  6 31 17  9 48 53
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
Card 3:  1 21 53 59 44 | 69 82 63 72 16 21 14  1
Card 4: 41 92 73 84 69 | 59 84 76 51 58  5 54 83
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11

カードの番号ごとに、パイプ(|)の左側は当選番号リスト、右側は自分が持っている番号です。

Part1では、各カードの当選した数を得る必要があります。一つ当たっていれば1ポイント、2つ目以降は持っているポイントが倍になります。つまり、カード1では、

当選番号: 41 48 83 86 17

持っている番号:83 86 6 31 17 9 48 53

赤の太字が当たっているものなので、1ポイントx2x2x2=8ポイントということになります。最終的には持っているカードのポイントの合計がパズルの答えです。

Part2は、そもそもポイントという概念が覆されてしまいます(ルールがカードの裏に書いてあったのを見落としていたようです)。

実際のルール(Part2のルール)は、当たり番号があった数の分、さらにスクラッチカードがもらえるようです。番号としては、次のカードからになるので、例えばカード1の場合4つ当たっているので、2~5の4枚が追加でもらえます。この新たにもらえたカードに対して、さらにそれぞれ当たり番号の分だけカードを貰うということになります。

最終的には、スクラッチカードの総数がパズルの答えです。まぁ、間違いなくPart2はマクロ問題です(ひょっとしたらマクロなしで解けるかもしれませんが)。

・ネ

・タ

・バ

・レ

Part1を解いてみる

Part1は、簡単に解くことができます。非常にベーシックな問題。基本的には当選番号と自分の番号を別々に列分割で行に分割して(こう書くといつも矛盾したことを書いている気にさせられます。列分割なのに行?)、結合ツールで結合することで、当選番号の数がわかります。このままだと扱いにくいので、集計ツールでカウントするまでがセットです。つまり、以下のようなデータをベースに進めていきます。

ここまで行けば、フォーミュラツールで以下のような計算式で各カードのポイントが計算できます。

POW(2, [Count]-1)

まぁ、ここまでは順調でしょう。

Part2を解いてみる

Part2はいろんな罠がありました・・・。私が経験したものも、そうでないものも。実はPart2はハマってしまって、その原因は、問題文の理解が曖昧なまま進めたことでしょうか。結局、1枚目から順にやっていけばそれほど問題はなかった、ということになります。雑にマクロに放り込んでいたので枚数が増えすぎてしまい、なんで???とサンプルデータで悩んでました。

つまり、最初のサンプルの例でいけば、

カード1を処理すると当選数が4なので、カード1と増えた分としてカード2~5が追加されます。

カード2はこの時点で2枚あります。これの当選数が2なので、カード2が2枚、カード3,4が2枚ずつになります。

これを繰り返すと、表としては以下のようになります(最初からこれ作ればよかった・・・)。

また、最初考慮できていなかったのが、当選数のないカード5,6の存在です。つまり当選数があるカード以外も考慮しなければなりません。

自分が作ったマクロは、オリジナルのカードを考慮しない形になっているので、あとから追加しています。また、途中混乱していたのですが、最終的には上のカードから処理するようなマクロになっています(別に上のカードから処理しなくてもいけるみたいなんですけどね、、、ロジックのひらめきが弱かったです・・・風邪引いてるからかなぁ・・・)。

高速化のために繰り返し出力側に集計ツールを入れています。これを入れることでレコード数が大幅に削減でき高速ができます(これにより1秒以内に処理が終わりますが、コミュニティなどを見ていると20分かかるとかPCが固まったとか色々な話があるようです)。これもAoCのテクニック?のひとつなので繰り返すデータはなるべく少なく、が鉄則です。

まとめ

  • Day4にしては高難易度でした・・・。データ量爆発の問題が出るとは思いませんでした。
  • そもそもいきなり繰り返しマクロの出番早くない?(去年もDay5で反復マクロ出てましたね・・・)
  • Part2は個人的にもう少しきれいに作りたかったです。
  • Part1はPrivate Leaderボードで1位の7分7秒。Part2はハマったので55分。最終的なランキングは、8位でした。
  • Private Leaderボード見ていると、最速で19分、時点で40分、50分って感じで何名かずつ固まっていました。

コメント

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