Хочете побачити фокус з магічною карткою?


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]

Це дійсний вихід із заданим порожнім входом.

Вхід колоди

Однак, навпаки, коли наша програма отримує вищевказаний вихід як вхід, вона повинна виводити 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 картою, оберненою як вхідна, повинна призвести до повернення карти.
  • Будь-які інші входи можуть призвести до вибухових лам, що їздять на дорогах через футуристичну трубку.
    • Або що-небудь інше, з цього питання.
  • Як обрана карта, так і порядок перемішування повинні бути однаково випадковими.
    • IE всі картки мають однакові шанси бути обраними для обернення.
    • IE всі комбінації карт мають однакові шанси на появу.
  • Ви можете використовувати SHCDабо shcdдля костюмів, але будьте послідовні:
    • Якщо ви вибираєте великі костюми ( SHCD), ви також повинні використовувати TJQKA.
    • Якщо ви вибираєте малі костюми ( shcd), ви також повинні використовувати tjqka.
  • Це , переможець - найнижчим байтом.

2
@ labela - gotoa Є дуже багато варіацій цього ха-ха. Я пам'ятаю, як мій тато душив розум, використовуючи вертикально симетричні картки та робив інший трюк, але змушував мене думати, що це саме ця.
— Чарівний восьминіг Урна

13
"Вибухові лами, що їдуть на Segways по футуристичній трубі" - Я з нетерпінням чекаю вашого наступного виклику в мистецтві ...
— Level River St,

3
Обертання всієї колоди випадковим зміщенням від 0 до 51 включно задовольняє умові, що "всі картки мають однаковий шанс з'являтися в будь-якому місці перетасованої колоди", але, ймовірно, не слід вважати випадковим переміщенням. Ви маєте на увазі, що всі (52!) Замовлення приблизно однаково вірогідні?
— aschepler

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

1
Чи прийнятна також далай-лама, яка їде на ламі на колядці? Мені не зруйновано вибухівку, але у мене є цукерки-черв'яки ... i.imgur.com/gEkVR5P.gif
— Tschallacka,

Відповіді:


7

Сітківка , 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, що закінчується тим самим рахунком, чи не так?
— Емінья


@MagicOctopusUrn: На жаль, ні. Ви маєте і те, 1і aтам.
— Емінья

Залиште це мені неправильно трактувати 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...)

Щоб полегшити тестування, ось версія, яка приймає дані як розділені комами, а виводить як новий рядок.

Усі x0s - це лише спроба зробити напіврівномірний генератор випадкових чисел. Більше з них збільшує діапазон можливих значень, а зворотне для менших. 10 з них - це, де я вважав це досить випадковим.

Зауважте, що він дотримується правил у тому, що:

  • Усі картки мають однакові шанси бути обраними для зміни.
  • Усі картки мають однаковий шанс з’явитися в будь-якому місці перетасованої колоди.

Але не всі змішані комбінації є можливими виходами (а насправді переважна більшість - ні).


2

Желе , 26 байт

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

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

Спробуйте в Інтернеті! (колонтитул, щоб зрівняти вхідні та вихідні представлення - як повноцінна програма Jelly Python-evals аргументує і розбиває символи разом для виводу)

Як?

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

Здається, це завжди перевертає десять сердець. Чи не повинна це бути випадкова карта?
— Емінья,

А, дякую, так, є помилка - її можна виправити додатковою Ẋдо U(можливо, я можу виправити нульові байти замість цього), але доведеться це зробити пізніше ...
— Джонатан Аллан

Оскільки це функція, я не впевнений, чи можна повернутись [[number, suit]]замість того, [number, suit]щоб представляти одну карту, коли вхід не порожній.
— Ерік Атголфер

Також ні, я не думаю, що для цього немає жодного 0-байтового виправлення.
— Ерік Аутгольфер

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

Вхід - це String, вихід - або String, або 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.