Складіть домовленість про підбірку фішок 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

Це , тому найкоротший код у байтах виграє. Ніяких лазівки, яда яда, ти знаєш дриль.


Ого, це виглядає весело, я можу спробувати відповідь Джулії, коли повернусь додому.
Magic Octopus Urn

Ви мали на увазі 2**31-1, чи ваш намір бути більшим, ніж більшість підписаних intтипів?
Лінус

@Linus хм, я зробив це без підпису; Я насправді спеціально запитав, чи був діапазон вводу в порядку пісочниці, і ніхто не відповів. Як бачите 2**32-1, це тестовий випадок, але я готовий його знизити. (Цікавий факт: PokerStars має 25Bчіп у своїй папці із зображеннями.)
Джонатан Аллан

Відповіді:


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 // Q1 для нуля 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_orderзабезпечується сортування чіпів рівної кількості в зворотному порядку ( спочатку чіпси з більшим значенням ). Візьміть фішки Lзворотно, щоб побудувати рядки для кожного рядка. Роздрукуйте лінії у зворотному напрямку, щоб отримати найменші лінії зверху.

Завдяки Blue за деякі вдосконалення.


Чудова відповідь! Однак є кілька речей, які ви можете зробити, щоб більше пограти в гольф. По-перше, ви можете розмістити декілька висловлювань на одному рядку, розділивши їх крапками з комою (але не твердженнями, для яких потрібні відступи після). По-друге, якщо ви використовуєте змінну лише один раз (наприклад, X, Y і S у першому forциклі), ви можете просто замінити необроблене значення, щоб зберегти кілька байт. Для отримання додаткових порад ознайомтеся з codegolf.stackexchange.com/questions/54/…
Синій

Крім того, регулярний inputотримає вам ціле число без перетворення, і X[0]>0його можна скоротити доX[0]
Blue

@Blue, дякую, я ненавиджу вкладення python. Я перевірю поради та побачу, чи зможу я придумати щось інше.
Лінус

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 та правильний порядок проковтують більшу частину коду.

* Працює лише з версією11 та новішою версією (використання Nothing) *


1
Чи справді немає вільної математики ?!
Джонатан Аллан

3
Зараз ви можете користуватися ним в Інтернеті за адресою: develo.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";}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.