Imprime una baraja barajada

23

Entrada

Ninguna

Salida

52 cartas. No hay duplicados Las tarjetas se representan como sus caracteres unicode, por ejemplo, 🂹.

Los puntos de código Unicode siguen el siguiente formato:

  • Los primeros tres dígitos son 1F0.
  • El siguiente dígito es A, B, C, o Dpara espadas, corazones, diamantes y tréboles, respectivamente.
  • El siguiente dígito es a 1través Cy Epara los diversos números / tarjetas de cara. 1es as, 2- Ason las tarjetas de números, y B, Dy Eson el sota, caballo y rey, respectivamente. ( Ces el caballero, que no está en la mayoría de los mazos).

Salida de ejemplo:

🂶🃁🃛🃎🂧🂵🃗🂦🂽🂹🂣🃊🃚🂲🂡🂥🂷🃄🃃🃞🂺🂭🃑🃙🂪🃖🂳🃘🃒🂻🃆🂮🃍🂱🂴🃋🂸🃈🃅🃂🂨🃓🃉🂾🃇🂩🂢🂫🃔🃕 🂤🃝

Reglas:

  • Este es el . La respuesta más corta gana.
  • Las lagunas prohibidas están prohibidas.
  • Tu mazo debe ser realmente aleatorio. Si se ejecuta 20 veces, se deben generar 20 salidas aleatorias (y muy probablemente únicas).

Nota

Si solo ve cuadros, instale las fuentes DejaVu .

dkudriavtsev
fuente
2
¿Puede haber espacios entre cada personaje?
totalmente humano
3
Creo que quiere decir que debe ser aleatorio y que todas las permutaciones deben tener una probabilidad de ocurrencia nula.
Notts90
44
¿Quién más está viendo un montón de cajas?
SuperJedi224
1
¡@Mendeleev también debe publicar una advertencia de que esa descarga es casi un gigabyte!
Noodle9
2
Si solo ve cuadros, instale las fuentes Noto de Google. Sí, no puedo hacer eso en mi teléfono ...
Dennis

Respuestas:

9

Jalea ,  25 23  21 bytes

62R%⁴g180<11T+“¢¬⁷’ẊỌ

Un enlace niládico que devuelve una lista de caracteres, o un programa completo que imprime el mazo barajado.

Pruébalo en línea!

¿Cómo?

62R%⁴g180<11T+“¢¬⁷’ẊỌ - Main link: no arguments
62                    - literal 62
  R                   - range(62) -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47, 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62]
    ⁴                 - literal 16
   %                  - modulo    -> [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,  0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14]
      180             - literal 180
     g                - G.C.D.    -> [1,2,3,4,5,6,1,4,9,10, 1,12, 1, 2,15,180, 1, 2, 3, 4, 5, 6, 1, 4, 9,10, 1,12, 1, 2,15,180, 1, 2, 3, 4, 5, 6, 1, 4, 9,10, 1,12, 1, 2,15,180, 1, 2, 3, 4, 5, 6, 1, 4, 9,10, 1,12, 1, 2]
          11          - literal 11
         <            - less than?-> [1,1,1,1,1,1,1,1,1, 1, 1, 0, 1, 1, 0,  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,  0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1]
            T         - truthy    -> [1,2,3,4,5,6,7,8,9,10,11,   13,14,       17,18,19,20,21,22,23,24,25,26,27,   29,30,       33,34,35,36,37,38,39,40,41,42,43,   45,46,       49,50,51,52,53,54,55,56,57,58,59,   61,62]
              “¢¬⁷’   - base 250 number 127136
             +        - addition (vectorises) -> card character ordinals
                   Ẋ  - shuffle the list
                    Ọ - convert to characters
                      - full program has an implicit print
Jonathan Allan
fuente
44
¿Por qué siempre es Jelly la que hace esta magia?
Gryphon - Restablece a Monica el
8

JavaScript (ES6), 107 106 108 bytes

a=[]
for(S of'ABCD')for(N of'123456789ABDE')a.splice(Math.random()*-~a.length,0,eval(`'\\u\{1F0${S+N}}'`))
a

-1 byte gracias a @nderscore


JavaScript (ES6), 120 119 121 bytes

Versión previa.

a=[],[...'ABCD'].map(S=>[...'123456789ABCE'].map(N=>a.splice(Math.random()*-~a.length|0,0,eval("'\\u\{1F0"+S+N+"}'")))),a
Darrylyeo
fuente
Whoa, nunca [...'ABCD']antes visto . Eso es genial :)
Steve Bennett
@SteveBennett De hecho! Es bueno que las cadenas sean iterables por char así. :)
darrylyeo
Pero aún no puedes hacer cosas como "ABCD".map(...). Estoy seguro de que hay razones razonables por las que ese es el caso.
Steve Bennett
@SteveBennett Sí, supongo que es porque es ambiguo si tal método devolvería una cadena o una matriz.
darrylyeo
1
Muy bonita Me tomé la libertad de modificar el fragmento para obtener una salida más gráfica, pero no dude en retroceder.
Arnauld
7

Python 3 ,  106  94 bytes

-5 bytes gracias a musicman523 (1. uso sample(...,52)como un equivalente en línea de shuffle[gracias a totalmente humano]; 2. uso en ~v&2lugar de v%4<2; más 1 byte adicional como consecuencia de que se puede eliminar un espacio)

from random import*
print(*sample([chr(v+127137)for v in range(63)if~v&2or~v%16>4],52),sep='')

Pruébalo en línea!

Jonathan Allan
fuente
2
Bueno, no pude obtener mi propia solución de Python mejor, pero obtuve la tuya a 97 usando el cambio de humanhuman a sample. Pruébalo en línea!
musicman523
1
Además, puede cambiar v%4<2a ~v&2para guardar un byte más.
musicman523
¡Bien hecho! Pensé que tal vez otra randomfunción podría ayudar allí. Otro byte en la parte superior como or ~...puede ser or~....
Jonathan Allan
6

05AB1E , 22 21 bytes

Guardado 1 byte gracias a carusocomputing .

…1F0A4£14L13KhJâ«Hç.r

Pruébalo en línea!

Explicación

…1F0                    # push the string "1F0"
    A4£                 # push the string "abcd"
       14L              # push range [1 ... 14]
          13K           # remove 13
             h          # convert to hexadecimal
              J         # join to string "123456789ABCE"
               â        # cartesian product
                «       # prepend the string to each char in the list
                 H      # convert to decimal
                  ç     # get the chars with those code points
                   .r   # randomize
Emigna
fuente
1
…1F0A4£14L13KhJâ«Hç.rpara 21 bytes (editado porque olvidé eliminar a los caballeros). Sin embargo, te ayuda a atar la gelatina.
Magic Octopus Urn
@carusocomputing: buena idea hacer el cartesiano antes de la concatenación, para que podamos omitir la división. ¡Gracias!
Emigna
6

Bash + coreutils, 56 bytes

printf %b\\n \\U1F0{A..D}{{1..9},A,B,D,E}|shuf|tr -d \\n

Usamos printfescribir cada tarjeta en su propia línea, barajar las líneas y luego concatenar todas las líneas eliminando los caracteres de la nueva línea.

Tenga en cuenta que aunque el printfcomando coreutils requiere exactamente 8 dígitos hexadecimales después \U, el Bash incorporado printfnos permite omitir los ceros iniciales.

Toby Speight
fuente
Llegué tan lejos echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, pero el tuyo es mejor. No sabía acerca %b.
Trauma digital
1
@Digital: ¡yo tampoco, hasta que escribí esta respuesta!
Toby Speight
3

Python 3 , 112 bytes

from random import*
*a,=map(chr,range(127136,127200))
del a[::16],a[::-15],a[11::14]
shuffle(a)
print(*a,sep='')

Pruébalo en línea!

Anders Kaseorg
fuente
¿Puedes explicar la magia que ocurre en la declaración del? He estado tratando de resolverlo dividiéndolo en tres declaraciones secuenciales, pero termino eliminando los elementos incorrectos en la lista. Por ejemplo, un [:: 16] me da una tarjeta y tres unicodes no interpretados.
CCB60
La deldeclaración se desglosa secuencialmente de izquierda a derecha. El primer elemento de of a[::16]es U + 1F0A0 PLAYING CARD BACK, que debe eliminarse. También necesitamos eliminar las tarjetas Knight y Joker que están atrapadas entre las 52 normales. Ver en.wikipedia.org/wiki/… .
Anders Kaseorg
3

Python 3 , 107 bytes

¡Ahorré 6 bytes gracias a @totallyhuman y 3 gracias a @ CCB60!

from random import*
print(*sample([chr(int('1F0'+a+b,16))for a in'ABCD'for b in'123456789ABDE'],52),sep='')

Pruébalo en línea!

musicman523
fuente
Lo jugué un poco. Sin embargo, esto solo es válido si se permiten espacios como separadores.
Totalmente humano
@totallyhuman agregando ,sep=''arregla los espacios, por supuesto, pero lo hace 112 bytes
vroomfondel
Me olvidé random.sample! Dejaré que el OP decida sobre los espacios. Puedo agregar ,sep=''para deshacerme de ellos, y aún así guardar 6 bytes.
musicman523
chr (int (f'0x1F0 {a} {b} ', 16)) se puede acortar en 3 bytes a chr (int (' 0x1F0 '+ a + b, 16))
CCB60
@ CCB60 Soy un tonto. Buena captura
musicman523
3

PHP > = 7, 102 bytes

for(;$i++<64;)in_array(($c=127136+$i)%16,[0,12,15])?:$q[]=IntlChar::chr($c);shuffle($q);echo join($q);

No hay un intérprete en línea disponible para el método IntlChar :: chr

PHP , 112 bytes

for(;$n++<4;shuffle($r))for($i=0;$i++<14;)$i==12?:$r[]=pack("c*",240,159,131-($n>2),$n*16+112+$i);echo join($r);

Pruébalo en línea!

PHP , 116 bytes

for(;$c=ab89[$n++];shuffle($r))for($i=0;$i++<14;)$i==12?:$r[]=hex2bin(f09f8.(2+($n>2)).$c.dechex($i));echo join($r);

Pruébalo en línea!

PHP, 121 bytes

for(;$c=ABCD[$n++];shuffle($r))for($i=0;$i++<14;)$i==12?:$r[]=json_decode('"\ud83c\udc'.$c.dechex($i).'"');echo join($r);

Pruébalo en línea!

Jörg Hülsermann
fuente
3

APL (Dyalog) , 40 38 bytes

Método de Jonathan Allan

UCS((11>18016|⍳62)/127136+⍳62)[?⍨52]

(... )en la siguiente matriz

⍳62 los primeros 62 enteros

127136+ agregue 127136 a eso

(... )/ filtrar eso con el booleano

  ⍳62 primeros 62 enteros

  16| módulo 16

  180∨ MCD de 180 y que

  11> si 11 es mayor que esos

[... ]seleccione los siguientes elementos

?⍨52 baraja los primeros 52 enteros (elige 52 enteros aleatorios de una bolsa de los primeros 52 enteros)

⎕UCS convertir a los correspondientes símbolos en la U nicode C r incón dele S et


Solución de la versión 16.0 (actualmente en beta) (33 caracteres)

UCS(127136+⍸11>18016|⍳62)[?⍨52]

(... )en la siguiente matriz

⍳62 primeros 62 enteros

16| módulo 16

180∨ MCD de 180 y que

11> si 11 es mayor que esos

 índices donde cierto

127136+ agregue 127136 a eso

[... ]seleccione los siguientes elementos

?⍨52 baraja los primeros 52 enteros (elige 52 enteros aleatorios de una bolsa de los primeros 52 enteros)

⎕UCS convertir a los correspondientes símbolos en la U nicode C r incón dele S et


Vieja solución

UCS(126976+16⊥¨,(9+⍳4)∘.,12~⍨⍳14)[?⍨52]

(... )en la siguiente matriz

⍳14 los primeros 14 enteros

12~⍨ excepto 12

(... )∘., Concatenado cartesianamente con

  ⍳4 los primeros 4 enteros

  9+ agregado a 9

, desentrañar (aplanar) que

16⊥¨ evaluar cada uno en la base 16

126976+ agregar 126976 a eso

[... ]seleccione los siguientes elementos

?⍨52 baraja los primeros 52 enteros (elige 52 enteros aleatorios de una bolsa de los primeros 52 enteros)

⎕UCS convertir a los correspondientes símbolos en la U nicode C r incón dele S et

Adán
fuente
3

Carbón de leña , 50 bytes

A¹²⁷¹³⁶χA⪫E…χ⁺⁶⁴χ℅ιωσWσ«A‽σχA⪫⪪σχωσ¿﹪﹪﹪℅χ¹⁶¦¹⁵¦¹³χ

Pruébalo en línea! El enlace es a la versión detallada del código. Crea la cadena de todos los 64 caracteres en el bloque, pero filtra las tarjetas no válidas a medida que se seleccionan al azar. (Hablando de eso, la selección aleatoria sin reemplazo de una cadena es de solo 11 bytes, en comparación con 17 para una matriz).

Editar: la sustracción de una matriz y otras mejoras de carbón vegetal han reducido el tamaño a 41 bytes: ¡ Pruébelo en línea!

Neil
fuente
2

Alice , 34 bytes

'?rwd.n$@U,!6?44*%a7+-F$K?'🂡+OK

Pruébalo en línea!

Explicación

'?r                               push numbers 0-63 onto stack
   w                              store return address (start main loop)
    d                             get stack depth
     .n$@                         if zero, terminate
         U                        random number in [0, depth)
          ,                       move corresponding stack element to top
           !                      store on tape
             ?                    copy back from tape
              44*%                mod 16
                  a7+-            subtract 17
            6         F           does the result divide 6?
                       $K         if so, return to start of main loop
                         ?        copy card number from tape again
                          '🂡+     add 0x1F0A1
                             O    output
                              K   return to start of main loop
Nitrodon
fuente
2

> <> , 49 50 49 bytes

"🂡"v
=?v>:1+}:88+%:c-:3-**?!~{l4d*
{>x
o^>l?!;

Pruébalo en línea!

(+1 byte para mejorar la aleatoriedad)

Estoy interpretando que "aleatorio" significa "cada resultado posible tiene una probabilidad distinta de cero". Esta no es una distribución uniforme.

Hay dos etapas para este código. Primero, el pez pone todas las cartas en la pila, usando las dos primeras líneas. Comenzando con el as de espadas, el pez lo duplica y lo incrementa, luego verifica si el código hexadecimal de la carta anterior termina en 0, C o F multiplicando juntos x  ( x -12) ( x -15), donde x es el mod de código de char 16, y comprobando si eso es cero. Si es así, elimina la carta ofensiva de la pila. Se repite hasta que la pila tiene 52 cartas, luego nada hacia la etapa 2:

  v
{>x
o^>l?!;

Este fragmento de código baraja e imprime la pila. El xestablece la dirección del pez al azar:

  • Si el pez nada hacia arriba, golpea vy regresa a él xsin hacer nada. La dirección izquierda es similar.
  • Si el pez nada hacia la derecha, se envuelve y golpea el {, girando la pila completa hacia la izquierda, luego regresa al x.
  • Si el pez nada hacia abajo, imprime la tarjeta en el frente de la pila y luego regresa a la x.

Está claro que se pueden producir todos los pedidos posibles de las cartas: en cualquier punto de la etapa 2, cada carta que aún no se ha impreso puede imprimirse a continuación si el pez nada hacia la derecha las suficientes veces. Esta técnica de barajar generalmente no mueve las cartas muy lejos si ya estaban cerca una de la otra, pero, de nuevo, tampoco baraja a mano .

No un arbol
fuente
2

R, 61 bytes

cat(intToUtf8(sample(c(127137:127198)[-c(12,28,44,47,60)])))

Muestre aleatoriamente el vector de representaciones enteras de los valores unicode de las tarjetas (que se pueden obtener de utf8ToInt()fucntion) y elimine las tarjetas de caballero / comodín no deseadas.

Andrew Haynes
fuente
57 bytes
Giuseppe
1

C # ( 146 141 bytes)

using System.Linq;()=>Enumerable.Range(0,52).OrderBy(i=>System.Guid.NewGuid()).Aggregate("",(s,i)=>s+"\uD83C"+(char)(56481+i+i/13*3+i%13/12))

Demostración en línea

Utiliza un estilo extremadamente malo para barajar Guid.NewGuid(), pero es code-golf. Luego construye los pares sustitutos manualmente.

Peter Taylor
fuente
¿Esto realmente funciona? Cada vez que intenté transmitir el int dinámico a un carácter, ¿arrojó una excepción?
TheLethalCoder
@TheLethalCoder, no tengo ningún valor dinámico. Pero como prueba de que funciona, he adjuntado un enlace Ideone.
Peter Taylor
Me refería al int creado para la segunda parte del par sustituto.
TheLethalCoder
Puede guardar un byte sin incluir el punto y coma final
TheLethalCoder
Dice 147 bytes, lee como 146
Neil A.
0

Perl 5, 75 bytes

@c=map{7946+$_%4+$_/64}4..51,56..59;print chr(16*splice@c,@c*rand,1)while@c

Tenga en cuenta que esto utiliza los puntos de código para las reinas como se indica en la pregunta (es decir, el último dígito C). Para los puntos de código reales (último dígito D), reemplace 51,56con 47,52.

faubi
fuente
0

Java 8, 216 bytes

import java.util.*;()->{List<Long>l=new ArrayList();for(long i=52;i-->0;l.add(i));Collections.shuffle(l);for(Long x:l)System.out.print((char)(x.parseLong("1F0"+(char)(65+x/12)+((x%=4)>9?(char)(x>2?69:65+x):x),16)));}

Explicación:

Pruébalo aquí

NOTA: No probado porque, aunque instalé la fuente vinculada, todavía veo cuadros. Probablemente tenga que reiniciar mi PC o algo así ...

import java.util.*;               // Required import for List, ArrayList and Collections
()->{                             // Method without parameter nor return-type
  List<Long>l=new ArrayList();    //  List
  for(long i=52;i-->0;l.add(i));  //  Fill the list with 1 through 52
  Collections.shuffle(l);         //  Randomly shuffle the list
  for(Long x:l)                   //  Loop over the shuffled list
    System.out.print(             //   Print the following character:
      (char)(x.parseLong(         //    Convert the following String to a character:
        "1F0"+                    //     The literal String "1F0" +
         (char)(65+x/12)+         //     either A, B, C or D by using x/12, adding 65,
                                  //      and casting it to a char +
         ((x%=4)>9?               //     If the current item mod-4 is 10 or higher:
            (char)(x>2?69:65+x)   //      Convert it to A, B, C or E
           :                      //     Else (1 through 9):
            x)                    //      Simply add this digit
      ,16))
    );
}                                 // End of method
Kevin Cruijssen
fuente
0

Japt , 51 41 39 22 bytes

Con un poco de inspiración de la solución de Jonathan Jelly .

#?ö¬k@B§XuG y#´Ãmd##

Pruébelo (o vea la salida con mayorfont-size )


Explicación

#?                         :63
  ö¬                       :Random permutation of range [0,63)
    k                      :Remove elements that return true
     @                     :When passed through this function
      B                    :  11
       §                   :  Less than or equal to
        X                  :  Current element
         u                 :  Modulo
          G                :  16
            y              :  GCD
             #´            :  180
               Ã           :End function
                m          :Map
                  ##       :  Add 127136
                 d         :  Get character at that codepoint
Lanudo
fuente