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.
  • Zabronioneluki .
  • 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>18016|⍳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>18016|⍳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.