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

Advent of code

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

第七話 「Camel Cards」

タイトルは「ラクダカード」。単なる変形ポーカーでした。

ストーリーとしては、前回の後、飛行船に乗ることになり、砂漠に降ろされたようです。砂漠を移動するにはラクダに乗る必要があるようなのですが、時間がかかるのでラクダのカードゲームを教えてくれるとのことです。これはポーカーに似ていますが、ラクダに乗ったままでもできる、ということらしいです。

さて、ゲームのカードは、以下の種類があり、左から強い手になります。

A, K, Q, J, T, 9, 8, 7, 6, 5, 4, 3, 2

また、役としては、以下の通りで、上のカードの方が強い約です。

  • Five of a kind:5枚すべてが同じカードの場合。トランプは最高4枚しかありませんが、ラクダカードは5枚全部同じカードになることがあるようです。
  • Four of a kind:5枚中4枚同じカードの場合。
  • Full house:これもポーカーと同じで、3枚同じカード+2枚同じカードの組み合わせです。
  • Three of a kind:5枚中3枚同じカードの場合。
  • Two pair:5枚中2枚同じカードが2セットある場合。
  • One pair:5枚中2枚だけ同じカードの場合。
  • High card:すべて異なるカードの場合。

さて、今回の入力は、以下のような形になります。

32T3K 765
T55J5 684
KK677 28
KTJJT 220
QQQJA 483

空白を挟んで、左側が配られたカード(この手をハンドといっています)。右側が入札額です。それぞれのハンドは弱い順に順位をつけられ、順位×入札額を計算し、これらの合計がPart1のクイズの答えとなります。

なお、同じ役の場合、カードの一枚目から比較をしていき、強い方が勝ちになります。

例えば、T55J5(2行目)とQQQJA(5行目)はいずれも3カード(Three of a kind)ですが、最初のカードはTとQで、Qの方が強いカードのため、QQQJAの勝ちとなります。最初のカードで勝ち負けがつかなければ2枚目のカードで比較し、決着がつくまでカードの比較します。

Part2は、JがJokerということがわかりました。Jokerはカードの強さは最弱ですが、他のカードに成り代わることができます。つまり、手としては以下のような強さになります(左が強い)。

A, K, Q, T, 9, 8, 7, 6, 5, 4, 3, 2, J

それ以外はPart1と同じです。

・ネ

・タ

・バ

・レ

Part1,2を解いてみる

昨日に続き、それほど難易度は高くない問題です(とりあえず、インプットが複雑なやつはやばい、って感じでしょうか)。

2つの視点が必要です。インプットから役を判断すること。手の強い順に並べられるようにすること、です。手の強い順にするために、アルファベットに置き換えることにしました。つまり、以下のような対応表で置換します。

正直手入力でも全然いいと思います。が、あえてワークフローにしています。

あとは、役を作る必要があります。基本的に、カードの枚数がわかれば役がわかります。つまり、カードを1文字ずつばらばらにしてそれぞれのカードのカウントを取り、そのカウントの数をさらに取得すればオッケーです。

つまり、まずこの状態から。

cardの文字をばらばらにします(正規表現で「.」でトークナイズ)。

これで、まず各カードごとにカウントを取ります(cardでグルーピングとカウントを取ります)。

このままだと判断しにくいので、一旦カウント用にすべての値が1となるフィールドを追加したのち、クロスタブします。

あとは、役を確定させるために、フォーミュラツールで計算式を追加します。

例えば、5カードは[5]が1の場合です。4カードは、[4]が1の場合です。最終的には以下のような形になります(並べ替えの手間を考え、強い役ほど小さい数字にしています)

IF [5]=1 THEN 1
ELSEIF [4]=1 THEN 2
ELSEIF [3]=1 AND [2]=1 THEN 3
ELSEIF [3]=1 THEN 4
ELSEIF [2]=2 THEN 5
ELSEIF [2]=1 THEN 6
ELSE 7 ENDIF

あとは並べ替えて、レコードIDをつけて計算して終わりです。

Part2は、カードの強さが違うので、そこを変える必要があります。

その他として、Jokerをどう組み込むか、というところがポイントです。カードの枚数を数える前に、Jokerだけ取り除きましょう。その後、それぞれ枚数を出し、Jokerのカードを含めた判定を行います。

全パターンとしては、18パターンしかないので、一つずつ計算式を起こしても問題ないかと思います。例えば、4カードで、Jokerが1枚あれば、5カードとする、といった計算式になります。例えば以下のような計算式です。

IF [5]=1 OR [Joker]=5 THEN 1
ELSEIF [4]=1 AND [Joker]>=1 THEN 1
ELSEIF [4]=1 THEN 2
ELSEIF [3]=1 AND [Joker]=2 THEN 1 
ELSEIF [3]=1 AND [2]=1 AND IsNull([Joker]) THEN 3
ELSEIF [3]=1 AND [Joker]=2 THEN 1
ELSEIF [3]=1 AND [Joker]=1 THEN 2
ELSEIF [3]=1 THEN 4
ELSEIF [2]=2 AND [Joker]=1 THEN 3
ELSEIF [2]=2 THEN 5
ELSEIF [2]=1 AND [Joker]>=3 THEN 1
ELSEIF [2]=1 AND [Joker]=2 THEN 2
ELSEIF [2]=1 AND [Joker]=1 THEN 4
ELSEIF [2]=1 THEN 6
ELSEIF [1]>=1 AND [Joker]=4 THEN 1
ELSEIF [1]>=1 AND [Joker]=3 THEN 2
ELSEIF [1]>=1 AND [Joker]=2 THEN 4
ELSEIF [1]>=1 AND [Joker]=1 THEN 6
ELSEIF [1]>=1 THEN 7
ELSE 7 ENDIF

あとは、Part1と同じように答えを出していきます。

最終版は以下のような形になります。

なお、Designer Cloudでも同じ考え方で対応可能です。

気をつける点が1つだけあり、検索置換ツールの仕様が異なっており、順番は逆にしています。

まとめ

  • 難易度はむしろ去年より下がった感じがあります。とりあえずマクロも必要なく、それほどひねった感じはしませんでした。
  • ただ、まとまった集中できる時間が取れなかったので、Part2でハマってました・・・。集中力がないときにやると、余計なミスをうみますね・・・。
  • 早い人は30分くらいで解いてますね。今回はゆっくり解かざるを得なかったので、Part1で一時間かかってしまいました。まぁ、しょうがない。今回は20位です。総合では2位になってしまいました。

コメント

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