Wydrukuj potasowaną talię kart


23

Wkład

Żaden

Wydajność

52 karty. Bez duplikatów. Karty są reprezentowane jako ich znaki Unicode, np. 🂹.

Punkty kodowe Unicode mają następujący format:

  • Pierwsze trzy cyfry to 1F0.
  • Następna cyfra jest A, B, C, lub Dna pik, kier, karo i klubów odpowiednio.
  • Następna cyfra jest 1przez Ci Edla różnych liczb / figury. 1jest asem, 2- Ato numer karty, a B, Di Eto walet, dama, król i odpowiednio. ( Cto rycerz, którego nie ma w większości pokładów.)

Przykładowe dane wyjściowe:

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

Zasady:

  • To jest . Najkrótsza odpowiedź wygrywa.
  • Zabronione są luki .
  • Twoja talia musi być w rzeczywistości losowa. W przypadku uruchomienia 20 razy należy wygenerować 20 losowych (i najprawdopodobniej unikatowych) wyników.

Uwaga

Jeśli widzisz tylko pola, zainstaluj czcionki DejaVu .


2
Czy między znakami mogą znajdować się spacje?
— całkowicieludzki

3
Myślę, że masz na myśli, że powinien być losowy i że wszystkie permutacje powinny mieć zerowe prawdopodobieństwo wystąpienia.
— Notts90

4
Kto jeszcze widzi kilka pudeł?
— SuperJedi224

1
@Mendeleev powinien również opublikować ostrzeżenie, że pobieranie to prawie gigabajt!
— Noodle9

2
Jeśli widzisz tylko pola, zainstaluj czcionki Google Noto. Tak, nie mogę tego zrobić na telefonie ...
— Dennis

Odpowiedzi:


9

Galaretka ,  25 23  21 bajtów

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

Niladyczny link zwracający listę znaków lub pełny program, który drukuje potasowaną talię.

Wypróbuj online!

W jaki sposób?

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
Dlaczego to zawsze galaretka robi tę magię?
— Gryphon - Przywróć Monikę

8

JavaScript (ES6), 107 106 108 bajtów

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

-1 bajt dzięki @nderscore


JavaScript (ES6), 120 119 121 bajtów

Poprzednia wersja.

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

Whoa, nigdy [...'ABCD']wcześniej nie widziałem . Fajnie :)
— Steve Bennett

@SteveBennett Rzeczywiście! Fajnie, że ciągi są powtarzalne przez char tak. :)
— darrylyeo

Ale nadal nie możesz robić takich rzeczy "ABCD".map(...). Jestem pewien, że istnieją rozsądne powody, dla których tak jest.
— Steve Bennett,

@ SteveBennett Tak, zgaduję, że to dlatego, że nie jest jasne, czy taka metoda zwróci ciąg znaków lub tablicę.
— darrylyeo

1
Bardzo fajny. Pozwoliłem sobie zmodyfikować fragment kodu, aby uzyskać bardziej graficzny wynik, ale mogę go wycofać.
— Arnauld

7

Python 3 ,  106  94 bajty

-5 bajtów dzięki musicman523 (1. użyj sample(...,52)jako wbudowanego odpowiednika shuffle[dzięki całkowicie ludzki]; 2. użyj ~v&2zamiast v%4<2; plus dodatkowy 1 bajt w konsekwencji, ponieważ spacja może zostać usunięta)

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

Wypróbuj online!


2
Cóż, nie byłem w stanie uzyskać własnego rozwiązania w języku Python, ale obniżyłem twoje do 97, używając przełącznika całkowicie ludzkiego sample. Wypróbuj online!
— musicman523

1
Dodatkowo możesz zmienić v%4<2na, ~v&2aby zapisać jeszcze jeden bajt.
— musicman523

Ładnie wykonane! Myślałem, że może inna randomfunkcja może w tym pomóc. Kolejny bajt na górze, jak or ~...może być or~....
— Jonathan Allan

6

05AB1E , 22 21 bajtów

Zaoszczędzono 1 bajt dzięki carusocomputing .

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

Wypróbuj online!

Wyjaśnienie

…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ç.rza 21 bajtów (edytowane, ponieważ zapomniałem usunąć rycerzy). Pomaga jednak zawiązać galaretkę.
— Magic Octopus Urn

@carusocomputing: Dobrze jest zrobić kartezjańskie przed konkatenacją, abyśmy mogli pominąć podział. Dzięki!
— Emigna,

6

Bash + coreutils, 56 bajtów

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

Używamy printfdo zapisywania każdej karty w osobnej linii, tasowania linii, a następnie łączenia wszystkich linii poprzez usunięcie znaków nowej linii.

Zauważ, że chociaż printfpolecenie coreutils wymaga dokładnie 8 cyfr szesnastkowych po \U, wbudowane w Bash printfpozwala nam pominąć wiodące zera.


Dotarłem tak daleko echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, ale twój jest lepszy. Nie wiedziałam o tym %b.
— Cyfrowy uraz

1
@Digital - ja też, dopóki nie napisałem tej odpowiedzi!
— Toby Speight,

3

Python 3 , 112 bajtów

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

Wypróbuj online!


Czy potrafisz wyjaśnić magię, która dzieje się w instrukcji del? Próbowałem to rozgryźć, dzieląc na trzy sekwencyjne instrukcje, ale w końcu usuwam niewłaściwe elementy z listy. Na przykład [:: 16] daje mi jedną kartę i trzy niezinterpretowane Unicode.
— CCB60,

delOświadczenie nie załamać kolejno od lewej do prawej. Pierwszym elementem a[::16]jest U + 1F0A0 ODTWARZANIE KARTY, które należy usunąć. Musimy również usuwać karty Rycerz i Joker które utknęły pomiędzy normalnym 52. Zobacz en.wikipedia.org/wiki/... .
— Anders Kaseorg,

3

Python 3 , 107 bajtów

Zaoszczędź 6 bajtów dzięki @totallyhuman i 3 dzięki @ CCB60!

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

Wypróbuj online!


Grałem trochę w golfa. Jest to poprawne tylko wtedy, gdy spacje są dozwolone jako separatory.
— całkowicieludzki

@ totalnie ludzkie dodawanie ,sep=''naprawia spacje, oczywiście - ale sprawia, że ​​112 bajtów
— vroomfondel

Zapomniałem random.sample! Pozwolę OP decydować o spacjach. Mogę dodać, ,sep=''aby się ich pozbyć i nadal oszczędzać 6 bajtów.
— musicman523

chr (int (f'0x1F0 {a} {b} ', 16)) można skrócić o 3 bajty do chr (int (' 0x1F0 '+ a + b, 16))
— CCB60

@ CCB60 Jestem głupcem. Dobry chwyt
— musicman523

3

PHP > = 7, 102 bajtów

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

Nie Online Interpreter dostępne dla IntlChar :: chr metoda

PHP , 112 bajtów

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

Wypróbuj online!

PHP , 116 bajtów

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

Wypróbuj online!

PHP, 121 bajtów

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

Wypróbuj online!


3

APL (Dyalog) , 40 38 bajtów

Metoda Jonathana Allana

⎕UCS((11>180∨16|⍳62)/127136+⍳62)[?⍨52]

(… )W poniższej tablicy

 ⍳62 pierwsze 62 liczby całkowite

 127136+ dodaj do tego 127136

 (… )/ Odfiltruj to za pomocą logiki

  ⍳62 pierwszych 62 liczb całkowitych

  16| moduł 16

  180∨ GCD 180 i tym

  11> czy 11 jest większe niż te

[… ]Wybierz następujące elementy

 ?⍨52 przetasuj pierwsze 52 liczby całkowite (wybierz 52 losowe liczby całkowite z torby pierwszych 52 liczb całkowitych)

⎕UCS przekształcić do odpowiednich symboli w U nicode C haracter S i


Wersja 16.0 (obecnie w wersji beta) (33 znaki)

⎕UCS(127136+⍸11>180∨16|⍳62)[?⍨52]

(… )W poniższej tablicy

 ⍳62 pierwszych 62 liczb całkowitych

 16| moduł 16

 180∨ GCD 180 i tym

 11> czy 11 jest większe niż te

 ⍸ indeksy gdzie Prawda

 127136+ dodaj do tego 127136

[… ]Wybierz następujące elementy

 ?⍨52 przetasuj pierwsze 52 liczby całkowite (wybierz 52 losowe liczby całkowite z torby pierwszych 52 liczb całkowitych)

⎕UCS przekształcić do odpowiednich symboli w U nicode C haracter S i


Stare rozwiązanie

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

(… )W poniższej tablicy

 ⍳14 pierwsze 14 liczb całkowitych

 12~⍨ z wyjątkiem 12

 (… )∘., Kartezjańsko połączone

  ⍳4 pierwsze 4 liczby całkowite

  9+ dodano do 9

 , ravel (spłaszcz) to

 16⊥¨ ocenić każdy w bazie 16

 126976+ dodaj do tego 126976

[… ]Wybierz następujące elementy

 ?⍨52 przetasuj pierwsze 52 liczby całkowite (wybierz 52 losowe liczby całkowite z torby pierwszych 52 liczb całkowitych)

⎕UCS przekształcić do odpowiednich symboli w U nicode C haracter S i


3

Węgiel drzewny , 50 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Tworzy ciąg wszystkich 64 znaków w bloku, ale odfiltrowuje nieprawidłowe karty, ponieważ są one losowo wybierane. (Mówiąc o tym, losowy wybór bez zamiany z ciągu to tylko 11 bajtów, w porównaniu do 17 dla tablicy.)

Edycja: Odejmowanie od tablicy i inne ulepszenia węgla drzewnego zmniejszyły rozmiar do 41 bajtów: Wypróbuj online!


2

Alice , 34 bajty

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

Wypróbuj online!

Wyjaśnienie

'?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 bajtów

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

Wypróbuj online!

(+1 bajt, aby poprawić losowość)

Interpretuję „losowy” w ten sposób, że „każdy możliwy wynik ma niezerowe prawdopodobieństwo”. To nie jest jednolity rozkład.

Kod składa się z dwóch etapów. Najpierw ryba kładzie wszystkie karty na stosie, używając pierwszych dwóch linii. Zaczynając od asa pik, ryba powiela się i zwiększa, a następnie sprawdza, czy kod szesnastkowy poprzedniej karty kończy się na 0, C lub F, mnożąc razem x  ( x -12) ( x -15), gdzie x to mod charcode 16 i sprawdzanie, czy to zero. Jeśli tak, to usuwa wykraczającą kartę ze stosu. Powtarza się, aż stos ma 52 karty, a następnie przechodzi do etapu 2:

  v
{>x
o^>l?!;

Ten fragment kodu tasuje i drukuje stos. xWyznacza kierunek ryba jest losowo:

  • Jeśli ryba płynie, uderza w vi wraca do xniczego, nie robiąc nic. Lewy kierunek jest podobny.
  • Jeśli ryba płynie w prawo, owija się i uderza {, obracając cały stos w lewo, a następnie wraca do x.
  • Jeśli ryba popłynie w dół, drukuje kartę z przodu stosu, a następnie wraca do x.

Oczywiste jest, że można wyprodukować każdą możliwą kolejność kart: w dowolnym momencie etapu 2 każda karta, która nie została jeszcze wydrukowana, może zostać wydrukowana jako następna, jeśli ryba przepłynie wystarczająco dużo razy w prawo. Ta technika tasowania zwykle nie rozsuwa kart bardzo daleko od siebie, jeśli były już blisko siebie, ale z drugiej strony nie tasuje się też ręcznie .


2

R, 61 bajtów

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

Próbkuj losowo wektor reprezentacji liczb całkowitych wartości Unicode kart (które można uzyskać z utf8ToInt()Fucntion) i usuń niechciane karty rycerzy / jokerów.



1

C # ( 146 141 bajtów)

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

Demo online

Używa to bardzo złego stylu w tasowaniu Guid.NewGuid(), ale jest to gra w golfa. Następnie ręcznie buduje pary zastępcze.


Czy to naprawdę działa? Ilekroć próbowałem rzutować dynamiczny int na char, rzucał wyjątek?
— TheLethalCoder

@TheLethalCoder, nie mam żadnych wartości dynamicznych. Ale jako dowód, że to działa, podłączyłem link Ideone.
— Peter Taylor,

Miałem na myśli int stworzony dla drugiej części pary zastępczej.
— TheLethalCoder,

Możesz zapisać bajt, nie włączając średnika końcowego
— TheLethalCoder

Mówi 147 bajtów, brzmi jak 146
— Neil A.

0

Perl 5, 75 bajtów

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

Zauważ, że używa to punktów kodowych dla królowych, jak podano w pytaniu (tj. Ostatniej cyfrze C). Dla rzeczywistych punktów kodowych (ostatnia cyfra D), wymienić 51,56się 47,52.


0

Java 8, 216 bajtów

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

Wyjaśnienie:

Wypróbuj tutaj.

UWAGA: Niesprawdzone, ponieważ mimo że zainstalowałem połączoną czcionkę, nadal widzę pola. Prawdopodobnie muszę ponownie uruchomić komputer lub coś w tym stylu…

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 bajtów

Z pewną inspiracją z galaretki Jonathana .

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

Wypróbuj (lub wyświetl wynik ze zwiększonymfont-size )


Wyjaśnienie

#?                         :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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.