Cetak setumpuk kartu yang dikocok

23

Memasukkan

Tidak ada

Keluaran

52 kartu. Tidak ada duplikat. Kartu direpresentasikan sebagai karakter unicode mereka, misalnya 🂹.

The Unicode codepoints mengikuti format berikut:

  • Tiga digit pertama adalah 1F0.
  • Digit berikutnya adalah A, B, C, atau Duntuk sekop, hati, berlian, dan klub masing-masing.
  • Digit berikutnya adalah 1melalui Cdan Euntuk berbagai nomor / kartu wajah. 1adalah ace, 2- Aadalah kartu nomor, dan B, D, dan Eadalah jack, queen, dan king masing-masing. ( CAdalah ksatria, yang tidak ada di kebanyakan deck.)

Contoh output:

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

Aturan:

  • Ini adalah . Jawaban terpendek menang.
  • Celah terlarang dilarang.
  • Dek Anda harus benar-benar acak. Jika dijalankan 20 kali, 20 output acak (dan kemungkinan besar unik) harus dihasilkan.

Catatan

Jika Anda hanya melihat kotak, instal font DejaVu .

dkudriavtsev
sumber
2
Bisakah ada spasi di antara masing-masing karakter?
totallyhuman
3
Saya pikir maksud Anda itu harus acak dan bahwa semua permutasi harus memiliki probabilitas nol kejadian.
Notts90
4
Siapa lagi yang melihat banyak kotak?
SuperJedi224
1
@Mendeleev Anda juga harus memposting peringatan bahwa unduhan itu hampir satu gigabyte!
Noodle9
2
Jika Anda hanya melihat kotak, instal font Noto Google. Ya, saya tidak bisa melakukan itu di telepon saya ...
Dennis

Jawaban:

9

Jelly ,  25 23  21 byte

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

Tautan niladik yang mengembalikan daftar karakter, atau program lengkap yang mencetak dek yang dikocok.

Cobalah online!

Bagaimana?

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
sumber
4
Mengapa selalu Jelly yang melakukan sihir ini?
Gryphon - Reinstate Monica
8

JavaScript (ES6), 107 106 108 byte

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

-1 byte terima kasih @nderscore


JavaScript (ES6), 120 119 121 byte

Versi sebelumnya.

a=[],[...'ABCD'].map(S=>[...'123456789ABCE'].map(N=>a.splice(Math.random()*-~a.length|0,0,eval("'\\u\{1F0"+S+N+"}'")))),a
Darrylyeo
sumber
Wah, tidak pernah terlihat [...'ABCD']sebelumnya. Itu keren :)
Steve Bennett
@SteveBennett Memang! Sangat menyenangkan bahwa string dapat diubah oleh char seperti itu. :)
darrylyeo
Tetapi Anda masih tidak bisa melakukan hal-hal seperti "ABCD".map(...). Saya yakin ada alasan masuk akal mengapa demikian.
Steve Bennett
@SteveBennett Ya, saya kira itu karena tidak jelas apakah metode seperti itu akan mengembalikan string atau array.
darrylyeo
1
Sangat bagus. Saya mengambil kebebasan memodifikasi cuplikan untuk output yang lebih grafis, tetapi jangan ragu untuk mengembalikannya.
Arnauld
7

Python 3 ,  106  94 byte

-5 byte terima kasih kepada musicman523 (1. digunakan sample(...,52)sebagai inline yang setara dengan shuffle[terima kasih untuk benar-benar manusiawi]; 2. gunakan ~v&2sebagai ganti v%4<2; ditambah 1 byte lebih lanjut sebagai konsekuensi karena ruang dapat dihilangkan)

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

Cobalah online!

Jonathan Allan
sumber
2
Yah saya tidak bisa mendapatkan solusi Python saya sendiri lebih baik, tapi saya punya Anda turun ke 97 menggunakan sepenuhnya manusia untuk sample. Cobalah online!
musicman523
1
Selain itu, Anda dapat mengubah v%4<2ke ~v&2untuk menyimpan satu byte lagi.
musicman523
Bagus sekali! Saya pikir mungkin randomfungsi lain bisa membantu di sana. Byte lain di atas seperti yang or ~...bisa or~....
Jonathan Allan
6

05AB1E , 22 21 byte

Disimpan 1 byte berkat carusocomputing .

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

Cobalah online!

Penjelasan

…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
sumber
1
…1F0A4£14L13KhJâ«Hç.runtuk 21 byte (diedit karena saya lupa menghapus ksatria). Apakah membantu Anda mengikat jeli.
Guci Gurita Ajaib
@carusocomputing: Ide bagus untuk mengerjakan kartesian sebelum penyatuan, jadi kita bisa melewatkan split. Terima kasih!
Emigna
6

Bash + coreutils, 56 byte

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

Kita gunakan printf untuk menulis setiap kartu pada barisnya sendiri, mengocok garis-garisnya, lalu menggabungkan semua garis dengan menghapus karakter baris baru.

Perhatikan bahwa meskipun printfperintah coreutils membutuhkan tepat 8 digit heksadesimal setelahnya \U, Bash bawaan printfmemungkinkan kita menghilangkan nol di depan.

Toby Speight
sumber
Saya sudah sejauh ini echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, tetapi milik Anda lebih baik. Saya tidak tahu %b.
Digital Trauma
1
@ Digital - saya juga tidak, sampai menulis jawaban ini!
Toby Speight
3

Python 3 , 112 byte

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

Cobalah online!

Anders Kaseorg
sumber
Bisakah Anda menjelaskan keajaiban yang terjadi dalam pernyataan del? Saya sudah mencoba mencari tahu dengan memecahnya menjadi tiga pernyataan berurutan, tapi akhirnya saya menghapus item yang salah dalam daftar. Misalnya, [:: 16] memberi saya satu kartu dan tiga unicodes yang tidak diinterpretasikan.
CCB60
The delpernyataan tidak rusak secara berurutan dari kiri ke kanan. Elemen pertama dari a[::16]adalah U + 1F0A0 MAIN KARTU KEMBALI, yang harus dihapus. Kita juga perlu menghapus kartu Knight dan Joker yang terjebak di antara 52 yang normal. Lihat en.wikipedia.org/wiki/… .
Anders Kaseorg
3

Python 3 , 107 byte

Disimpan 6 byte berkat @totallyhuman dan 3 terima kasih ke @ CCB60!

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

Cobalah online!

musicman523
sumber
Golf sedikit. Ini hanya valid jika spasi diizinkan sebagai pemisah.
totallyhuman
@totallyhuman menambahkan ,sep=''perbaikan spasi, tentu saja - tetapi membuatnya 112 byte
vroomfondel
Saya lupa tentang random.sample! Saya akan membiarkan OP memutuskan spasi. Saya dapat menambahkan ,sep=''untuk menghilangkannya, dan masih menyimpan 6 byte.
musicman523
chr (int (f'0x1F0 {a} {b} ', 16)) dapat disingkat 3 byte menjadi chr (int (' 0x1F0 '+ a + b, 16))
CCB60
@ CCB60 Saya bodoh. Tangkapan yang bagus
musicman523
3

PHP > = 7, 102 byte

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

Tidak ada Interpreter online tersedia untuk IntlChar :: chr metode

PHP , 112 byte

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

Cobalah online!

PHP , 116 byte

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

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

Cobalah online!

Jörg Hülsermann
sumber
3

APL (Dyalog) , 40 38 byte

Metode Jonathan Allan

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

(... )pada array berikut

⍳62 62 bilangan bulat pertama

127136+ tambahkan 127136 untuk itu

(... )/ filter itu dengan Boolean

  ⍳62 62 bilangan bulat pertama

  16| modulus 16

  180∨ GCD 180 dan itu

  11> apakah 11 lebih besar dari itu

[... ]pilih elemen berikut

?⍨52 kocok 52 integer pertama (pilih 52 integer acak dari tas 52 integer pertama)

⎕UCS dikonversi ke simbol yang sesuai di U nicode C haracter S et


Solusi Versi 16.0 (saat ini dalam versi beta) (33 karakter)

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

(... )pada array berikut

⍳62 62 bilangan bulat pertama

16| modulus 16

180∨ GCD 180 dan itu

11> apakah 11 lebih besar dari itu

 indeks mana Benar

127136+ tambahkan 127136 untuk itu

[... ]pilih elemen berikut

?⍨52 kocok 52 integer pertama (pilih 52 integer acak dari tas 52 integer pertama)

⎕UCS dikonversi ke simbol yang sesuai di U nicode C haracter S et


Solusi lama

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

(... )pada array berikut

⍳14 14 bilangan bulat pertama

12~⍨ kecuali 12

(... )∘., Disatukan dengan Cartesianly

  ⍳4 4 bilangan bulat pertama

  9+ ditambahkan ke 9

, ravel (ratakan) itu

16⊥¨ evaluasi masing-masing dalam basis 16

126976+ tambahkan 126976 untuk itu

[... ]pilih elemen berikut

?⍨52 kocok 52 integer pertama (pilih 52 integer acak dari tas 52 integer pertama)

⎕UCS dikonversi ke simbol yang sesuai di U nicode C haracter S et

Adm
sumber
3

Arang , 50 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Membuat string dari semua 64 karakter di blok tetapi menyaring kartu yang tidak valid karena mereka dipilih secara acak. (Omong-omong, pemilihan acak tanpa penggantian dari string hanya 11 byte, dibandingkan dengan 17 untuk array.)

Sunting: Pengurangan dari larik dan peningkatan Arang lainnya telah mengurangi ukuran menjadi 41 byte: Cobalah secara online!

Neil
sumber
2

Alice , 34 byte

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

Cobalah online!

Penjelasan

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

> <> , 49 50 49 byte

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

Cobalah online!

(+1 byte untuk membuat keacakan menjadi lebih baik)

Saya menafsirkan "acak" berarti "setiap hasil yang mungkin memiliki probabilitas tidak nol". Ini bukan distribusi yang seragam.

Ada dua tahap untuk kode ini. Pertama, ikan meletakkan semua kartu di tumpukan, menggunakan dua baris pertama. Dimulai dengan kartu as sekop, ikan menduplikasi dan menambahkannya, kemudian memeriksa apakah kode hex kartu sebelumnya berakhir dengan 0, C atau F dengan mengalikan bersama x  ( x -12) ( x -15), di mana x adalah mod kode sandi 16, dan memeriksa apakah itu nol. Jika ya, itu akan menghapus kartu yang menyinggung dari tumpukan. Itu berulang sampai tumpukan memiliki 52 kartu, lalu berenang ke tahap 2:

  v
{>x
o^>l?!;

Kode sedikit ini mengocok dan mencetak tumpukan. The xmenetapkan arah ikan secara acak:

  • Jika ikan berenang, itu mengenai vdan kembali ke xtanpa melakukan apa pun. Arah kiri serupa.
  • Jika ikan berenang dengan benar, ia membungkus dan mengenai {, memutar seluruh tumpukan ke kiri, lalu kembali kex .
  • Jika ikan berenang turun, ia mencetak kartu di bagian depan tumpukan kemudian kembali ke x.

Jelas bahwa setiap urutan kartu yang mungkin dapat diproduksi: pada titik mana pun di tahap 2, setiap kartu yang belum dicetak dapat dicetak berikutnya jika ikan berenang cukup ke kanan. Teknik pengocokan ini biasanya tidak memindahkan kartu dengan jarak yang sangat jauh jika mereka sudah saling berdekatan, tetapi sekali lagi, tidak juga pengocokan kartu dengan tangan .

Bukan pohon
sumber
2

R, 61 byte

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

Sampel secara acak vektor representasi bilangan bulat dari nilai kartu unicode (yang dapat diperoleh dari utf8ToInt()fucntion) dan lepaskan kartu ksatria / joker yang tidak diinginkan.

Andrew Haynes
sumber
57 byte
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))

Demo online

Ini menggunakan gaya yang sangat buruk dalam mengocok Guid.NewGuid(), tapi ini kode-golf. Itu kemudian membangun pasangan pengganti secara manual.

Peter Taylor
sumber
Apakah ini benar-benar berfungsi? Setiap kali saya mencoba memberikan int dinamis ke char, itu mengeluarkan pengecualian?
TheLethalCoder
@TheLethalCoder, saya tidak memiliki nilai dinamis. Tetapi sebagai bukti bahwa itu berhasil, saya telah melampirkan tautan Ideone.
Peter Taylor
Maksud saya int dibuat untuk bagian kedua dari pasangan pengganti.
TheLethalCoder
Anda dapat menyimpan byte dengan tidak menyertakan tanda titik koma
TheLethalCoder
Mengatakan 147 byte, dibaca sebagai 146
Neil A.
0

Perl 5, 75 byte

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

Perhatikan bahwa ini menggunakan titik kode untuk ratu seperti yang diberikan dalam pertanyaan (yaitu digit terakhir C). Untuk poin kode aktual (digit terakhir D), ganti 51,56dengan 47,52.

faubi
sumber
0

Java 8, 216 byte

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

Penjelasan:

Coba di sini.

CATATAN: Belum diuji karena meskipun saya sudah menginstal font yang ditautkan, saya masih melihat kotak. Mungkin harus me-restart PC saya atau sesuatu ..

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

Dyalog APL, 35 byte

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

berdasarkan jawaban Adám

menggunakan ⎕io←0

ngn
sumber
0

Japt , 51 41 39 22 byte

Dengan beberapa inspirasi dari solusi Jonathan's Jelly .

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

Cobalah (atau lihat output dengan peningkatanfont-size )


Penjelasan

#?                         :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
sumber