Хотите увидеть трюк с магической картой?


16

Первая волшебная карточная уловка, которую я когда-либо изучал, будучи ребенком, была следующей:

  • Имейте 1 колоду карт, где рисунок на спине не является вертикально симметричным.
  • Организуйте все карты в одном направлении.
  • Попросите человека: «Выберите карту, любую карту, запомните ее и верните вам».
  • Продолжайте помещать это в колоду (в неправильном направлении).
  • Перемешайте энергично, создавая иллюзию, что вы не будете знать, где находится их карта.
  • Изготовить их карту к их изумлению.

Этот трюк, по-видимому, в настоящее время немного лишен блеска в природе, однако он делает хороший вызов. Напишите программу, которая при отсутствии ввода выводит случайно перетасованную колоду карт, при этом одна из выбранных случайным образом карт переворачивается. Однако, когда вход представляет собой колоду карт с одной перевернутой картой, необходимо вывести перевернутую карту (в правильном порядке).


Колода карт

Колода карт определяется как:

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,4C,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

Карта определяется как ее номер, а затем первая буква ее масти. Обратная сторона карты - полная противоположность, первая буква ее масти, за которой следует число.

Нарисованная карта

Например, если бы карта, которую мы случайно выбрали для реверса, была 4 of Clubs (4C), то мы бы в итоге (без тасования, очевидно):

[2S,3S,4S,5S,6S,7S,8S,9S,TS,JS,QS,KS,AS,
 2D,3D,4D,5D,6D,7D,8D,9D,TD,JD,QD,KD,AD,
 2H,3H,4H,5H,6H,7H,8H,9H,TH,JH,QH,KH,AH,
 2C,3C,C4,5C,6C,7C,8C,9C,TC,JC,QC,KC,AC]

Перемешивание

Затем после перетасовки:

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

Это действительный вывод при пустом вводе.

The Deck Input

Однако, наоборот, когда наша программа получает вышеуказанный вывод в качестве входных данных, она должна выводить 4C. То есть для ввода:

[2H,2C,6S,4D,QH,6C,TD,8C,7H,5H,C4,3D,7S,7C,KC,QD,QC,JS,7D,6D,2S,5C,KD,3C,3S,2D,8H,KH,6H,AH,8S,JH,TS,AD,5D,9H,4H,JD,QS,4S,JC,3H,8D,TC,AS,TH,KS,AC,9C,9S,5S,9D]

Вы перебираете, пока не найдете перевернутую карту, и возвращаете ее обратно в нормальное состояние. Итак, здесь мы нашли бы C4, знали, что C не является числом, и возвращали его как 4C, что правильно.


правила

  • Вы не можете загружать колоду из каких-либо внешних источников.
  • Пустой ввод должен привести к случайному перемешиванию колоды с 1 случайной картой в обратном порядке.
  • Колода карт с 1 картой, обращенной в качестве ввода, должна привести к обратной карте.
  • Любые другие входы могут привести к взрывным ламам, едущим на сигвеях через футуристическую трубу.
    • Или что-нибудь еще, в этом отношении.
  • Как выбранная карта, так и порядок перемешивания должны быть равномерно случайными.
    • То есть все карты имеют равные шансы быть выбранными для реверса.
    • То есть все комбинации карт имеют одинаковый шанс появления.
  • Вы можете использовать SHCDили shcdдля костюмов, но будьте последовательны:
    • Если вы выбираете заглавные костюмы ( SHCD), вы также должны использовать TJQKA.
    • Если вы выбираете строчные буквы ( shcd), вы также должны использовать tjqka.
  • Это , победитель младших байтов.

2
@ labela - gotoa, есть слишком много вариантов этого хаха. Я помню, как мой папа взрывал мне голову, используя вертикально симметричные карты, и делал другой трюк, но заставлял меня думать, что это был этот.
Волшебная урна осьминога

13
«Взрывные ламы, едущие на сигвеях по футуристической трубе» - я с нетерпением жду вашего следующего вызова ascii-art ...
Level River St

3
Вращение всей колоды на случайное смещение от 0 до 51 включительно удовлетворяет условию, что «все карты имеют одинаковый шанс появления в любом месте перетасованной колоды», но, вероятно, не должно рассматриваться как случайное перемешивание. Вы имеете в виду, что все (52!) Заказы примерно одинаково вероятны?
aschepler

1
Просто в продолжение того, что сказал @aschepler: с длительностью периода PRNG по умолчанию во многих языках, большинство из 52! возможные тасовки имеют вероятность появления точно равным нулю (хотя это может быть лучше или хуже в зависимости от алгоритма тасования).
Арнаулд

1
Далай-лама, ездящий на ламе на тележке, также приемлем? У меня нет segways и взрывчатки, но у меня есть леденцы ... i.imgur.com/gEkVR5P.gif
Tschallacka

Ответы:


7

Retina , 61 60 59 байт

G`[HCDS].
^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S
@V`
O?`

Попробуйте онлайн! Изменить: Сохранено 1 2 байта благодаря @MartinEnder. Объяснение:

G`[HCDS].

Удалите все необратимые карты. Это должно оставить одну перевернутую карту или нет карт.

^$
23456789TJQK
/^2/&L$`.
$&H¶$&D¶$&C¶$&S

Если вход (сейчас) пуст, создайте колоду карт.

@V`

Произвольно выберите одну карту и поверните ее в обратном направлении (не переворачивает одну перевернутую карту).

O?`

Перемешайте карту (и).


4

05AB1E , 29 байт

Y9ŸJ.•§®т•«.•öB•âsKDgiëDΩÂ:.r

Попробуйте онлайн!


. Āk {? Öw • 9LJì # `â сэкономит несколько байтов, чтобы сжать эти два вместе.
Волшебная Урна Осьминога

@MagicOctopusUrn: После удаления 1 и 2 это заканчивается тем же счетом, не так ли?
Emigna


@MagicOctopusUrn: К сожалению, нет. У вас есть и то 1и другое a.
Emigna

Предоставьте это мне, чтобы неверно истолковать Y9ŸJкак9LJ
Волшебный Осьминог Урна

3

PowerShell v2 или новее, 175 байт

%{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

Длинная версия:

ForEach-Object {
    $s = [char[]]'SDHC'                         # Create a character array with the suits
    if ($_) {                                   # If there's pipeline input ...
        $_ |                                    # ... write it to the output pipeline ...
            Where-Object {$s -contains $_[0]} | # ... but let only those input elements pass where the first letter appears in the suits ...
            ForEach-Object {$_[1] + $_[0]}      # ... and swap the two elements
    } else {
        $d = $s | ForEach-Object {              # Assign $d to the output of the suits, processing each element first.
                $e = $_                         # Store the current suit element for use in the inner loop
                [char[]]'23456789TJQKA' | ForEach-Object {$_ + $e}  # Process each of the numbers, joining it with the current suit, ...
            } | Get-Random -Count 52            # ... and the resulting 2-char-strings goes back into the output to be shuffled
        $r = Get-Random -Maximum 52
        $d[$r] = $d[$r][1] + $d[$r][0]          # Swap the two chars of a random array element in $d
        $d                                      # Write $d to the output pipeline
    }
}

Использование:

Создайте перемешанную колоду и сохраните ее в переменной:

$Deck = %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}

Проверьте переменную по желанию, например

$Deck -join ','

Верните колоду обратно в скрипт:

$Deck | %{$s=[char[]]'SDHC';if($_){$_|?{$s-contains$_[0]}|%{$_[1]+$_[0]}}else{$d=$s|%{$e=$_;[char[]]'23456789TJQKA'|%{$_+$e}}|random -c 52;$r=random 52;$d[$r]=$d[$r][1]+$d[$r][0];$d}}


2

> <> , 215 193 байта

i:0)?\~"CHSD":"2"$:"3"$:"4"$:"5"$:"6"$:"7"$:"8"$:"9"$:"T"$:"J"$:"Q"$:"K"$:"A"$&105&"S"=?.~~~{c0.
=+i$?\i$:::"B")$"I"(*$"S"
_oo$~/;
x0
x0
x0
x0
x0
x0
x0
x0
x0
x0
\l&>?!<
>&"3"%:?\~$>o<
\  }}&-1/

Попробуйте онлайн!

Принимает ввод как неразделенные карты и выводит как то же самое (например, KCAC5C6S... )

Чтобы упростить тестирование, вот версия, в которой ввод вводится через запятую, а вывод - как перевод строки.

Все x0 это просто попытка создать полуоднородный генератор случайных чисел. Больше из них увеличивает диапазон возможных значений, а наоборот - меньше. 10 из них - то, где я оценил это как достаточно случайное.

Обратите внимание, что это следует правилам в этом:

  • Все карты имеют равные шансы быть выбранными для реверса.
  • Все карты имеют одинаковую вероятность появления в любом месте перемешанной колоды.

Но не все перемешанные комбинации являются возможными выходами (и на самом деле, подавляющее большинство не являются).


2

Желе , 26 байт

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ

Монадическая ссылка, принимающая список списков символов (заглушка из 0 карт или полная колода из 52 карт с перевернутой одной картой) и возвращающая список списков символов (заглушка из 1 перевернутой карты, но вперед или полный колода с одной случайной картой перевернуто).

Попробуйте онлайн! (нижний колонтитул для согласования входных и выходных представлений - как полный программный код Jelly Python - обнуляет аргумент и разбивает символы вместе для вывода)

Как?

9ḊṾ€;“AJKQT”p“CDHS”ḟ⁸ẊU-¦Ẋ - Link: list of lists of characters, Z
9Ḋ                         - nine dequeued = [2,3,4,5,6,7,8,9]
  Ṿ€                       - unevaluate €ach = ['2','3','4','5','6','7','8','9']
     “AJKQT”               - literal list of characters = ['A','J','K','Q','T']
    ;                      - concatenate = ['2','3','4','5','6','7','8','9','A','J','K','Q','T']
             “CDHS”        - literal list of characters = ['C','D','H','S']
            p              - Cartesian product = [['2','C'],['2','D'],...,['T','S']]
                           -   a full deck of forward cards
                    ⁸      - chain's left argument, Z
                   ḟ       - filter discard
                           -   leaving either that deck or the 1 reversed card in the input
                     Ẋ     - shuffle
                        ¦  - sparse application...
                       -   - ...to index: -1 (which doesn't exist when the length is only 1)
                      U    - ...do: upend (reverses the penultimate card of the deck)
                         Ẋ - shuffle

Кажется, это всегда меняет десятку сердец. Разве это не случайная карта?
Emigna

Ах, спасибо, да, есть ошибка - она ​​может быть исправлена ​​с дополнительным до U(возможно, я могу исправить для нулевого байта вместо этого), но придется сделать это позже ...
Джонатан Аллан

Поскольку это функция, я не уверен, что вы можете вернуться [[number, suit]]вместо [number, suit]представления одной карты, когда ввод не пуст.
Эрик Outgolfer

Кроме того, нет, я не думаю, что есть какое-то 0-байтовое исправление для этого.
Эрик Outgolfer

@EriktheOutgolfer Я не понимаю, почему нет, одинокая карта - это заглушка (короткая колода) всего одной карты.
Джонатан Аллан

1

Ruby , 95 (или 100) байтов

->n{s=(0..51).map{|i|"A23456789TJQK"[i/4]+"HCDS"[i%4]}
n[0]?s-n:s[rand 52].reverse!&&s.shuffle}

Учитывая пустой массив в качестве входных данных, возвращает колоду в виде массива строк. Учитывая непустой массив в качестве входных данных, возвращает перевернутую карту в виде массива, содержащего одну строку. Если перевернутая карта требуется в виде строки, а не одноэлементного массива, содержащего строку, следующее добавляет 5 байтов: измените s-nна(s-n)[0]

Попробуйте онлайн!

Первая строка генерирует стандартную колоду. Вторая строка разбивается следующим образом

 n[0]?                  #If the input array is not empty (contains a truthy first element)
  s-n:                  #Find the contents of s with the contents of n removed. The only card remaining from the standard deck corresponds to the flipped card in the input.
                        #ELSE 
  s[rand 52].reverse!&& #Flip one card in place in the array s. As the result is truthy, whatever is next will be returned.
 s.shuffle              #shuffle the deck and return the shuffled deck with one element flipped
}

1

Java 8, 275 274 259 байт

import java.util.*;s->{if(s==null){List l=new Stack();char i=52,r=i,x,y;for(r*=Math.random();i-->0;y="23456789TJQKA".charAt(i%13),l.add(i==r?x+""+y:y+""+x))x="HSDC".charAt(i&3);Collections.shuffle(l);return l;}return s.replaceAll(".*,(.)([^HSDC]).*","$2$1");}

Ввод - это строка, выход - это строка или java.util.List зависимости от ввода.

Объяснение:

Попробуйте онлайн.

import java.util.*;          // Required import for List, Stack and Collections
s->{                         // Method with String parameter and Object return-type
  if(s==null){               //  If the input is `null`:
    char i=52,               //   Index-integer
         r=i,                //   Random-integer
         x,y;                //   Temp characters
    List l=new Stack();      //   Create a List
    for(r*=Math.random();    //   Determine the random integer in the range (0;52]
        i-->0                //   Loop `i` 52 times:
        ;                    //     After every iteration:
         y="23456789TJQKA".charAt(i%13)
                             //      Set `y` to one of 23456789TJQKA based on `i` modulo-13
         ,l.add(i==r?        //      If the random integer equals the current `i`
                 x+""+y      //       Add the current card reversed
                :            //      Else:
                 y+""+x))    //       Add the current card as is
      x="HSDC".charAt(i&3);  //    Set `x` to one of HSDC based on `i` bitwise-AND 3
    Collections.shuffle(l);  //   Shuffle the generated Deck
    return l;}               //   And return this Deck as result
                             //  If the input was a Deck instead:
  return s.replaceAll(".*,(.)([^HSDC]).*",
                             //   Get the reversed card from the Deck,
            "$2$1");}        //   and output it non-reversed

1

Pyth, 45 байт

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK

Принимает пустой список для пустого ввода.
Попробуйте онлайн

объяснение

J"CDHS"KO52=NsM.S*+c"AKQJT"1S9J|f}hTJQXNK_@NK
J"CDHS"                                        Save the suits as J.
       KO52                                    Save a random index as K.
           =NsM.S*+c"AKQJT"1S9J                Save a shuffled deck as N.
                                f}hTJQ         Find all cards with suit first.
                               |      XNK_@NK  If there aren't any, flip a card.

1

R , 177 171 байт

function(l=1,F="(.)(.)",R="\\2\\1",S=sample)if(l>1)sub(F,R,grep("^[SDHC]",l,v=T))else{m=S(outer(c(2:9,"T","J","Q","K"),c("S","D","H","C"),paste0))
m[1]=sub(F,R,m[1])
S(m)}

Попробуйте онлайн!

Учитывая пустой ввод (вызов fбез ввода), мы используем по умолчанию l=1и таким образом создаем случайную перестановку mколоды. Предполагая, что sampleэто действительно случайно, есть равная вероятность того, что любая карта будет первой в этом списке. Таким образом, мы модифицируем первый, а затем снова перемешиваем, возвращая список.

В SDHCобратном порядке ищем карту, начинающуюся с одного из, и переворачиваем ее.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.