※過去記事はこちら。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位になってしまいました。
コメント