Imprimir um baralho de cartas aleatório

23

Entrada

Nenhum

Saída

52 cartões. Sem duplicatas. Os cartões são representados como caracteres unicode, por exemplo, 🂹.

Os pontos de código Unicode seguem o seguinte formato:

  • Os três primeiros dígitos são 1F0.
  • O próximo dígito é A, B, C, ou Dpara espadas, copas, ouros e paus, respectivamente.
  • O próximo dígito é 1através Ce Epara os vários números / cartões de face. 1é ace, 2- Asão os cartões do número, e B, De Esão o jack, rainha e rei respectivamente. ( Cé o cavaleiro, que não está na maioria dos decks.)

Exemplo de saída:

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

Regras:

  • Isso é . A resposta mais curta vence.
  • Falhas proibidas são proibidas.
  • Seu baralho deve ser realmente aleatório. Se executado 20 vezes, 20 saídas aleatórias (e provavelmente únicas) devem ser geradas.

Nota

Se você vir apenas caixas, instale as fontes DejaVu .

dkudriavtsev
fonte
2
Pode haver espaços entre cada personagem?
totallyhuman
3
Eu acho que você quer dizer que deve ser aleatório e que todas as permutações devem ter uma probabilidade zero de ocorrência.
precisa saber é o seguinte
4
Quem mais está vendo um monte de caixas?
SuperJedi224
1
@ Mendeleev, você também deve postar um aviso de que esse download é quase um gigabyte!
Noodle9
2
Se você vir apenas caixas, instale as fontes Noto do Google. Sim, eu não posso fazer isso no meu celular ...
Dennis

Respostas:

9

Geléia ,  25 23  21 bytes

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

Um link niládico retornando uma lista de caracteres ou um programa completo que imprime o baralho embaralhado.

Experimente online!

Quão?

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
fonte
4
Por que é sempre Jelly que faz essa mágica?
Gryphon - Restabelece Monica
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 graças a @nderscore


JavaScript (ES6), 120 119 121 bytes

Versão anterior.

a=[],[...'ABCD'].map(S=>[...'123456789ABCE'].map(N=>a.splice(Math.random()*-~a.length|0,0,eval("'\\u\{1F0"+S+N+"}'")))),a
darrylyeo
fonte
Whoa, nunca visto [...'ABCD']antes. Isso é legal :)
Steve Bennett
@SteveBennett Indeed! É bom que as strings sejam iteráveis ​​por char dessa maneira. :) #
5117 darrylyeo
Mas você ainda não pode fazer coisas como "ABCD".map(...). Tenho certeza de que existem razões razoáveis ​​para que esse seja o caso.
Steve Bennett
@SteveBennett Sim, eu acho que é porque é ambíguo se esse método retornaria uma string ou uma matriz.
darrylyeo
1
Muito legal. Tomei a liberdade de modificar o trecho para obter uma saída mais gráfica, mas sinta-se à vontade para reverter.
Arnauld
7

Python 3 ,  106  94 bytes

-5 bytes graças ao musicman523 (1. use sample(...,52)como um equivalente em linha a shuffle[graças a totallyhuman]; 2. use em ~v&2vez de v%4<2; mais um byte adicional como conseqüência, pois um espaço pode ser removido)

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

Experimente online!

Jonathan Allan
fonte
2
Bem, não consegui melhorar minha própria solução Python, mas reduzi a sua a 97 usando a opção de totalmente humano para sample. Experimente online!
musicman523
1
Além disso, você pode mudar v%4<2para ~v&2a salvar mais um byte.
musicman523
Bem feito! Eu pensei que talvez outra randomfunção pudesse ajudar lá. Outro byte no topo, como or ~...pode ser or~....
Jonathan Allan
6

05AB1E , 22 21 bytes

Economizou 1 byte graças à carusocomputação .

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

Experimente online!

Explicação

…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
fonte
1
…1F0A4£14L13KhJâ«Hç.rpor 21 bytes (editado porque esqueci de remover cavaleiros). No entanto, você ajuda a amarrar geléia.
Magic Octopus Urn
@carusocomputing: boa ideia fazer o cartesiano antes da concatenação, para que possamos pular a divisão. Obrigado!
Emigna 5/06
6

Bash + coreutils, 56 bytes

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

Usamos printfescrever cada cartão em sua própria linha, embaralhar as linhas e concatenar todas as linhas removendo os caracteres da nova linha.

Observe que, embora o printfcomando coreutils exija exatamente 8 dígitos hexadecimais depois \U, o Bash interno printfpermite omitir zeros à esquerda.

Toby Speight
fonte
Cheguei até aqui echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, mas a sua é melhor. Eu não sabia %b.
Digital Trauma
1
@ Digital - nem eu, até escrever esta resposta!
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='')

Experimente online!

Anders Kaseorg
fonte
Você pode explicar a mágica acontecendo na declaração del? Eu tenho tentado descobrir isso dividindo-o em três instruções sequenciais, mas acabo excluindo os itens errados na lista. Por exemplo, um [:: 16] me dá um cartão e três unicodes não interpretados.
CCB60
A deldeclaração se divide sequencialmente da esquerda para a direita. O primeiro elemento de a[::16]é U + 1F0A0 PLAYING CARD BACK, que deve ser excluído. Também precisamos excluir os cards de Cavaleiro e Coringa que estão presos entre os 52 normais. Veja en.wikipedia.org/wiki/… .
Anders Kaseorg
3

Python 3 , 107 bytes

Economizou 6 bytes graças a @totallyhuman e 3 graças a @ CCB60!

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

Experimente online!

musicman523
fonte
Jogou um pouco. Isso só é válido se espaços forem permitidos como separadores.
totallyhuman
@totallyhuman acrescentando ,sep=''corrige os espaços, é claro - mas torna-112 bytes
vroomfondel
Eu esqueci random.sample ! Vou deixar o OP decidir sobre os espaços. Posso adicionar ,sep=''para me livrar deles e ainda salvar 6 bytes.
musicman523
chr (int (f'0x1F0 {a} {b} ', 16)) pode ser reduzido em 3 bytes para chr (int (' 0x1F0 '+ a + b, 16))
CCB60
@ CCB60 Eu sou um tolo. Boa 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);

Nenhum Intérprete Online disponível para o 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);

Experimente online!

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

Experimente online!

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

Experimente online!

Jörg Hülsermann
fonte
3

APL (Dyalog) , 40 38 bytes

O método de Jonathan Allan

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

()Na seguinte matriz

⍳62 os primeiros 62 números inteiros

127136+ adicione 127136 a isso

(...)/  filtre isso com o valor booleano

  ⍳62 primeiros 62 números inteiros

  16| módulo 16

  180∨ GCD de 180 e que

  11> se 11 é maior do que aqueles

[...]Selecione os seguintes elementos

?⍨52 embaralhe os primeiros 52 números inteiros (escolha 52 números inteiros aleatórios de um saco dos primeiros 52 números inteiros)

⎕UCS converter de símbolos correspondentes no L nicode C haracter S et


Solução da versão 16.0 (atualmente em beta) (33 caracteres)

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

()Na seguinte matriz

⍳62 primeiros 62 números inteiros

16| módulo 16

180∨ GCD de 180 e que

11> se 11 é maior do que aqueles

 índices onde True

127136+ adicione 127136 a isso

[]Selecione os seguintes elementos

?⍨52 embaralhe os primeiros 52 números inteiros (escolha 52 números inteiros aleatórios de um saco dos primeiros 52 números inteiros)

⎕UCS converter de símbolos correspondentes a L nicode C haracter S et


Solução antiga

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

()Na seguinte matriz

⍳14 os primeiros 14 inteiros

12~⍨ exceto 12

()∘., Cartesianly concatenado a

  ⍳4 os primeiros 4 inteiros

  9+ adicionado a 9

, andar (achatar) que

16⊥¨ avaliar cada um na base 16

126976+ adicione 126976 a isso

[]Selecione os seguintes elementos

?⍨52 embaralhe os primeiros 52 números inteiros (escolha 52 números inteiros aleatórios de um saco dos primeiros 52 números inteiros)

⎕UCS converter de símbolos correspondentes a L nicode C haracter S et

Adão
fonte
3

Carvão , 50 bytes

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

Experimente online!Link é a versão detalhada do código. Cria a sequência de todos os 64 caracteres no bloco, mas filtra os cartões inválidos à medida que são selecionados aleatoriamente. (Falando nisso, a seleção aleatória sem substituição de uma string é de apenas 11 bytes, em comparação com 17 para uma matriz.)

Edit: Subtração de uma matriz e outras melhorias no carvão reduziram o tamanho para 41 bytes: Experimente online!

Neil
fonte
2

Alice , 34 bytes

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

Experimente online!

Explicação

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

> <> , 49 50 49 bytes

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

Experimente online!

(+1 byte para melhorar a aleatoriedade)

Estou interpretando "aleatório" para significar "todo resultado possível tem uma probabilidade diferente de zero". Esta não é uma distribuição uniforme.

Existem dois estágios nesse código. Primeiro, o peixe coloca todas as cartas na pilha, usando as duas primeiras linhas. Começando com o ás de espadas, o peixe o duplica e incrementa, depois verifica se o código hexadecimal da carta anterior termina em 0, C ou F multiplicando x  ( x -12) ( x -15), onde x é o código do mod. 16 e verificando se é zero. Se estiver, exclui o cartão incorreto da pilha. Ele se repete até que a pilha tenha 52 cartas e depois entra no estágio 2:

  v
{>x
o^>l?!;

Esse pedaço de código embaralha e imprime a pilha. A xdefine a orientação do peixe aleatoriamente:

  • Se o peixe nada, ele bate no ve volta ao peixe xsem fazer nada. A direção esquerda é semelhante.
  • Se o peixe nadar para a direita, ele envolve e bate no {, girando toda a pilha para a esquerda e depois volta para ox .
  • Se o peixe nada, ele imprime o cartão na frente da pilha e volta ao x.

Está claro que todas as ordens possíveis dos cartões podem ser produzidas: a qualquer momento do estágio 2, todos os cartões que ainda não foram impressos podem ser impressos a seguir, se o peixe nadar para a direita várias vezes. Essa técnica de embaralhar geralmente não move as cartas muito distantes se elas já estavam próximas uma da outra, mas, novamente, nem a embaralhamento manual .

Não é uma árvore
fonte
2

R, 61 bytes

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

Amostra aleatoriamente o vetor de representações inteiras dos valores unicode dos cartões (que podem ser obtidos a partir da função utf8ToInt()) e remova os cartões indesejados de cavaleiro / coringa.

Andrew Haynes
fonte
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))

Demonstração online

Isso usa um estilo extremamente ruim ao embaralhar Guid.NewGuid(), mas é um código de golfe. Em seguida, cria os pares substitutos manualmente.

Peter Taylor
fonte
Isso realmente funciona? Sempre que eu tentava converter a dinâmica int em um char, isso lançava uma exceção?
TheLethalCoder 6/06
@TheLethalCoder, não tenho valores dinâmicos. Mas, como prova de que funciona, anexei um link Ideone.
Peter Taylor
Eu quis dizer o int criado para a segunda parte do par substituto.
TheLethalCoder
Você pode salvar um byte por não incluir o ponto e vírgula à direita
TheLethalCoder
Diz 147 bytes, diz o 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

Observe que isso usa os pontos de código para rainhas, conforme indicado na pergunta (ou seja, último dígito C). Para os pontos de código reais (último dígito D), substitua 51,56por 47,52.

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

Explicação:

Experimente aqui.

NOTA: Não testado porque, embora eu tenha instalado a fonte vinculada, ainda vejo caixas. Provavelmente tem que reiniciar meu PC ou algo assim ..

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
fonte
0

Dyalog APL, 35 bytes

⎕ucs(∊127150+(16×⍳4)-⊂2~⍨⍳14)[?⍨52]

baseado em resposta de Adám

usa ⎕io←0

ngn
fonte
0

Japt , 51 41 39 22 bytes

Com alguma inspiração da solução de Jonathan's Jelly .

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

Experimente (ou visualize a saída com maiorfont-size )


Explicação

#?                         :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
Shaggy
fonte