Imprimer un jeu de cartes mélangé


23

Contribution

Aucun

Sortie

52 cartes. Pas de doublons. Les cartes sont représentées comme leurs caractères unicode, par exemple 🂹.

Les points de code Unicode suivent le format suivant:

  • Les trois premiers chiffres sont 1F0.
  • Le chiffre suivant est A, B, Cou Dpour pique, cœur, carreau, trèfle respectivement.
  • Le chiffre suivant est à 1travers Cet Epour les différents numéros / cartes de visage. 1est as, 2- Asont les cartes numériques, et B, Det Esont la prise, la reine et roi respectivement. ( Cest le chevalier, qui n'est pas dans la plupart des decks.)

Exemple de sortie:

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

Règles:

  • C'est du . La réponse la plus courte l'emporte.
  • Les failles interdites sont interdites.
  • Votre deck doit être réellement randomisé. S'il est exécuté 20 fois, 20 sorties aléatoires (et probablement uniques) doivent être générées.

Remarque

Si vous ne voyez que des cases, installez les polices DejaVu .


2
Peut-il y avoir des espaces entre chaque personnage?
2017 totalement humain à 22h14

3
Je pense que vous voulez dire qu'elle devrait être aléatoire et que toutes les permutations devraient avoir une probabilité d'occurrence nulle.
Notts90

4
Qui d'autre voit un tas de boîtes?
SuperJedi224

1
@Mendeleev, vous devez également publier un avertissement indiquant que ce téléchargement est presque un gigaoctet!
Noodle9

2
Si vous ne voyez que des cases, installez les polices Noto de Google. Oui, je ne peux pas faire ça sur mon téléphone ...
Dennis

Réponses:


9

Gelée ,  25 23  21 octets

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

Un lien niladique renvoyant une liste de caractères, ou un programme complet qui imprime le jeu mélangé.

Essayez-le en ligne!

Comment?

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

4
Pourquoi est-ce toujours Jelly qui fait cette magie?
Gryphon - Rétablir Monica le

8

JavaScript (ES6), 107 106 108 octets

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

-1 octet grâce à @nderscore


JavaScript (ES6), 120 119 121 octets

La version précédente.

a=[],[...'ABCD'].map(S=>[...'123456789ABCE'].map(N=>a.splice(Math.random()*-~a.length|0,0,eval("'\\u\{1F0"+S+N+"}'")))),a

Whoa, jamais vu [...'ABCD']auparavant. C'est cool :)
Steve Bennett

@SteveBennett En effet! C'est bien que les chaînes soient itérables par char comme ça. :)
darrylyeo

Mais vous ne pouvez toujours pas faire des choses comme ça "ABCD".map(...). Je suis sûr qu'il y a des raisons raisonnables pour que ce soit le cas.
Steve Bennett

@SteveBennett Oui, je suppose que c'est parce qu'il est ambigu qu'une telle méthode renvoie une chaîne ou un tableau.
darrylyeo

1
Très sympa. J'ai pris la liberté de modifier l'extrait de code pour une sortie plus graphique, mais n'hésitez pas à revenir en arrière.
Arnauld

7

Python 3 ,  106  94 octets

-5 octets grâce à musicman523 (1. utiliser sample(...,52)comme équivalent en ligne à shuffle[grâce à totalement humain]; 2. utiliser à la ~v&2place de v%4<2; plus 1 octet supplémentaire en conséquence car un espace peut être supprimé)

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

Essayez-le en ligne!


2
Eh bien, je n'ai pas pu améliorer ma propre solution Python, mais j'ai réduit la vôtre à 97 en utilisant le commutateur totalementhuman sample. Essayez-le en ligne!
musicman523

1
De plus, vous pouvez changer v%4<2pour ~v&2sauver un octet.
musicman523

Bien fait! J'avais pensé qu'une autre randomfonction pourrait peut-être y aider. Un autre octet au-dessus comme or ~...peut l'être or~....
Jonathan Allan

6

05AB1E , 22 21 octets

1 octet enregistré grâce à carusocomputing .

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

Essayez-le en ligne!

Explication

…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

1
…1F0A4£14L13KhJâ«Hç.rpour 21 octets (édité car j'ai oublié de supprimer les chevaliers). Cela vous aide à nouer la gelée.
Magic Octopus Urn

@carusocomputing: Bonne idée de faire le cartésien avant la concaténation, afin que nous puissions sauter la scission. Merci!
Emigna

6

Bash + coreutils, 56 octets

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

Nous utilisons printf pour écrire chaque carte sur sa propre ligne, mélanger les lignes, puis concaténer toutes les lignes en supprimant les caractères de nouvelle ligne.

Notez que bien que la printfcommande coreutils nécessite exactement 8 chiffres hexadécimaux après \U, le Bash intégré printfnous permet d'omettre les zéros de tête.


Je suis allé aussi loin echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, mais le vôtre est meilleur. Je n'en savais rien %b.
Digital Trauma

1
@Digital - moi non plus, jusqu'à ce que j'écrive cette réponse!
Toby Speight

3

Python 3 , 112 octets

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

Essayez-le en ligne!


Pouvez-vous expliquer la magie en cours dans l'instruction del? J'ai essayé de le comprendre en le décomposant en trois déclarations séquentielles, mais je finis par supprimer les mauvais éléments de la liste. Par exemple, un [:: 16] me donne une carte et trois unicodes non interprétés.
CCB60

L' delinstruction se décompose séquentiellement de gauche à droite. Le premier élément de a[::16]est U + 1F0A0 PLAYING CARD BACK, qui doit être supprimé. Nous devons également supprimer les cartes Knight et Joker coincées entre les 52 normales. Voir en.wikipedia.org/wiki/… .
Anders Kaseorg

3

Python 3 , 107 octets

6 octets enregistrés grâce à @totallyhuman et 3 grâce à @ CCB60!

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

Essayez-le en ligne!


Je l'ai joué un peu au golf. Ceci n'est valable que si les espaces sont autorisés comme séparateurs.
2017 totalement humain

@totallyhuman l'ajout ,sep=''corrige les espaces, bien sûr - mais en fait 112 octets
vroomfondel

J'ai oublié random.sample! Je vais laisser le PO décider des espaces. Je peux ajouter ,sep=''pour m'en débarrasser, tout en économisant 6 octets.
musicman523

chr (int (f'0x1F0 {a} {b} ', 16)) peut être raccourci de 3 octets à chr (int (' 0x1F0 '+ a + b, 16))
CCB60

@ CCB60 Je suis un imbécile. Bonne prise
musicman523

3

PHP > = 7, 102 octets

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

Aucun interprète en ligne disponible pour la méthode IntlChar :: chr

PHP , 112 octets

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

Essayez-le en ligne!

PHP , 116 octets

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

Essayez-le en ligne!

PHP, 121 octets

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

Essayez-le en ligne!


3

APL (Dyalog) , 40 38 octets

La méthode de Jonathan Allan

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

()Sur le tableau suivant

⍳62 les 62 premiers entiers

127136+ ajouter 127136 à cela

()/ Filtre ça avec le booléen

  ⍳62 62 premiers entiers

  16| module 16

  180∨ GCD de 180 et que

  11> si 11 est supérieur à ceux

[]Sélectionnez les éléments suivants

?⍨52 mélanger les 52 premiers entiers (choisir 52 entiers aléatoires dans un sac des 52 premiers entiers)

⎕UCS convertir en symboles correspondants dans le U nicode C haracter S et


Version 16.0 (actuellement en version bêta) (33 caractères)

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

()Sur le tableau suivant

⍳62 62 premiers entiers

16| module 16

180∨ GCD de 180 et que

11> si 11 est supérieur à ceux

 indices où True

127136+ ajouter 127136 à cela

[]Sélectionnez les éléments suivants

?⍨52 mélanger les 52 premiers entiers (choisir 52 entiers aléatoires dans un sac des 52 premiers entiers)

⎕UCS convertir en symboles correspondants dans le U nicode C haracter S et


Ancienne solution

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

()Sur le tableau suivant

⍳14 les 14 premiers entiers

12~⍨ sauf 12

()∘., Concaténé cartésien à

  ⍳4 les 4 premiers entiers

  9+ ajouté à 9

, défiler (aplatir)

16⊥¨ évaluer chacun en base 16

126976+ ajouter 126976 à cela

[]Sélectionnez les éléments suivants

?⍨52 mélanger les 52 premiers entiers (choisir 52 entiers aléatoires dans un sac des 52 premiers entiers)

⎕UCS convertir en symboles correspondants dans le U nicode C haracter S et


3

Fusain , 50 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Crée la chaîne des 64 caractères du bloc mais filtre les cartes invalides car elles sont sélectionnées au hasard. (En parlant de cela, la sélection aléatoire sans remplacement d'une chaîne n'est que de 11 octets, contre 17 pour un tableau.)

Edit: la soustraction d'un tableau et d'autres améliorations de charbon de bois ont réduit la taille à 41 octets: essayez-le en ligne!


2

Alice , 34 octets

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

Essayez-le en ligne!

Explication

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

2

> <> , 49 50 49 octets

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

Essayez-le en ligne!

(+1 octet pour améliorer le caractère aléatoire)

J'interprète "aléatoire" comme signifiant "chaque résultat possible a une probabilité non nulle". Ce n'est pas une distribution uniforme.

Ce code comporte deux étapes. Tout d'abord, le poisson met toutes les cartes sur la pile, en utilisant les deux premières lignes. En commençant par l'as de pique, le poisson le duplique et l'incrémente, puis vérifie si le code hexadécimal de la carte précédente se termine par 0, C ou F en multipliant ensemble x  ( x -12) ( x -15), où x est le mod de code de char 16, et vérifier si c'est zéro. Si c'est le cas, il supprime la carte incriminée de la pile. Il se répète jusqu'à ce que la pile ait 52 cartes, puis nage dans l'étape 2:

  v
{>x
o^>l?!;

Ce morceau de code mélange et imprime la pile. Le xdéfinit la direction du poisson au hasard:

  • Si le poisson nage, il touche le vet retourne au xsans rien faire. La direction gauche est similaire.
  • Si le poisson nage à droite, il s'enroule et frappe le {, faisant pivoter toute la pile vers la gauche, puis revient à lax .
  • Si le poisson nage vers le bas, il imprime la carte à l'avant de la pile puis retourne au x.

Il est clair que toutes les commandes possibles des cartes peuvent être produites: à tout moment de l'étape 2, chaque carte qui n'a pas encore été imprimée peut être imprimée ensuite si le poisson nage suffisamment à droite. Cette technique de brassage ne déplace généralement pas les cartes très loin les unes des autres si elles sont déjà proches les unes des autres, mais là encore, le brassage à la main ne le fait pas non plus .


2

R, 61 octets

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

Échantillonnez au hasard le vecteur de représentations entières des valeurs unicodes des cartes (qui peuvent être obtenues à partir de utf8ToInt()fucntion) et supprimez les cartes chevalier / joker indésirables.



1

C # ( 146 141 octets)

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

Démo en ligne

Cela utilise un style extrêmement mauvais dans le mélange Guid.NewGuid(), mais c'est du code-golf. Il crée ensuite manuellement les paires de substitution.


Est-ce que cela fonctionne réellement? Chaque fois que j'essayais de lancer l'int. Dynamique sur un caractère, cela levait une exception?
TheLethalCoder

@TheLethalCoder, je n'ai pas de valeurs dynamiques. Mais comme preuve que cela fonctionne, j'ai joint un lien Ideone.
Peter Taylor

Je voulais dire l'int créé pour la deuxième partie de la paire de substitution.
TheLethalCoder

Vous pouvez enregistrer un octet en
n'incluant

Dit 147 octets, se lit comme 146
Neil A.

0

Perl 5, 75 octets

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

Notez que cela utilise les points de code pour les reines comme indiqué dans la question (c'est-à-dire le dernier chiffre C). Pour les points de code réels (dernier chiffre D), remplacez 51,56par 47,52.


0

Java 8, 216 octets

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

Explication:

Essayez-le ici.

REMARQUE: non testé car même si j'ai installé la police liée, je vois toujours des cases. Dois probablement redémarrer mon PC ou quelque chose ..

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


0

Japt , 51 41 39 22 octets

Avec une certaine inspiration de la solution Jelly de Jonathan .

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

Essayez-le (ou affichez la sortie avec une augmentationfont-size )


Explication

#?                         :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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.