进行ASCII扑克筹码堆栈安排


20

扑克有如何安排筹码的礼节,通常是在锦标赛中执行的-筹码可能不会因为落后于对手而被对手“隐藏”起来,主要是为了不隐藏某些大面额筹码。


挑战

我们将要使用ASCII玩扑克,因此我们需要编写一个函数或程序,给定其总值,该函数或程序将绘制ASCII芯片堆栈的排列n

输入
-一个正整数,n(最多2**32-1应处理)

输出
-堆栈定义的ASCII表示,如下所示。
它可能在每行的右边包含空格,以使任何行都不能比最长(底部)行中可打印字符所使用的长度多一个字符。
它可能包含一条尾随的换行符;而
代表芯片的字符可以是小写,如果你喜欢。

堆栈安排将:

  • 给定面额,包含尽可能少的筹码(请参见下文);
  • 在“堆栈”(列)中将具有同等价值的筹码;
  • 订购时,较短的烟囱在较高的烟囱的右边;和
  • 进行订购,以使面额较大的筹码堆叠在等量的面额较低的堆叠筹码右边(表示它们对我们右边的对手是可见的)

芯片本身应以单独的字符表示,以标识其颜色:

    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必须在最右边,
然后是三叠大小2
-但MM必须在最右边,然后是GG,然后是WW100K > 25 > 1 然后两叠大小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

这是,因此以字节为单位的最短代码获胜。没有漏洞,yada yada,你知道的。


哇,这看起来很有趣,我回家后可以尝试用Julia回答。
魔术章鱼缸

您的意思是2**31-1,还是要比大多数带符号的int类型大?
莱纳斯(Linus)2016年

@Linus嗯,我没有签名;我确实确实特别询问过沙箱中的输入范围是否正常,没有人响应。如您所见,这2**32-1是一个测试用例,但我愿意降低它。(有趣的事实:PokerStars 25B的图片文件夹中有一个筹码。)
Jonathan Allan

Answers:


5

Pyth,56 55 52字节

该代码包含一些不可打印的内容,因此这是一个可逆的xxd十六进制转储。

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_orderL

感谢Blue的一些改进。


好答案!但是,您可以做一些事情来进一步打高尔夫球。首先,您可以将多个语句放在一行上,并用分号将它们分隔开(但不包括需要缩进的语句)。其次,如果您仅使用一次变量(例如,第一个中的X,Y和Sfor循环),则可以替换原始值以节省一些字节。有关更多提示,请访问codegolf.stackexchange.com/questions/54/…– 2016
蓝色

此外,常规input将为您提供无须转换的整数,并且X[0]>0可以缩短为X[0]
Blue

@Blue,谢谢我讨厌python的输入。我将检查提示,看看是否可以提出其他建议。
莱纳斯(Linus)2016年

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表示法和右顺序吞噬了大多数代码。

*仅适用于Version11 及更高版本(无使用)*


1
真的没有免费的Mathematica吗?!
乔纳森·艾伦

3
您目前可以在以下位置在线使用它:develop.open.wolframcloud.com/app
Julien Kluge,2016年

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";}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.