Distribuisci un mazzo ASCII


13

Non c'è mai stata una vera sfida di carte ASCII che sfida AFAIK. Quindi, usando il seguente mazzo di carte ASCII:

.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) |
| :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: |
| :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: |
| (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): |
| ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'

Prendi due numeri interi pe qcome input; dove pè il numero di giocatori ed qè il numero di carte che ogni giocatore riceve.

  • Mischia casualmente il mazzo di carte (questo è ambiguo, ma significa che tutte le carte devono avere la stessa probabilità di apparire ovunque una volta).
  • Distribuisci 1 giro di carte per giocatore, producendo qfile di pcarte per fila.

Regole:

  • I risultati dovrebbero essere uniformemente casuali, ogni carta dovrebbe avere la stessa probabilità di apparire ovunque.
  • È garantito che 0 < p*q <= 52 and p < 10, potresti avere un comportamento indefinito per scenari in cui questo non è soddisfatto.
  • Dovresti produrre qrighe di carte con pcarte per riga.
  • Ogni colonna deve essere separata da | (un carattere pipe circondato da spazi); se scegli un carattere diverso da questo, spiega perché. Gli spazi circostanti NON sono facoltativi.
  • Ogni riga deve contenere 1 o più newline tra loro, più di una è accettabile, 0 non lo è (1 newline significa che la newline è presente di default).
  • Ogni riga deve essere etichettata con il giocatore che la possiede nel formato "Giocatore N" (0 o 1 indicizzato va bene).
  • Nessuna carta può apparire più di una volta.
  • T è per dieci.

Esempi:

Funzione ( p=1,q=1):

Player 1 # Can also be 0.
.------.
|2.--. |
| (\/) |
| :\/: |
| '--'2|
'------'

Funzione ( p=2,q=1):

Player 1 | Player 2 # Can also be "Player 0 | Player 1"
.------. | .------.
|2.--. | | |T.--. |
| (\/) | | | (\/) |
| :\/: | | | :\/: |
| '--'2| | | '--'T|
'------' | '------'

Funzione ( p=2,q=2):

Player 1 | Player 2 # Can also be "Player 0 | Player 1"
.------. | .------.
|J.--. | | |3.--. |
| (\/) | | | :/\: |
| :\/: | | | :\/: |
| '--'J| | | '--'3|
'------' | '------'
.------. | .------.
|8.--. | | |6.--. |
| :(): | | | :/\: |
| ()() | | | (__) |
| '--'8| | | '--'6|
'------' | '------'

Credito artistico a un carattere su: http://patorjk.com/software/taag


5
Pubblicherai molte sfide con le carte che hai trovato su patorjk.com/software/taag ?

1
Soooo ... Possiamo "usare" questo sito per produrre il risultato ???
J42161217,

1
Voglio dire: posso creare un programma che genera patorjk.com/software/taag/… questo per il tuo ultimo caso di test?
J42161217,

5
Inoltre, Each row must have 1 or more newlines inbetween them, more than one is acceptable, 0 is not.... Ma i tuoi casi di test non hanno righe tra le carte ...?
totalmente umano il

1
C'era quasi una sfida sulle carte ASCII: il tempo di gioco pubblicato da me.
sergiol,

Risposte:


6

Carbone di legna , 142 133 125 byte

NθFN«F¬¬ι«→↑×⁶θ| »Player IιFθ«↙↓.↓⁴←'←⁶↑'↑⁴.P⁶↓≔‽⁵²εW№υε≔‽⁵²ε⊞υε≔§”w↘τ[⁵PkxτG”εδδ.--.¶✂”{➙aETê;s∨Hμ⁼⎚↑Z~SÀd~⌀Tê”﹪ε⁴φ⁴'--'δ↘

Provalo online! Il collegamento è alla versione dettagliata del codice. Modifica: salvato 9 byte migliorando il mio codice di campionamento casuale. Ho salvato altri 8 byte migliorando il mio codice di stampa del seme. Spiegazione:

Nθ

Leggi il numero di carte in q.

FN«

Passa sopra ogni giocatore.

F¬¬ι«→↑×⁶θ| »

Se questo non è il primo giocatore, stampa la linea verticale tra il giocatore precedente e questo giocatore.

Player Iι

Stampa il numero del giocatore.

Fθ«

Passa sopra ogni carta.

↙↓.↓⁴←'←⁶↑'↑⁴.P⁶↓

Stampa il bordo della carta.

≔‽⁵²εW№υε≔‽⁵²ε⊞υε

Scegli un indice di carte che non sia già stato scelto e aggiungilo all'elenco degli indici di carte scelti.

≔§”w↘τ[⁵PkxτG”εδδ

Scegli e stampa il rango della carta indicizzando ciclicamente una stringa di gradi validi ( 2-9, T, J, Q, K, A).

.--.¶

Stampa la parte superiore della tuta.

✂”{➙aETê;s∨Hμ⁼⎚↑Z~SÀd~⌀Tê”﹪ε⁴φ⁴

Stampa la parte centrale della tuta tagliandola in una stringa. La sezione inizia dall'indice del modulo 4 e prende ogni 4 ° carattere fino a quando la stringa si esaurisce (o fviene raggiunto il = 1000 ° carattere). Dato che 4 e 13 sono coprimi, questo assicura che tutte e 52 le carte siano possibili.

'--'δ↘

Stampa la parte inferiore del seme e una copia del valore, quindi spostati in un punto convenientemente non troppo lontano dalla copia del valore, l'inizio della carta successiva o l'inizio della linea di divisione per il prossimo giocatore.


Quando l'ho visto nella sandbox è stata una sfida kc stampare il mazzo, che mi ha portato 102 byte: provalo online! Il collegamento è alla versione dettagliata del codice.
Neil,

3

Python 2 , 357 byte

from random import*
p,q=input()
A,V=':/\:',':\/:'
c=sample([(""".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'"""%(n,s,t,n)).split('\n')for s,t in('(\/)',V),(A,V),(A,'(__)'),(':():','()()')for n in'123456789TJQKA'],p*q)
print' | '.join('Player '+`i`for i in range(p))
for i in range(0,p*q,p):print'\n'.join(map(' | '.join,zip(c[i:i+p][0],c[i:i+p][1])))

Provalo online!

Non ne ho idea.


3

Gelatina , 126 byte

³‘Ḷj“×ṁẹHY»;⁶¤ṫ5W;
2r9;“TJQKA”
“¡ẏ%TZ=ẹaɦAY’ṃ“(\/)_:”s4s2
“E¬ƭḊHẈḢ“ðİ“|e*Ḳ?BḤ’ṃ“. -|1¶'”żÐ€¢FỴ$€p2£j/€Ẋ
¢ssḢµṣ€”1Zj€“ | ”Yµ€ÑY

Provalo online!


3

JavaScript (ES6), 328 ... 312 byte

Accetta input nella sintassi del curry (p)(q). I giocatori sono indicizzati 0.

p=>g=(q,i=p*q*6,d=[...Array(52).keys(a=`:\\/:,(__),()(),(\\/),:/\\:,:():, | ,
,.3.,|0.--. |,| 1 |,| 2 |,| '--'0|,'3',Player 4`.split`,`)].sort(_=>Math.random()-.5))=>i--+p?g(q,i,d)+a[i%p?6:7]+a[i<0?14:i/p%6|8].replace(/\d/,c=>['TJQKA'[j=x>>2]||j-3,a['3454'[x&=3]],a[x%3],'------',p+i][c],x=d[i%p+p*(i/p/6|0)]):''

dimostrazione

Come?

Questa è una funzione ricorsiva, che crea l'output dal basso verso l'alto. Durante la parte principale in cui vengono pescate le carte, iviene inizializzato p*q*6e decrementato fino a quando non raggiunge 0. Quindi disegniamo l'intestazione diminuendo ulteriormente ifino a quando non raggiunge -p.

L'arte ASCII è suddivisa in piccoli pezzi memorizzati nell'array a[]. La tabella seguente descrive il contenuto di a[], il che semplifica la comprensione del resto del codice.

 Index | Content    | Description
-------+------------+------------------------------------------------
    0  | ":\\/:"    | bottom of 'diamonds' and 'hearts'
    1  | "(__)"     | bottom of 'spades'
    2  | "()()"     | bottom of 'clubs'
    3  | "(\\/)"    | top of 'hearts'
    4  | ":/\\:"    | top of 'diamonds' and 'spades'
    5  | ":():"     | top of 'clubs'
    6  | " | "      | player separator
    7  | "\n"       | line-feed
    8  | ".3."      | card row #1, "3" --> "------"
    9  | "|0.--. |" | card row #2, "0" --> symbol of card value
   10  | "| 1 |"    | card row #3, "1" --> top of color ASCII art
   11  | "| 2 |"    | card row #4, "2" --> bottom of color ASCII art
   12  | "| '--'0|" | card row #5, "0" --> symbol of card value
   13  | "'3'"      | card row #6, "3" --> "------"
   14  | "Player 4" | header, "4" --> player ID

Formattato e commentato

p => g = (                                // p = number of players
  q,                                      // q = number of cards
  i = p * q * 6,                          // i = counter
  d = [...Array(52).keys(                 // d = deck
    a = `:\\/:,(__),...`.split`,`         // a = ASCII art pieces (truncated, see above)
  )].sort(_ => Math.random() - .5)        // shuffle the deck
) =>                                      //
  i-- + p ?                               // if i is greater than -p:
    g(q, i, d) +                          //   do a recursive call and append ...
    a[i % p ? 6 : 7] +                    //   separator or line-feed
    a[i < 0 ? 14 : i / p % 6 | 8]         //   header or card row
    .replace(/\d/, c => [                 //   where digits are replaced with:
        'TJQKA'[j = x >> 2] || j - 3,     //     0: symbol of card value
        a['3454'[x &= 3]],                //     1: top of color ASCII art
        a[x % 3],                         //     2: bottom of color ASCII art
        '------',                         //     3: horizontal border
        p + i                             //     4: player ID
      ][c],                               //
      x = d[i % p + p * (i / p / 6 | 0)]  //   x = current card with: bits 0-1 = color
    )                                     //                          bits 2-5 = value
  :                                       // else:
    ''                                    //   stop recursion

2

Python 2 , 382 358 346 338 332 byte

from random import*
p,n=input()
d=zip([0,1,2,3]*13,'23456789TJQKA'*4)
shuffle(d)
C=""".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'"""
print' | '.join('Player '+`i`for i in range(p))
exec"for l in zip(*[(C%(v,'(:::\/(//\)\):::'[s::4],':((:\_)\/_(/:)):'[s::4],v)).split('\\n')for s,v in d[:p]]):print' | '.join(l)\nd=d[p:]\n"*n

Provalo online!


2

SOGL V0.12 , 106 byte

E⁽⁰⅜║(Ηe─t¦4»\$²‘8n{"1<ω⅛┘‘4n╬¡;4n33žASUjk"TJQKA”+{a;22žF75ž}}'#δ№{ψ⌡≤οc+C}c_.∫:"▓⅛▲ŗ‘Κ⁽e{≤+};H?;lƧ |Γ∙┼;┼

Provalo qui!

Generazione della carta:

...‘                     push "(\/):\/::/\::\/::/\:(__):():()()" - the suits
    8n                   split to line lengths of 8 - individual suits
      {                  for each suit
       "...‘               push ".---| .-|   " - a quarter of a suit
            4n             split to line lengths of 4 - [".---", "| .-", "|   "]
              έ           quad palindromize - empty card
                ;          get the suit on top
                 4n        split to line lengths of 4
                   33ž     insert in the card at [3; 3]
                      A    save on variable A - card template
SU                         push "1234567890"
  jk                       remove the first and last digits
    "TJQKA”+               append "TJQKA"
            {         }    for each number - "23456789TJQKA"
             a               load the template
              ;22ž           at [2; 2] insert the current number
                  F75ž       at [7; 5] insert the current number

mischiare le carte:

'#             push 52
  δ            lower range - [0, 1, ..., 50, 51]
   №           reverse - [51, 50, ..., 1, 0]
    {       }  for each, pushing the current item
     ψ           get a random number from 0 to ToS (inclusive)
      ⌡          that many times
       ≤           put the first item of the stack on the top
        οc+C     prepend that to the variable C, predefined with an empty array

trattare:

c_              push Cs contents on the stack - the stack is now a mess of cards
  .∫            repeat input times - each player - pushing the current player number
    :             duplicate the number
     "..‘         push "player "
         Κ        prepend "player " to the number
          ⁽       uppercase the 1st letter
           e{  }  repeat 2nd input times
             ≤      put the first stack item on the top
              +     append it to "Player X" vertically (making an array)
;                 get the other copy of the player number
 H?               if POP-1 (aka if it's not 1)
   ;                swap the top 2 items - the current collumn and all the previous ones (by then they've been joined together)
    l               get its (vertical) length
     Ƨ |            push " |"
        Γ           palindromize - [" | "]
         ∙          multiply " | " vertically that length times
          ┼         append it horizontally (to the previous collumns)
           ;┼       append the current collumn

2

Rubino, 262 byte

->p,q{a=[*0..51].shuffle
puts ["Player %d"]*p*(d=" | ")%[*1..p],(1..q*6).map{|i|(["'------'
.------.
|%X.--. |
| %s |
| %s |
| '--'%X|".split($/)[i%6]]*p*d%a[i/6*p,p].map{|j|["(\\/):()::/\\:"[u=j%4*4-4,4],":\\/:()():\\/:(__)"[u,4],j/4][i%3]}).tr("01BC","TJQK")}}

Più difficile da seguire, ma più breve!

Rubino, 279 byte

->p,q{puts [*1..p].map{|k|"Player #{k}"}*" | "
a=[*0..51].shuffle
(q*6).times{|i|puts [".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'".split($/)[i%6]]*p*" | "%a[i/6*p,p].map{|j|[":\\/:()():\\/:(__)"[u=j%4*4-4,4],("%X"%(j/4)).tr("01BC","TJQK"),"(\\/):()::/\\:"[u,4]][i%3]}}}

Crea un formato per ogni riga, quindi utilizza l' %operatore come sprintfper popolarlo.

È utile il fatto che il valore della carta appaia su ogni terza riga. I valori delle carte sono presentati in formato esadecimale con le cifre 01BCsostituiteTJQK .

Salvati 4 byte dai simboli del seme considerando che la parte superiore dei diamanti e delle picche sono uguali ma aggiunti 2 di nuovo per -4la fine dei j%4*4-4codici seme sono -4 0 4 o 8 dove[-4,4] significa 4 caratteri che iniziano il 4 ° ultimo carattere nel corda.

Probabilmente potrebbe salvare qualche byte in più. Dover ripetere il codice per le identificazioni del giocatore è brutto.


2

PHP, 509 byte

<?$hu='(\/}';$hv=$dv=':\/:';$du=$su=':/\:';$sv='(__)';$cu=':():';$cv='()()';$q="------";$t=$argv[1];foreach([h,d,s,c]as$a)foreach([2,3,4,5,6,7,8,9,T,J,Q,K,A]as$b)$c[]=[$b,$a];shuffle($c);$h=$a=0;for(;$a<$t;$a++)$e[]="Player $a";$f[]=join(" | ",$e);for($g=$argv[2];$g--;){$p=$i=$k=$l=$m=$r=[];$j=$h+$t;for(;$h<$j;$h++){$n=$c[$h][0];$o=$c[$h][1];$p[]=".$q.";$i[]="|$n.--. |";$k[]="| ${$o.u} |";$l[]="| ${$o.v} |";$m[]="| '--'$n|";$r[]="'$q'";}foreach([p,i,k,l,m,r]as$b)$f[]=join(" | ",${$b});}echo join('
',$f);

Provalo online!

Questo è il mio primo tentativo di code golf, quindi probabilmente può essere migliorato molto. Ho pensato che dovevo iniziare da qualche parte. :)


1

Java (OpenJDK 8) , 784 835 843 826 815 781 775 byte

String k(String s){return s.replaceAll("...$","\n");}
p->q->{int c=0,l=0,s[]=new int[p*q],i=0,j,t,b;java.util.List e=new java.util.Stack();String v="TJQK",o="",n[]=new String[p*q],x=o;for(;i<p;o+="Player "+i+++" | ",x+=v);o=k(o);for(i=0;i<q;i++){o=k(o+x.replace(v,".------. | "));for(j=0;j<p;j++){do{t=(int)(Math.random()*13)+1;b=(int)(Math.random()*4);}while(e.contains(t+""+v.charAt(b)));e.add(t+""+v.charAt(b));s[c]=b;n[c]=t<2?"A":t<10?""+t:""+v.charAt(t-10);o+="|2.--. | | ".replace("2",n[c++]);}o=k(o);for(j=0;j<p;j++,l++)o+="| "+(s[l]<1?"(\\/)":s[l]<3?":/\\:":":():")+" | | ";o=k(o);for(j=0;j<p;j++)o+="| "+(s[i*p+j]<2?":\\/:":s[i*p+j]<3?"(__)":"()()")+" | | ";o=k(o);for(j=0;j<p;)o+="| '--'2| | ".replace("2",n[i*p+j++]);o=k(k(o)+x.replace(v,"'------' | "));}return o;}

Provalo online!

Perché il downvote, è conforme alle specifiche


Inoltre, dovresti creare metodi alternativi invece di creare Function<String,String>: quest'ultimo è molto, molto costoso. Sia al momento della creazione che quando utilizzati.
Olivier Grégoire,

Suppongo che il downvote fosse per la risposta originale, ma la corrente sembra corretta, quindi ho votato per neutralizzarla. Alcune piccole cose da golf: la parentesi può essere rimossa n[c]=t<2?"A":t<10?""+t:""+"TJQK".charAt(t-10); for(j=0;j<p;j++){o+=...;l++;}può essere for(j=0;j<p;l++,j++)o+=...;; puoi return o;invece System.out.print(o);usando un secondo Functioninvece di Consumer; ,y=p*qpuò essere rimosso e puoi usare p*qdue volte direttamente invece di y. C'è sicuramente molto di più nel golf, ma non ho tempo di esaminarlo proprio ora ..
Kevin Cruijssen,

1
@KevinCruijssen In realtà, no. Ho effettuato il downgrade dopo la prima modifica per "nessuno sforzo nel golf" oltre alla rimozione di spazi e l'utilizzo di nomi di variabili a 1 carattere. La mia ipotesi è che Roberto Graham dovrebbe rileggere interamente i Suggerimenti per giocare a golf in Java . Il punto è che in effetti è conforme alle specifiche della sfida, ma non alle specifiche del tag code-golf.
Olivier Grégoire,

Come so che può essere ulteriormente giocato a golf? Ero circa 400 byte quando ho rinunciato dopo aver visto questa risposta, e ho stimato circa 50 byte in più per il resto. 450 byte contro 850, non c'è praticamente alcun golf coinvolto.
Olivier Grégoire,

s[l]<2?":/\\:":s[l]<3?":/\\:"può essere s[l]<3?":/\\:"e s[i*p+j]<1?":\\/:":s[i*p+j]<2?":\\/:"può essere s[i*p+j]<2?":\\/:". @ OlivierGrégoire E sono consapevole che molto probabilmente può essere quasi dimezzato, quindi capisco il downvote. Ma questa è principalmente una mancanza di esperienza, e in effetti non si leggono tutti i suggerimenti più volte. Alcune delle cose nella risposta che ho fatto anche in passato, e questa non è una sfida particolarmente facile per Java. A proposito, se hai una risposta di 400-450 byte, perché non la pubblichi come una risposta separata (se significativamente diversa)? Avresti il ​​mio voto. ;)
Kevin Cruijssen,

1

Python 3, 332 byte

from random import*
P=lambda x:print(*x,sep=' | ')
R=range
def f(p,c):
 P(f"Player {i}"for i in R(p))
 d=[f".------.,|{n}.--. |,| {a[:4]} |,| {a[4:]} |,| '--'{n}|,'------'".split(",")for a,n in sample([*zip(r':/\:(__) (\/):\/: :/\::\/: :():()()'.split()*13,'A23456789TJQK'*4)],p*c)]
 for i in R(c):
  for t in zip(*d[i::c]):
   P(t)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.