Reparte una baraja ASCII


13

Nunca ha habido un desafío definitivo de tarjetas ASCII AFAIK. Entonces, usando el siguiente mazo de cartas 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|
'------''------''------''------''------''------''------''------''------''------''------''------''------'

Tome dos enteros py qcomo entrada; donde pes el número de jugadores y qel número de cartas que recibe cada jugador.

  • Aleatoriamente baraja el mazo de cartas (esto es ambiguo, pero significa que todas las cartas deben aparecer igualmente en cualquier lugar una vez).
  • Reparte 1 ronda de cartas por jugador, generando qfilas de pcartas en cada fila.

Reglas:

  • Los resultados deben ser uniformemente aleatorios, cada carta debe ser igualmente probable que aparezca en cualquier lugar.
  • Se garantiza que 0 < p*q <= 52 and p < 10puede tener un comportamiento indefinido para escenarios donde esto no se cumple.
  • Debe generar qfilas de tarjetas con ptarjetas por fila.
  • Cada columna debe estar separada por | (un tubo de caracteres rodeado de espacios); Si elige un personaje diferente a este, explique por qué. Los espacios circundantes aquí NO son opcionales.
  • Cada fila debe tener 1 o más líneas nuevas entre ellas, más de una es aceptable, 0 no (1 línea nueva significa la línea nueva allí por defecto).
  • Cada fila debe estar etiquetada con el jugador que la posee en el formato "Jugador N" (0 o 1 indexado está bien).
  • Ninguna tarjeta puede aparecer más de una vez.
  • T es por diez.

Ejemplos:

Función ( p=1,q=1):

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

Función ( p=2,q=1):

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

Función ( p=2,q=2):

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

Crédito artístico a una fuente en: http://patorjk.com/software/taag


55
¿Vas a publicar muchos desafíos de cartas de las cartas que encontraste en patorjk.com/software/taag ?

1
Soooo ... ¿Podemos "usar" este sitio para generar el resultado?
J42161217

1
Quiero decir: ¿Puedo hacer un programa que genere patorjk.com/software/taag/… esto para su último caso de prueba?
J42161217

55
Además, Each row must have 1 or more newlines inbetween them, more than one is acceptable, 0 is not.... ¿Pero sus casos de prueba no tienen líneas nuevas entre las tarjetas ...?
totalmente humano

1
Hubo casi un desafío en las tarjetas ASCII: tiempo de juego publicado por mí.
sergiol

Respuestas:


6

De carbón , 142 133 125 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Editar: ahorré 9 bytes al mejorar mi código de muestreo aleatorio. Ahorré otros 8 bytes al mejorar el código de impresión de mi traje. Explicación:

Nθ

Lea el número de tarjetas en q.

FN«

Pase sobre cada jugador.

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

Si este no es el primer jugador, imprima la línea vertical entre el jugador anterior y este.

Player Iι

Imprime el número de jugador.

Fθ«

Pase sobre cada tarjeta.

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

Imprime el borde de la tarjeta.

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

Elija un índice de tarjeta que aún no se haya elegido y agréguelo a la lista de índices de tarjeta elegidos.

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

Elija e imprima el rango de la tarjeta indexando cíclicamente en una cadena de rangos de tarjeta válidos ( 2-9, T, J, Q, K, A).

.--.¶

Imprime la parte superior del traje.

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

Imprime el centro del traje cortándolo en una cuerda. El segmento comienza en el módulo de índice de tarjeta 4 y toma cada 4 ° carácter hasta que se agota la cadena (o fse alcanza el = 1000 ° carácter). Como 4 y 13 son coprimos, esto garantiza que todas las 52 tarjetas sean posibles.

'--'δ↘

Imprima la parte inferior del palo y una copia del rango, y luego muévase a un punto que convenientemente no esté muy lejos de la copia del rango, el comienzo de la siguiente carta o el comienzo de la línea divisoria para el próximo jugador


Cuando vi esto en la caja de arena, fue un gran desafío imprimir el mazo, lo que me llevó a 102 bytes: ¡ Pruébelo en línea! El enlace es a la versión detallada del código.
Neil

3

Python 2 , 357 bytes

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

Pruébalo en línea!

No tengo una maldita idea.


3

Jalea , 126 bytes

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

Pruébalo en línea!


3

JavaScript (ES6), 328 ... 312 bytes

Toma entrada en la sintaxis de curry (p)(q). Los jugadores están indexados a 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)]):''

Manifestación

¿Cómo?

Esta es una función recursiva, que genera la salida de abajo hacia arriba. Durante la parte principal en la que se roban las cartas, ise inicializa p*q*6y disminuye hasta que llega 0. Luego dibujamos el encabezado disminuyendo aún más ihasta que llegue -p.

El arte ASCII se divide en pequeñas piezas almacenadas en la matriz a[]. La siguiente tabla describe el contenido de a[], lo que hace que el resto del código sea más fácil de entender.

 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

Formateado y comentado

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 bytes

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

Pruébalo en línea!


2

SOGL V0.12 , 106 bytes

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

Pruébalo aquí!

Generador de tarjetas:

...‘                     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

Arrastramiento:

'#             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

Relación comercial:

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

Rubí, 262 bytes

->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")}}

¡Más difícil de seguir, pero más corto!

Rubí, 279 bytes

->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 para cada fila, luego usa el %operador como sprintfpara rellenarlo.

El hecho de que el valor de la tarjeta aparezca en cada 3a fila es útil. Los valores de las tarjetas se presentan en hexadecimal con los dígitos 01BCsustituidos por TJQK.

Se guardaron 4 bytes de los símbolos del palo al considerar que la parte superior de los diamantes y las espadas son iguales, pero se agregaron 2 nuevamente para que -4al final de los j%4*4-4códigos del traje sean -4 0 4 u 8, donde [-4,4]significa 4 caracteres que comienzan con el 4to último carácter en el cuerda.

Probablemente podría guardar algunos bytes más. Tener que repetir el código para las identificaciones de los jugadores es feo.


2

PHP, 509 bytes

<?$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);

Pruébalo en línea!

Este es mi primer intento de golf de código, por lo que probablemente se pueda mejorar mucho. Pensé que tenía que comenzar en alguna parte. :)


1

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

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;}

Pruébalo en línea!

Por qué el voto negativo, cumple con las especificaciones


Además, debe crear métodos alternativos en lugar de crear Function<String,String>: este último es muy, muy costoso. Tanto en la creación como cuando se usa.
Olivier Grégoire

Supongo que el voto negativo fue para la respuesta original con errores, pero la actual parece correcta, así que voté para neutralizarla. Algunas cosas pequeñas para jugar golf: los paréntesis se pueden quitar n[c]=t<2?"A":t<10?""+t:""+"TJQK".charAt(t-10); for(j=0;j<p;j++){o+=...;l++;}puede ser for(j=0;j<p;l++,j++)o+=...;; puedes en return o;lugar de System.out.print(o);usar un segundo en Functionlugar de Consumer; ,y=p*qse puede quitar y puede usar p*qdos veces directamente en lugar de y. Sin duda, hay mucho más para el golf, pero no tengo tiempo para investigarlo ahora mismo.
Kevin Cruijssen

1
@KevinCruijssen En realidad, no. Después de la primera edición, voté a favor de "sin esfuerzo en el golf" más allá de eliminar espacios y usar nombres de variables de 1 carácter. Supongo que Roberto Graham debería volver a leer Consejos para jugar golf en Java . El punto es que de hecho cumple con la especificación del desafío, pero no con la especificación de la etiqueta de código de golf.
Olivier Grégoire

¿Cómo sé que se puede jugar más al golf? Tenía alrededor de 400 bytes cuando me di por vencido después de ver esta respuesta, y estimé alrededor de 50 bytes más el resto para terminarlo. 450 bytes vs. 850, apenas hay golf involucrado.
Olivier Grégoire

s[l]<2?":/\\:":s[l]<3?":/\\:"puede ser s[l]<3?":/\\:"y s[i*p+j]<1?":\\/:":s[i*p+j]<2?":\\/:"puede ser s[i*p+j]<2?":\\/:". @ OlivierGrégoire Y soy consciente de que lo más probable es que se reduzca a la mitad, así que entiendo el voto negativo. Pero esto es principalmente una falta de experiencia, y de hecho no leer todos los consejos varias veces. Algunas de las cosas en la respuesta que he hecho también en el pasado, y este no es un desafío fácil en particular para Java. Por cierto, si tiene una respuesta de 400-450 bytes, ¿por qué no la publica como una respuesta separada (si es lo suficientemente diferente)? Tendrías mi voto a favor. ;)
Kevin Cruijssen

1

Python 3, 332 bytes

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.