※過去記事はこちら。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分って感じで何名かずつ固まっていました。
コメント