ASCII Poker Chip Yığını Düzenlemesi Yapın


20

Poker, genellikle turnuvalarda zorlanan fişlerinizi nasıl düzenlediğiniz konusunda görgü kurallarına sahiptir - fişleriniz çoğunlukla büyük mezhep fiş (ler) ini gizlememek için rakiplerinizin arkasından “gizli” olmayabilir.


Meydan okuma

ASCII'de poker oynayacağız, bu yüzden toplam değeri göz önüne alındığında ASCII çip yığını düzenlememizi çizecek bir işlev veya program yazmamız gerekiyor n.

Giriş
- Pozitif bir tamsayı, n(en fazla 2**32-1ele alınmalıdır)

Çıktı
- Aşağıda tanımlanan yığın düzenlemesinin ASCII gösterimi.
Bu, en uzun (en alt) satırda yazdırılabilir karakterler tarafından kullanılan uzunluktan bir satırdan daha uzun olmayacak şekilde her satırın sağında beyaz boşluk içerebilir;
Bu, takip eden yeni bir satır içerebilir; ve
İsterseniz çipleri temsil eden karakterler küçük harfle yazılabilir.

Yığın düzenlemesi:

  • Mezhepler göz önüne alındığında mümkün olan en az yonga içerir (aşağıya bakınız);
  • "Yığınlar" (sütunlar) eşit değerli yongaları olacak;
  • Daha kısa yığınlar daha uzun yığınların sağında olacak şekilde sipariş edilmelidir; ve
  • Daha büyük mezhep yongalarına sahip yığınlar, eşit büyüklükteki düşük mezhep yığınlarının sağında olacak şekilde sıralanmalıdır (sağ taraftaki rakip (lerimiz) tarafından görülebilir olduklarını gösterir)

Fişleri, renklerini tanımlayan tek tek karakterler olarak temsil edilmelidir:

    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

Misal

En n = 276,352az sayıda yonga için:

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

Tek Psağında, devam etmeli
, sonra büyüklükte üç yığınlarının 2sonraki gitmek gerekir,
- ancak MM, sağ tarafta uzak gitmek gerekir GGsonra ve WWyana 100K > 25 > 1 daha sonra boyut iki yığınlarının 3solda halindeyken,
- ancak CCCzorunluluk o BBBzamandan beri sağa git25K > 100

Şimdi çıktımızı yapmak için bu yongaları gerçek yığınlara yerleştirmeliyiz:

BC
BCWGM
BCWGMP

Test Durumları

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

Bu , bayt en kısa kod kazanır. Boşluk yok, yada yada, matkabı biliyorsun.


Vay, bu eğlenceli görünüyor, eve geldiğimde Julia'nın cevabını deneyebilirim.
Sihirli Ahtapot Urn

Bunu mu demek istediniz 2**31-1, yoksa niyetiniz çoğu imzalı inttürden daha mı büyük ?
Linus

@Linus hmm, imzasız bıraktım; Aslında giriş aralığı sanal alanda Tamam olup olmadığını sordum ve kimse yanıt vermedi. Gördüğünüz gibi 2**32-1bir test vakası, ama bunu düşürmeye hazırım. (İlginç gerçek: PokerStars'ın 25Bgörüntü klasöründe bir çip var.)
Jonathan Allan

Yanıtlar:


5

Pyth, 56 55 52 bayt

Kodda bazı yazdırılamazlar var, bu yüzden burada tersinir bir xxdhexdump var.

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/

Çevrimiçi deneyin. Test odası.

Profesyonel ipucu: 1bir programın sonunda golf için sıfır olmayan bir sayı kabul Q, sadece ekleyin /. /QQPython'da Q // Qsıfır olmayanlar için 1'dir Q.

Sıkıştırma ve yazdırılamayanlar (55 bayt):

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

6

JavaScript (ES6), 185 177 ... 171 bayt

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)

Biçimlendirilmiş ve yorumlanmış

(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)

gösteri

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

Yakut, 181 177 bayt

->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 üzerinde testler .


4

Python 2.7, 282 248 238 bayt

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

Açıklama:
Dolgu listesi Lelemanları ile [quanity, chip_order, chip_character]çip her bir tipi, miktarını gösteren chip_ordereşit miktarda olmasını sağlar yongaları (daha yüksek bir değer fiş ters üzere kriteri elde önce ). LHer satır için dizeler oluşturmak üzere yongaları ters yönden alın . En küçük çizgileri elde etmek için çizgileri tersine yazdırın.

Bazı iyileştirmeler için Blue'ya teşekkürler .


Mükemmel cevap! Ancak, daha fazla golf yapmak için yapabileceğiniz birkaç şey vardır. İlk olarak, birden çok ifadeyi noktalı virgülle ayırarak bir satıra koyabilirsiniz (ancak daha sonra girintiler gerektiren ifadeler değil). İkinci olarak, bir değişkeni yalnızca bir kez kullanırsanız (ilk fordöngüde X, Y ve S gibi ), sadece bazı baytları kaydetmek için ham değeri kullanabilirsiniz. Daha fazla ipucu için codegolf.stackexchange.com/questions/54/…
Blue

Ayrıca, düzenli inputdönüştürmek zorunda w / o tamsayı alacak ve X[0]>0kısaltılabilirX[0]
Mavi

@Mavi, teşekkürler python'un girdisinden nefret ediyorum. İpuçlarını kontrol edip başka bir şey bulup bulamayacağımı göreceğim.
Linus

3

Mathematica, 440 bayt

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 temsili ve doğru sıra, kodun çoğunu yutar.

* Yalnızca Version11 ve sonraki sürümlerle çalışır (Hiçbir Şey kullanımı) *


1
Gerçekten ücretsiz Mathematica yok mu ?!
Jonathan Allan

3
Şu anda çevrimiçi olarak şu adresten
Julien Kluge

0

PHP, 274 Bayt

$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";}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.