สร้างการเรียงชิปโป๊กเกอร์ 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แล้ว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 อืมฉันทำให้มันไม่ได้ลงนาม; จริง ๆ แล้วฉันถามว่าช่วงอินพุตเป็นปกติในกล่องทรายหรือไม่และไม่มีใครตอบ อย่างที่คุณเห็น2**32-1เป็นกรณีทดสอบ แต่ฉันยินดีที่จะลด (ข้อเท็จจริงที่น่าสนใจ: PokerStars มี25Bชิปอยู่ในโฟลเดอร์รูปภาพ)
Jonathan Allan

คำตอบ:


5

Pyth, 56 55 52 ไบต์

รหัสมีบาง unprintables ดังนั้นนี่คือxxdhexdump ย้อนกลับได้

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/

ลองออนไลน์ ชุดทดสอบ

Pro เคล็ดลับ: การกอล์ฟ 1ในท้ายที่สุดของโปรแกรมการยอมรับจำนวนภัณฑ์ในเพียงเพิ่มQ ซึ่งในหลามจะเป็น 1 สำหรับภัณฑ์//QQQ // QQ

ไม่มีการบีบอัดและ unprintables (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สำหรับการปรับปรุงบางอย่าง


คำตอบที่ดี! อย่างไรก็ตามมีบางสิ่งที่คุณสามารถทำได้เพื่อตีกอล์ฟให้มากขึ้น ขั้นแรกคุณสามารถใส่หลาย ๆ คำสั่งในหนึ่งบรรทัดโดยแยกพวกมันออกด้วยเครื่องหมายอัฒภาค (แต่ไม่ใช่คำสั่งที่ต้องมีการเยื้องหลัง) ประการที่สองหากคุณใช้ตัวแปรเพียงครั้งเดียว (เช่น X, Y และ S ในforลูปแรก) คุณสามารถทดแทนค่า raw เพื่อบันทึกบางไบต์ สำหรับเคล็ดลับเพิ่มเติมดูcodegolf.stackexchange.com/questions/54/…
บลู

นอกจากนี้ปกติinputคุณจะได้รับจำนวนเต็มโดยไม่ต้องแปลงและX[0]>0สามารถย่อให้เป็นX[0]
Blue

@ บลูขอบคุณฉันเกลียดการป้อนข้อมูลของงูใหญ่ ฉันจะตรวจสอบเคล็ดลับและดูว่าฉันจะได้อะไรอีกหรือไม่
ไลนัส

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 ฟรีจริงๆหรือ
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.