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


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.