Karışık bir desteden kart alın


23

Giriş

Yok

Çıktı

52 kart. Kopya yok. Kartlar unicode karakterleri ile temsil edilir, örneğin 🂹.

Unicode codepoints aşağıdaki biçimi aşağıdaki gibidir:

  • İlk üç rakam 1F0.
  • Bir sonraki rakamdır A, B, C, veya Dsırasıyla maça, kupa, karo ve kulüpleri için.
  • Bir sonraki rakamdır 1yoluyla Cve Eçeşitli numaralar / yüz kartları için. 1ace vardır 2- Asayı kartları ve B, Dve Ekriko, kraliçe ve kral sırasıyla. ( CÇoğu güvertede olmayan şövalyedir.)

Örnek çıktı:

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

Kurallar:

  • Bu . En kısa cevap kazanır.
  • Yasak boşluklar yasaktır.
  • Güverten gerçekten rastgele olmalı. 20 kez çalıştırılırsa, 20 rasgele (ve büyük olasılıkla benzersiz) çıktılar üretilmelidir.

Not

Yalnızca kutuları görürseniz , DejaVu yazı tiplerini yükleyin .


2
Her karakter arasında boşluk olabilir mi?
tamamen insan

3
Bence bunun rasgele olması gerektiğini ve tüm permütasyonların sıfır olma ihtimalinin hiç olmaması gerektiğini söylüyorsunuz.
Notts90

4
Başka kim bir demet kutu görüyor?
SuperJedi224

1
@Mendeleev ayrıca indirme işleminin neredeyse bir gigabayt olduğuna dair bir uyarı göndermelidir!
Noodle9

2
Yalnızca kutular görürseniz, Google’ın Noto yazı tiplerini yükleyin. Evet, bunu telefonumda yapamam ...
Dennis

Yanıtlar:


9

Jöle ,  25 23  21 bayt

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

Karakter listesini döndüren niladik bir bağlantı veya karıştırılmış desteyi basan tam bir program.

Çevrimiçi deneyin!

Nasıl?

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
Bu sihri yapan neden hep Jelly?
Gryphon - Monica

8

JavaScript (ES6), 107 106 108 bayt

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

@Nderscore sayesinde -1 bayt


JavaScript (ES6), 120 119 121 bayt

Önceki versiyon.

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

Whoa, daha [...'ABCD']önce hiç görmedim . Çok havalı :)
Steve Bennett

@ SteveBennett Nitekim! Tellerin böyle karakterlerle yinelenebilir olması güzel. :)
darrylyeo

Ama hala böyle şeyler yapamazsın "ABCD".map(...). Bunun böyle olmasının makul nedenleri olduğuna eminim.
Steve Bennett

@SteveBennett Evet, sanırım böyle bir yöntemin bir dizge mi yoksa bir dizi mi döndüreceği belirsizdir.
darrylyeo

1
Çok güzel bir tane. Snippet'i daha grafik bir çıktı için değiştirme özgürlüğünü aldım, ancak geri dönmekten çekinmeyin.
Arnauld,

7

Python 3 ,  106  94 bayt

Müzisyen523 sayesinde -5 bayt (1. [tamamen insanlık sayesinde] sample(...,52)eşdeğer bir satır içi shufflekullanın; 2. ~v&2yerine kullanın v%4<2; artı bir boşluk olarak sonuç olarak 1 bayt daha kullanın )

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

Çevrimiçi deneyin!


2
Daha önce kendi Python çözümümü daha iyi elde edemedim, ama 97'sini tamamen insanın geçişini kullanarak indirdim sample. Çevrimiçi deneyin!
musicman523

1
Ayrıca, değiştirebilir v%4<2için ~v&2bir byte daha kaydedin.
musicman523

Güzel bitti! randomOrada başka bir fonksiyonun işe yarayabileceğini düşünmüştüm . Üstünde başka bayt olarak or ~...olabilir or~....
Jonathan Allan,

6

05AB1E , 22 21 bayt

Carusocomputing sayesinde 1 bayt kaydedildi .

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

Çevrimiçi deneyin!

açıklama

…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ç.r21 bayt için (şövalyeleri kaldırmak unuttum çünkü düzenlendi). Yine de jöleyi bağlamana yardımcı olur.
Magic Octopus Urn,

@ carusocomputing: Birleştirmeden önce kartezyen yapmak iyi bir fikir, böylelikle bölmeyi atlayabiliriz. Teşekkürler!
Emigna

6

Bash + coreutils, 56 bayt

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

printfHer kartı kendi satırına yazmak için kullanırız , satırları karıştırır, ardından yeni satır karakterlerini kaldırarak tüm satırları birleştiririz.

Coreutils printfkomutundan sonra tam olarak onaltılık basamak gerektirse de \U, Bash yerleşikinin printfbaştaki sıfırları atlamamıza izin verdiğini unutmayın .


Ben kadarıyla aldım echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, ama seninki daha iyi. Bilmiyordum %b.
Dijital Travma

1
@Digital - Ben de cevap vermedim.
Toby Speight

3

Python 3 , 112 bayt

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

Çevrimiçi deneyin!


Del'in açıklamasındaki büyüyü açıklayabilir misin? Bunu üç ardışık ifadeye bölerek çözmeye çalıştım, ancak listedeki yanlış öğeleri sildim. Örneğin, bir [:: 16] bana bir kart ve üç yorumlanmamış unicodes veriyor.
CCB60

delİfadesi sağa soldan sıralı yıkmak gelmez. Bunlardan ilki a[::16], silinmesi gereken U + 1F0A0 OYUN KARTI GERİDİR. Ayrıca normal 52 arasına sıkışmış Knight ve Joker kartlarını da silmemiz gerekiyor . Bkz. En.wikipedia.org/wiki/… .
Anders Kaseorg

3

Python 3 , 107 bayt

@Totallyhuman ve 3 @ CCB60 sayesinde 6 bayt kurtarıldı!

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

Çevrimiçi deneyin!


Birazcık golf oynadım. Bu, ancak boşluklara ayırıcı olarak izin veriliyorsa geçerlidir.
tamamen insan

@totallyhuman ekleme ,sep=''boşlukları düzeltir, elbette - fakat 112 byte yapar
vroomfondel

Unuttum random.sample! OP'nin mekanlar hakkında karar vermesine izin vereceğim. ,sep=''Onlardan kurtulmak için ekleyebilirim ve hala 6 bayt tasarruf edebilirsiniz.
musicman523

chr (int (f'0x1F0 {a} {b} ', 16)) 3 byte ile chr (int (' 0x1F0 '+ a + b, 16))' ya kadar kısaltılabilir
CCB60

@ CCB60 Ben bir aptalım. İyi yakalamak
musicman523

3

PHP > = 7, 102 bayt

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

IntlChar :: chr yöntemi için çevrimiçi tercüman yok

PHP , 112 bayt

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

Çevrimiçi deneyin!

PHP , 116 bayt

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

Çevrimiçi deneyin!

PHP, 121 Bayt

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

Çevrimiçi deneyin!


3

APL (Dyalog) , 40 38 bayt

Jonathan Allan'ın yöntemi

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

()Aşağıdaki dizide

⍳62 ilk 62 tam sayı

127136+ 127136 buna ekle

()/ Boolean ile filtreleyin

  ⍳62 ilk 62 tam sayı

  16| modül 16

  180∨ 180 GCD ve

  11> 11'in ondan büyük olup olmadığı

[... ]aşağıdaki unsurları seçmek

?⍨52 ilk 52 tamsayının karıştırılması (ilk 52 tamsayının torbasından 52 rasgele tamsayı al)

⎕UCS karşılık gelen sembol dönüştürmek U nicode haracter S ve


Sürüm 16.0 (şu anda beta halinde) çözümü (33 karakter)

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

()Aşağıdaki dizide

⍳62 ilk 62 tam sayı

16| modül 16

180∨ 180 GCD ve

11> 11'in ondan büyük olup olmadığı

 endekslerin nerede

127136+ 127136 buna ekle

[... ]aşağıdaki unsurları seçmek

?⍨52 ilk 52 tamsayının karıştırılması (ilk 52 tamsayının torbasından 52 rasgele tamsayı al)

⎕UCS karşılık gelen sembol dönüştürmek U nicode haracter S ve


Eski çözüm

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

()Aşağıdaki dizide

⍳14 ilk 14 tam sayı

12~⍨ 12 hariç

()∘., Kartezyen olarak birleştirilmiş

  ⍳4 ilk 4 tam sayı

  9+ 9'a eklendi

, ravel (dümdüz)

16⊥¨ her birini taban 16'da değerlendirin

126976+ buna 126976 ekle

[... ]aşağıdaki unsurları seçmek

?⍨52 ilk 52 tamsayının karıştırılması (ilk 52 tamsayının torbasından 52 rasgele tamsayı al)

⎕UCS karşılık gelen sembol dönüştürmek U nicode haracter S ve


3

Kömür , 50 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Bloktaki tüm 64 karakterden oluşan bir dize oluşturur, ancak geçersiz kartları rasgele seçildiklerinde filtreler. (Bir dizgeden değiştirilmeden rastgele seçim, bir dizideki 17'ye kıyasla sadece 11 bayttır.)

Düzenleme: Bir diziden çıkarma ve diğer Kömür iyileştirmeleri, boyutu 41 bayta düşürdü: Çevrimiçi deneyin!


2

Alice , 34 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Çevrimiçi deneyin!

(Rastgelelığı daha iyi hale getirmek için +1 bayt)

"Rastgele" terimini, "olası her sonucun sıfır olmayan bir olasılığı olduğu" şeklinde yorumluyorum. Bu tek tip bir dağıtım değil.

Bu kodun iki aşaması vardır. İlk olarak, balık ilk iki satırı kullanarak tüm kartları istifin üzerine koyar. Maça ası ile başlayarak, balık onu çoğaltır ve arttırır, sonra önceki kartın hex kodunun 0, C veya F olarak çarpıp çarpmadığını kontrol eder ( x çarpı mod x , x  ( x -12) ( x -15), burada x 16 ve sıfır olup olmadığını kontrol ediyorum. Öyleyse, rahatsız edici kartı yığından siler. Stack 52 karta sahip olana kadar tekrar eder, sonra 2. aşamaya girer:

  v
{>x
o^>l?!;

Bu kod parçası yığını karıştırır ve yazdırır. xRastgele balığın yönünü ayarlar:

  • Balık yüzüyorsa, vurur vve xhiçbir şey yapmadan geri döner . Sol yön benzerdir.
  • Balık sağa doğru kayarsa, {kümenin tamamını sola döndürerek sararır ve vurur , sonra geri döner x.
  • Balık aşağıya doğru yüzüyorsa, kartı istifin ön kısmına yazdırır ve sonra geri döner x.

Kartların mümkün olan her siparişinin üretilebileceği açıktır: 2. aşamadaki herhangi bir noktada, balıklar yeterince doğru şekilde yüzüyorsa, henüz basılmamış her kart bir sonraki basılabilir. Bu karıştırma tekniği, zaten birbirlerine yakınlarsa, kartları genellikle birbirinden uzağa hareket ettirmez, ancak daha sonra, elle de karıştırmaz .


2

R, 61 bayt

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

Kartların tamsayı temsillerinin vektörünü rastgele örnekleme unicode değerleri ( utf8ToInt()fucntion'dan elde edilebilir ) ve istenmeyen şövalye / şakacı kartlarını çıkarın.



1

C # ( 146 141 bayt)

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

Çevrimiçi demo

Bu, karıştırmak için son derece kötü bir stil kullanır Guid.NewGuid(), ancak kod golfüdür. Daha sonra taşıyıcı çiftleri manuel olarak oluşturur.


Bu gerçekten işe yarıyor mu? Dinamik int'i bir karaktere dönüştürmeye çalıştığımda, bir istisna mı oldu?
TheLethalCoder

@TheLethalCoder, dinamik değerim yok. Ancak çalıştığının kanıtı olarak, bir Ideone bağlantısı ekledim.
Peter Taylor

Vekil çiftin ikinci kısmı için yaratılan int demek istedim.
TheLethalCoder

İzleyen noktalı virgül ekleyerek bir bayt kaydedebilirsiniz.
TheLethalCoder

147 bayt diyor, 146 olarak okuyor
Neil A.

0

Perl 5, 75 bayt

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

Bunun, soruda verilen kraliçelerin kod noktalarını kullandığını unutmayın (örneğin, son rakam C). Gerçek kod noktaları için (son hane D) 51,56ile değiştirin 47,52.


0

Java 8, 216 bayt

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

Açıklama:

Burada dene.

NOT: Test edilmedi çünkü bağlantılı fontu yüklememe rağmen hala kutuları görüyorum. Muhtemelen bilgisayarımı yeniden başlatmak zorunda kalacağım ..

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.