ASCIIポーカーチップスタックアレンジメントを作成する


20

ポーカーには、多くの場合トーナメントで強制される、チップの配置方法に関するエチケットがあります-チップは、主にいくつかの大きな金種のチップを隠さないために、他者の後ろにいることによって対戦相手から「隠されない」ことがあります。


チャレンジ

ASCIIでポーカーをプレイするので、合計値を考慮してASCIIチップスタック配置を描画する関数またはプログラムを作成する必要があります。 n

入力
-正の整数n(最大2**32-1処理必要があります)

出力
-以下に定義されているスタック配置のASCII表現。
これには、各行の右側に空白が含まれている可能性があるため、最長(下)行の印刷可能文字が使用する長さよりも1文字長い行はありません。
これには、単一の末尾の改行が含まれる場合があります。そして
あなたが好む場合はチップを表す文字は小文字であってもよいです。

スタックの配置は次のとおりです。

  • 宗派を考慮して、可能な限り少ないチップを含む(以下を参照)。
  • 「スタック」(列)に等しい価値のあるチップがあります。
  • 短いスタックが高いスタックの右側になるように注文してください。そして
  • より大きな金種チップを持つスタックが、より小さな金種の同じサイズのスタックの右側になるように注文します(右側の敵に見えることを表します)

チップ自体は、色を識別する個々の文字として表されます。

    White : 1    = W
      Red : 5    = R
    Green : 25   = G
    Black : 100  = B
   Yellow : 500  = Y
     Pink : 1K   = P
   Orange : 5K   = O
     Cyan : 25K  = C
  Magenta : 100K = M
Aqua-blue : 500K = A
 Lavender : 1M   = L
   Indigo : 5M   = I
Turquoise : 25M  = T
   Violet : 100M = V
   Silver : 500M = S

n = 276,352チップの最小数は次のようになります。

2 * 100K + 3 * 25K + 1 * 1K + 3 * 100 + 2 * 25 + 2 * 1
    MM         CCC       P        BBB       GG       WW

シングルPは右端に移動し、
次にサイズの3つのスタックが2次に移動
するMM必要があります-しかし、最も右に移動し、GGその後に続いてWW100K > 25 > 1 その後サイズの2つのスタックが3左に移動
するCCC必要がありますが、BBB以来の右側に行く25K > 100

次に、これらのチップを実際のスタックに配置して、出力を作成する必要があります。

BC
BCWGM
BCWGMP

テストケース

Input:
1

Output:
W


Input:
9378278

Output:
L
LWGPCM
LWGPCMB
LWGPCMBI


Input:
22222222

Output:
ROI
ROI
ROIWBPML
ROIWBPML


Input:
1342185143

Output:
WRCIV
WRCIVOLS
WRCIVOLSGBMT


Input:
2147483647

Output:
RMIS
RMISPC
RMISPCWL
RMISPCWLGBYOTV


Input:
4294967295

Output:
S
S
S
S
SRML
SRMLGOIT
SRMLGOITBPCV
SRMLGOITBPCVA

これはであるため、バイト単位の最短コードが優先されます。抜け穴はありません、矢田矢田、あなたはドリルを知っています。


うわー、これは面白そうだ、家に帰ったらジュリアの答えを試すかもしれない。
魔法のタコUr

という意味ですか、それとも2**31-1ほとんどの署名されたintタイプよりも大きくするつもりですか?
ライナス

@Linusうーん、私はそれを無署名にしました。実際に、サンドボックスで入力範囲に問題がないかどうかを具体的に尋ねたところ、誰も応答しませんでした。ご覧のとおり2**32-1、テストケースですが、これを引き下げても構いません。(興味深い事実:PokerStarsの25B画像フォルダーにはチップがあります。)
ジョナサンアラン

回答:


5

Pyth、56 55 52バイト

コードには印刷できないものが含まれているため、ここにリバーシブルのxxd16進ダンプがあります。

00000000: 3d48 516a 5f2e 745f 2023 6c44 2a56 2e22  =HQj_.t_ #lD*V."
00000010: 4159 261c 0c24 2087 0c86 1e22 6d68 412e  AY&..$ ...."mhA.
00000020: 4448 645f 2e75 2a4e 5950 2a33 6a37 3733  DHd_.u*NYP*3j773
00000030: 3620 362f                                6 6/

オンラインでお試しください。 テストスイート。

プロのヒント:で 1ゼロ以外の数値を受け入れるプログラムの最後にゴルフをQ追加するだけ/です。/QQ(Pythonの場合Q // Q)は、ゼロ以外の場合は1ですQ

圧縮および印刷不能(55バイト)なし:

=HQj_.t_ #lD*V"SVTILAMCOPYBGRW"mhA.DHd_.u*NYP*3j7736 6/

6

JavaScript(ES6)、185 177 ... 171バイト

f=(a,s='')=>(a=(a[0]?a:[...(m='25455')+m+m].map((m,i)=>(a-=(k=a/(v/=m)|0)*v,k*16+i),v=1E9).sort((a,b)=>b-a)).map(n=>n>15&&(s+='SVTILAMCOPYBGRW'[n&15],n-16)),s&&f(a)+`
`+s)

書式設定およびコメント化

(a, s = '') => (                           // a = bankroll OR array of chip stacks
  a = (                                    // s = string of chip initials for this iteration
    a[0] ?                                 // if 'a' already is an array:
      a                                    // use it as-is
    :                                      // else, 'a' is the bankroll:
      [...(m = '25455') + m + m]           // for each 'm' in [ 2, 5, 4, 5, 5, ... ] (x3)
      .map((m, i) =>                       // v = current chip value = previous value / m
        (                                  // k = floor(a / v) = number of these chips
          a -= (k = a / (v /= m) | 0) * v, // update remaining bankroll: a = a - k * v
          k * 16 + i                       // saved in array: chip index in bits 0-3
        ),                                 // and number of chips in bits 4+
        v = 1E9                            // initial chip value = 1 billion
      )                                    // (1B / 2 -> 500M, 500M / 5 -> 100M, etc.)
      .sort((a, b) => b - a)               // sort the chip stacks
  )                                        //
  .map(n =>                                // for each chip stack:
    n > 15 &&                              // if there's at least one remaining chip of
    (                                      // this kind:
      s += 'SVTILAMCOPYBGRW'[n & 15],      // append its initial to the string
      n - 16                               // decrement the number of chips in this stack
    )                                      //
  ),                                       // process recursive call if there was at least
  s && f(a) + '\n' + s                     // one non-empty chip stack (the next lines are
)                                          // appended at the beginning of the final string)

デモ

let f=(a,s='')=>(a=(a[0]?a:[...(m='25455')+m+m].map((m,i)=>(a-=(k=a/(v/=m)|0)*v,k*16+i),v=1E9).sort((a,b)=>b-a)).map(n=>n>15&&(s+='SVTILAMCOPYBGRW'[n&15],n-16)),s&&f(a)+`
`+s)

function update() {
  document.getElementById('o').innerHTML = f(+document.getElementById('i').value);
}
update();
<input id="i" value="1342185143" oninput="update()"><pre id="o"></pre>


5

ルビー、 181 177バイト

->n{*a=5*10**8
14.times{|i|a<<a[-1]/[5,4,5,5,2][i%5]}
a=a.zip("SVTILAMCOPYBGRW".chars).map{|v,c|[-(n/v),v,c,n%=v]}.sort
l=-a[0][0]
(1..l).map{|i|a.map{|d|l-i<-d[0]?d[2]:""}*""}}

Ideoneでのテスト


4

Python 2.7、282 248 238バイト

c=input();L=[]
for i in range(15):m=[5,1,25,5,1][i%5]*10**int("886665533322000"[i]);L+=[[c/m,i,"SVTILAMCOPYBGRW"[i]]];c%=m
L.sort();S=[]
while L[~1][0]:
 s=""
 for X in L[::-1]:
  if X[0]>0:X[0]-=1;s+=X[2]
 S+=[s]
for s in S[::-1]:print s

説明:各タイプのチップの数量を示す要素で
リストLを埋めます[quanity, chip_order, chip_character]。ここでchip_order、等しい数量のチップが逆の順序でソートされるようにします(値の大きいチップが最初に)。チップをL逆に取り、各行の文字列を作成します。行を逆に印刷して、一番上の行を表示します。

いくつかの改善をしてくれたBlueに感謝します。


素晴らしい答えです!しかし、もっとゴルフをするためにできることがいくつかあります。まず、複数のステートメントをセミコロンで区切って1行に配置できます(ただし、後にインデントが必要なステートメントは使用できません)。次に、変数を1回だけ使用する場合(最初のforループでX、Y、Sなど)、未加工の値を使用してバイトを節約できます。その他のヒントについては、codegolf.stackexchange.com / questions / 54 /…をご覧ください
Blue

また、定期的にinput変換すること、O / Wあなたの整数を取得します、とX[0]>0に短縮することができますX[0]
ブルー

@Blue、ありがとうpythonの入力が嫌いです。ヒントを確認して、他に何かできるかどうかを確認します。
ライナス

3

Mathematica、440バイト

n=Input[]
c=Characters["SVTILAMCOPYBGRW"]
l=Reap[Do[n=n-#[[-i]]*Sow[Floor[n/#[[-i]]]]&@FoldList[Times,1,{5,5,4,5,2,5,5,4,5,2,5,5,4,5}],{i,1,15}]][[2,1]]
StringJoin@@((StringJoin[#,"\n"])&/@StringJoin/@Reverse/@((PadRight[#,Max[l],""]&/@Sort[Table[If[l[[n]]>0,Table[c[[n]],l[[n]]],Nothing],{n,1,15}],If[Length[#1]==Length[#2],Position[c,#1[[1]]][[1,1]]<Position[c,#2[[1]]][[1,1]],Length[#1]<Length[#2]]&])[[All,#]]&/@Range[Max[l]])//Reverse)

ASCI表現と正しい順序は、ほとんどのコードを飲み込みます。

*バージョン11 以上でのみ動作します(Nothingの使用)*


1
無料のMathematicaは本当にありませんか?!
ジョナサンアラン

3
あなたは現在、オンラインでそれを使用することができます:develop.open.wolframcloud.com/app
ジュリアン・クルーゲ

0

PHP、274バイト

$t=$argv[1];$n=[500,100,25,5,1];$c=YBGRWAMCOPSVTIL;foreach($n as$k=>$v)for($i=0;$i<3;)$r[$v*10**($i*3)]=$c[$k+$i++*5];krsort($r);foreach($r as$v=>$k)$t-=($x[$v]=floor($t/$v))*$v;ksort($x);arsort($x);for($y=max($x);$y;$y--){foreach($x as$k=>$v)if($v>=$y)echo$r[$k];echo"\n";}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.