Роздрукуйте перетасовану колоду карт


23

Вхідні дані

Немає

Вихід

52 картки. Дублікатів немає. Картки представлені у вигляді символів унікоду, наприклад 🂹.

У кодові Unicode наступний формат:

  • Перші три цифри є 1F0 .
  • Наступна цифра A, B, CабоD для лопати, черви, бубни і клуби відповідно.
  • Наступна цифра - 1через Cта Eдля різних номерів / лицьових карток. 1туз, 2- Aце кількість карт, і B, Dі Eє валет, дама і король відповідно. ( Cце лицар, якого немає в більшості колод.)

Приклад виводу:

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

Правила:

  • Це . Найкоротша відповідь виграє.
  • Заборонені лазівки заборонені.
  • Ваша колода повинна бути фактично рандомізованою. Якщо запустити 20 разів, необхідно генерувати 20 випадкових (і, швидше за все, унікальних) результатів.

Примітка

Якщо ви бачите лише вікна, встановіть шрифти DejaVu .


2
Чи можуть бути пробіли між кожним символом?
повністюлюдський

3
Я думаю, ви маєте на увазі, що це повинно бути випадковим і що всі перестановки повинні мати нульову ймовірність появи.
Notts90

4
Хто ще бачить купу коробок?
SuperJedi224

1
@Mendeleev також слід опублікувати попередження про те, що завантаження майже гігабайт!
Noodle9

2
Якщо ви бачите лише вікна, встановіть шрифти Noto від Google. Так, я не можу цього зробити на своєму телефоні ...
Денніс

Відповіді:


9

Желе ,  25 23  21 байт

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

Ніладичне посилання, що повертає список символів, або повну програму, яка друкує перетасовану колоду.

Спробуйте в Інтернеті!

Як?

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
Чому завжди Джелі робить цю магію?
Грифон - Відновіть Моніку

8

JavaScript (ES6), 107 106 108 байт

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

-1 байт завдяки @nderscore


JavaScript (ES6), 120 119 121 байт

Попередня версія.

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

О, ніколи [...'ABCD']раніше не бачив . Це круто :)
Стів Беннетт

@SteveBennett Дійсно! Приємно, що струни є ітерабельними подібними символами. :)
darrylyeo

Але ти все одно не можеш робити такі речі "ABCD".map(...). Я впевнений, що є розумні причини, чому це так.
Стів Беннетт

@SteveBennett Так, я думаю, це тому, що це неоднозначно, чи такий метод повертає рядок або масив.
darrylyeo

1
Дуже приємний. Я взяв на себе змогу змінити фрагмент для отримання більш графічного виводу, але не соромтесь відкатати.
Арнольд

7

Python 3 ,  106  94 байт

-5 байт завдяки musicman523 (1. використовувати sample(...,52)як вбудований еквівалент shuffle[завдяки абсолютно нелюдському]; 2. використовувати ~v&2замість v%4<2; плюс ще 1 байт, як наслідок, може бути видалено пробіл)

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

Спробуйте в Інтернеті!


2
Ну, я не зміг краще отримати своє власне рішення Python, але я звів ваш до 97, використовуючи повністю нелюдський перехід на sample. Спробуйте в Інтернеті!
musicman523

1
Крім того, ви можете змінити , v%4<2щоб ~v&2зберегти більше одного байта.
musicman523

Чудово зроблено! Я думав, може, randomтам може допомогти інша функція. Ще один байт на вершині , як or ~...може бути or~....
Джонатан Аллан

6

05AB1E , 22 21 байт

Збережено 1 байт завдяки carusocomputing .

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

Спробуйте в Інтернеті!

Пояснення

…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ç.rна 21 байт (відредаговано, бо я забув видалити рицарів). Чи допоможе вам зв’язати желе.
Magic Octopus Urn

@carusocomputing: Гарна ідея зробити декартовий перед конкатенацією, щоб ми могли пропустити розкол. Спасибі!
Емінья

6

Bash + coreutils, 56 байт

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

Ми використовуємо printf для того, щоб писати кожну карту у своєму окремому рядку, перетасовувати лінії, а потім з'єднувати всі рядки, видаляючи символи нового рядка.

Зауважте, що хоча команда coreutils printfвимагає рівно 8 шістнадцяткових цифр після \U, вбудована Bash printfдозволяє нам опускати провідні нулі.


Я зайшов echo 16iF09F8{2A,2B,38,39}{{1..9},A,B,D,E}0AP|dc|shuf|tr -d \\n, але ваш краще. Я про це не знав %b.
Цифрова травма

1
@Digital - ні я, поки не написав цю відповідь!
Toby Speight

3

Python 3 , 112 байт

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

Спробуйте в Інтернеті!


Чи можете ви пояснити магію, що відбувається у викладі del? Я намагався розібратися, розбивши його на три послідовні заяви, але я врешті-решт видалив неправильні елементи зі списку. Наприклад, [:: 16] дає мені одну карту і три неперетлумачені унікоди.
CCB60

delЗатвердження не ламається послідовно зліва направо. Перший елемент програми a[::16]- U + 1F0A0 ЗАГАЛЬНА КАРТКА НАЗАД, яку слід видалити. Нам також потрібно видалити картки Найт та Джокер, які застрягли між звичайними 52. Див. En.wikipedia.org/wiki/… .
Anders Kaseorg

3

Python 3 , 107 байт

Збережено 6 байт завдяки @totallyhuman та 3 подякам @ CCB60!

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

Спробуйте в Інтернеті!


Гольф це трохи. Це справедливо, лише якщо пробіли дозволені як роздільники.
повністюлюдський

@totallyhuman додавання ,sep=''виправляє пробіли, звичайно - але робить це 112 байтами
vroomfondel

Я забув про random.sample! Я дозволю ОП вирішувати про місця. Я можу додати, ,sep=''щоб позбутися від них, і все-таки зберегти 6 байт.
musicman523

chr (int (f'0x1F0 {a} {b} ', 16)) можна скоротити на 3 байти до chr (int (' 0x1F0 '+ a + b, 16))
CCB60

@ CCB60 Я дурень. Хороший улов
musicman523

3

PHP > = 7, 102 байти

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

Немає доступних Інтернет-перекладачів для методу IntlChar :: chr

PHP , 112 байт

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

Спробуйте в Інтернеті!

PHP , 116 байт

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

Спробуйте в Інтернеті!

PHP, 121 байт

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

Спробуйте в Інтернеті!


3

APL (Діалог) , 40 38 байт

Метод Джонатана Аллана

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

()На наступному масиві

⍳62 перші 62 цілих числа

127136+ додайте до цього 127136

(... )/ фільтруйте це за допомогою булева

  ⍳62 перші 62 цілих числа

  16| модуль 16

  180∨ GCD 180 і те

  11> чи на 11 більше, ніж у тих

[]Виберіть наступні елементи

?⍨52 перетасувати перші 52 цілі числа (вибрати 52 випадкових цілих числа з мішка з перших 52 цілих чисел)

⎕UCS перетворити в відповідні символи в U nicode З haracter S і ін


Рішення версії 16.0 (наразі знаходиться у бета-версії) (33 символи)

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

()На наступному масиві

⍳62 перші 62 цілих числа

16| модуль 16

180∨ GCD 180 і те

11> чи на 11 більше, ніж у тих

 індекси, де True

127136+ додайте до цього 127136

[]Виберіть наступні елементи

?⍨52 перетасувати перші 52 цілі числа (вибрати 52 випадкових цілих числа з мішка з перших 52 цілих чисел)

⎕UCS перетворити в відповідні символи в U nicode З haracter S і ін


Старе рішення

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

()На наступному масиві

⍳14 перші 14 цілих чисел

12~⍨ крім 12

(... )∘., декартові приєдналися до

  ⍳4 перші 4 цілих числа

  9+ додано до 9

, реве (згладити) те

16⊥¨ оцінюйте кожен у базі 16

126976+ додати 126976 до цього

[]Виберіть наступні елементи

?⍨52 перетасувати перші 52 цілі числа (вибрати 52 випадкових цілих числа з мішка з перших 52 цілих чисел)

⎕UCS перетворити в відповідні символи в U nicode З haracter S і ін


3

Вугілля деревне , 50 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Створює рядок з усіх 64 символів у блоці, але фільтрує недійсні картки, оскільки вони вибрані випадковим чином. (Якщо говорити про це, випадковий вибір без заміни рядка становить лише 11 байт, порівняно з 17 для масиву.)

Редагувати: віднімання з масиву та інші удосконалення деревного вугілля зменшили розмір до 41 байт: Спробуйте в Інтернеті!


2

Аліса , 34 байти

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

Спробуйте в Інтернеті!

Пояснення

'?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 байт

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

Спробуйте в Інтернеті!

(+1 байт, щоб покращити випадковість)

Я трактую "випадковий", щоб означати, "кожен можливий результат має ненульову ймовірність". Це не є рівномірним розподілом.

До цього коду є два етапи. Спочатку риба кладе всі картки на стек, використовуючи перші два рядки. Починаючи з туза лопат, риба дублює та збільшує її, потім перевіряє, чи закінчується шістнадцятковий код попередньої картки на 0, С або F шляхом множення разом x  ( x -12) ( x -15), де x - мод charcode 16, і перевірити, чи не дорівнює нулю. Якщо це так, він видаляє карту порушника зі стека. Він повторюється, поки стек не має 52 картки, а потім переходить на другий етап:

  v
{>x
o^>l?!;

Цей біт коду переміщується та друкує стек. Встановлює xнапрямок риби випадковим чином:

  • Якщо риба підпливає, вона б'є vі повертається до місця, xне роблячи нічого. Лівий напрямок схожий.
  • Якщо риба плаває вправо, вона загортається і б'є {, обертаючи всю стечку вліво, а потім повертається доx .
  • Якщо риба пливе вниз, вона роздруковує карту в передній частині стека, а потім повертається до x.

Зрозуміло, що будь-яке можливе замовлення карт може бути вироблено: у будь-який момент 2-ї стадії кожна картка, яка ще не була надрукована, може бути надрукована наступним, якщо риба плаває достатньо праворуч. Ця техніка переміщення зазвичай не розсуває картки дуже далеко один від одного, якщо вони вже були поруч, але знову ж таки, і перемішування не вручну .


2

R, 61 байт

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

Випадково відбирайте вектор цілих представлень значень унікоду карт (які можна отримати з utf8ToInt()фукціону) та видаліть небажані картки лицаря / джокера.



1

C # ( 146 141 байт)

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

Демонстрація в Інтернеті

Це використовує вкрай поганий стиль при переміщенні Guid.NewGuid(), але це код-гольф. Потім він будує сурогатні пари вручну.


Це насправді працює? Кожного разу, коли я намагався ввести динамічний int до char, він кидав виняток?
TheLethalCoder

@TheLethalCoder, у мене немає динамічних значень. Але як доказ того, що це працює, я додав посилання на Ideone.
Пітер Тейлор

Я мав на увазі інт, створений для другої частини сурогатної пари.
TheLethalCoder

Ви можете зберегти байт, не включаючи крапку з комою
TheLethalCoder

Каже 147 байт, читається як 146
Ніл А.

0

Perl 5, 75 байт

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

Зауважте, що для цього використовуються кодові точки для маток, як зазначено у питанні (тобто остання цифра C). Для фактичних кодів (остання цифра D) замініть 51,56на 47,52.


0

Java 8, 216 байт

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

Пояснення:

Спробуйте тут.

ПРИМІТКА: Неперевірений, оскільки, хоч я встановив пов'язаний шрифт, я все ще бачу вікна. Можливо, доведеться перезапустити комп'ютер чи щось ..

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 байт

З деяким натхненням від рішення Джонатана Джеле .

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

Спробуйте (або переглянути вихід із збільшеннямfont-size )


Пояснення

#?                         :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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.