Распечатать перемешанную колоду карт


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
Если вы видите только ящики, установите шрифты Google Noto. Да, я не могу сделать это на моем телефоне ...
Деннис

Ответы:


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 Действительно! Хорошо, что строки итеративны по типу char. :)
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 байта (отредактировано, потому что я забыл удалить рыцарей). Помогает ли вам связать желе, хотя.
Волшебная Урна Осьминога

@carusocomputing: Хорошая идея сделать декартову до конкатенации, чтобы мы могли пропустить разделение. Благодарность!
Emigna

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 - я тоже, пока не написал этот ответ!
Тоби Спейт

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 BACK PLAYING CARD, который следует удалить. Нам также необходимо удалить карты Рыцаря и Джокера, которые застряли между обычными 52. См. En.wikipedia.org/wiki/… .
Андерс Касеорг

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, C или F, умножая их вместе x  ( x -12) ( x -15), где x - мод charcode 16, и проверка, если это ноль. Если это так, он удаляет нарушившую карту из стека. Он повторяется до тех пор, пока в стеке не будет 52 карты, а затем перейдет на этап 2:

  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 к символу, он вызывал исключение?
TheLethalCoder

@TheLethalCoder, у меня нет динамических значений. Но в качестве доказательства того, что это работает, я прикрепил ссылку на Ideone.
Питер Тейлор

Я имел в виду int, созданный для второй части суррогатной пары.
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 байта

С вдохновением от решения Jonathan's Jelly .

#?ö¬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.