Создайте 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

Это , поэтому выигрывает самый короткий код в байтах. Никаких лазеек, Яда Яда, ты знаешь тренировку.

Джонатан Аллан
источник
Вау, это выглядит забавно, я могу попробовать ответ Джулии, когда вернусь домой.
Волшебная Урна Осьминога
Вы 2**31-1имели в виду , или вы намерены быть больше, чем большинство подписанных intтипов?
Линус
@ Линус Хм, я сделал это без подписи; Я на самом деле специально спросил, был ли входной диапазон в песочнице нормальным, и никто не ответил. Как видите 2**32-1, это тестовый пример, но я готов понизить его. (Интересный факт: у PokerStars есть 25Bфишка в папке с изображениями.)
Джонатан Аллан

Ответы:

5

Pyth, 56 55 52 байта

Код содержит некоторые непечатаемые, так что вот обратимый 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/

Попробуйте онлайн. Тестирование.

Совет от профессионала: в гольф 1в конце программы, которая принимает ненулевой номер Q, просто добавьте /. /QQ, который в Python был бы Q // Q, равен 1 для ненулевого значения Q.

Без сжатия и печати (55 байт):

=HQj_.t_ #lD*V"SVTILAMCOPYBGRW"mhA.DHd_.u*NYP*3j7736 6/
PurkkaKoodari
источник
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>

Arnauld
источник
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 .

м-chrzan
источник
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цикле), вы можете просто заменить необработанное значение, чтобы сохранить несколько байтов. Дополнительные советы можно найти на codegolf.stackexchange.com/questions/54/…
Blue
Кроме того, регулярный inputполучит целое число без необходимости преобразования, и X[0]>0его можно сократить доX[0]
Blue
@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";}
Йорг Хюльсерманн
источник