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(가) 오른쪽에 가야
다음 크기의 3 스택은 2다음에 가야한다,
-하지만이 MM에 의해 다음 오른쪽으로 멀리 이동해야한다 GG다음과 WW이후 100K > 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

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 허점은없고, 야다 야다, 당신은 훈련을 알고 있습니다.


와우, 이것은 재미있어 보인다, 나는 집에 돌아올 때 Julia 대답을 시도 할지도 모른다.
Magic Octopus Urn

을 의미 했습니까 2**31-1, 아니면 대부분의 부호있는 int유형 보다 더 큰 의도 입니까?
Linus

@Linus 흠, 나는 그것을 서명하지 않았다. 샌드 박스에서 입력 범위가 정상인지 아무도 묻지 않았으며 실제로 응답하지 않았습니다. 보시다시피 2**32-1테스트 사례는 있지만 기꺼이 낮추겠습니다. (흥미로운 사실 ​​: PokerStars는 25B이미지 폴더에 칩을 가지고 있습니다.)
Jonathan Allan

답변:


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/

온라인으로 사용해보십시오. 테스트 스위트.

프로 팁 :에서 10이 아닌 숫자를 받아들이는 프로그램 끝에서 골프 를 치려면 Q추가하십시오 /. /QQ파이썬 Q // Q에서는, 0이 아닌 경우 1입니다 Q.

압축 및 인쇄 불가능 (55 바이트)이없는 경우 :

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

6

자바 스크립트 (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

파이썬 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 에게 감사합니다 .


좋은 답변입니다! 그러나 골프를 더 즐기기 위해 할 수있는 일이 몇 가지 있습니다. 먼저 세미콜론으로 구분하여 여러 줄을 한 줄에 넣을 수 있습니다 (그러나 들여 쓰기가 필요한 문은 제외). 둘째, 첫 번째 for루프의 X, Y 및 S와 같이 변수를 한 번만 사용하는 경우 원시 값을 대체하여 일부 바이트를 저장할 수 있습니다. 자세한 내용은 codegolf.stackexchange.com/questions/54/…를
Blue

또한 regular input는 변환하지 않고 정수를 가져 X[0]>0X[0]
Blue

@Blue, 나는 파이썬의 입력을 싫어합니다. 팁을 확인하고 다른 것을 생각해 낼 수 있는지 알아 보겠습니다.
Linus

3

매스 매 티카, 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
실제로 무료 수학이 없습니까?!
Jonathan Allan

3
현재 온라인으로 사용할 수 있습니다 : develop.open.wolframcloud.com/app
Julien Kluge

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.