Профессор в Массачусетском технологическом институте может читать мысли!

46

Задача взята из лекции MIT профессора Девадаса под названием « Вы можете читать мысли» . Подробное объяснение этого трюка можно найти в связанном видео или в этом документе . Я постараюсь объяснить это в более простых терминах.

Оказывается, это было изобретено в 1930-х годах и известно как «Пятикарточный трюк Фитча Чейни» .


Трюк выглядит так:

  • Пять случайных карт выбираются из колоды карт. Аудитория и ваш помощник увидят их, а вы нет.
  • Ваш помощник (с которым вы тренировались) выберет четыре из этих карт и покажет их вам в определенном порядке. Обратите внимание, что скрытая карта не выбирается случайным образом из 5 карт. Помощник выбирает / карту, которая заставит трюк работать.
  • На основании информации, которую вы можете получить из четырех карт, вы получите, что такое пятая карта.

Как?

Имейте в виду следующие два момента:

  1. При выборе 5 случайных карт вам гарантируется, что как минимум две карты имеют одинаковую масть 1 .

  2. Изображение ниже показывает круг со всеми рядами 2 . Поскольку это круг, можно считать: J, Q, K, A, 2, 3 (т.е. модульный счет). Вам гарантируется, что скрытая карта не имеет того же ранга, что и первая, поскольку они будут одной масти (объяснено ниже). Всегда можно выбрать первую карту и скрытые карты так, чтобы скрытая карта была на 1-6 рангов выше первой (при подсчете в кругах). Если первая карта 1 , то скрытая карта будет 2,3,4,5,6 или 7 . Если первая карта J , то скрытой будет Q, K, A, 2,3 или 4 и так далее.

ряды карт от А до К расположены по кругу


Алгоритм:

Первая карта: эта карта будет той же масти, что и скрытая карта. Карта также будет точкой отсчета, которую вы будете использовать при определении ранга скрытой карты.

2-я, 3-я и 4-я карты декодируют значение в включенном диапазоне 1 ... 6 . Мы назовем три карты S, M, L (самая маленькая карта, средняя карта, самая большая карта). Значения будут закодированы следующим образом (лексикографический порядок):

S M L   -> 1
S L M   -> 2
M S L   -> 3   
M L S   -> 4
L S M   -> 5
L M S   -> 6 

Итак, если ранг первой карты равен 5 , а остальные три карты имеют ранг 4 Q 7 (они заказаны как SLM ), то последняя карта имеет ранг 5 + 2 = 7 . Вы можете выбрать, должна ли туз быть самой высокой или самой низкой картой, если она соответствует.

Если несколько карт делят ранг, то масть определит порядок, где C <D <H <S .


Формат ввода:

Четыре карты будут даны как H3 (три сердца), DK (Король алмазов) и так далее. Вместо этого вы можете принять входные данные как 3H и KD .

Ввод может быть в любом удобном формате, но вы не можете объединить список мастей в одной переменной и список рангов в другой. 'D5', 'H3' ..и [['D',5],['H',3] ...оба в порядке, но 'DHCH',[5,3,1,5]это не так. Вы не можете использовать цифры вместо букв, за исключением Т .

Выход

Скрытая карта, в том же формате, что и вход.


пример

Давайте сделаем прохождение:

Input:
D3 S6 H3 H9

Мы знаем, что скрытая карта - это бриллиант, поскольку первая карта - это бриллиант. Мы также знаем, что ранг составляет 4,5,6,7,8 или 9, поскольку ранг первой карты равен 3 .

Остальные карты упорядочены 6,3,9 ==> M, S, L , что кодирует значение 3 . Следовательно, скрытая карта - это 3 + 3 = 6 бриллиантов, поэтому на выходе должно быть D6 .

Тестовые случаи:

C3 H6 C6 S2
C9            # The order is LMS (H6 > C6, and 2 < 6). 3+6=9     

SQ S4 S3 ST   # (ST = S10. Format is optional)
S2            # The order is MSL. 12+3=2

HA CA DA SA
H2            # The order is SML. 14+1=2

Это , поэтому выигрывает самое короткое решение на каждом языке. Пояснения приветствуются!


1 Существует четыре масти ( C lubs, D iamonds, H earts и S pades).

2 Есть 13 рангов, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Вы можете использовать T вместо 10 .

Стьюи Гриффин
источник

Ответы:

17

JavaScript (ES6), 130 102 байта

Принимает ввод в виде массива строк в "Rs"формате, где R - ранг, а s - масть. Ожидается "Т" в течение 10-х годов. Тузы низкие.

a=>(s='A23456789TJQK')[([[R,[,S]],B,C,D]=a.map(c=>[s.search(c[0])+14,c]),R+=D<C|2*((D<B)+(C<B)))%13]+S

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

Как?

Сначала мы конвертируем каждую карту в массив [rank, card], где rank - это числовое значение в [14 ... 26], а card - исходная строка.

[[R, [, S]], B, C, D] = a.map(c => ['A23456789TJQK'.search(c[0]) + 14, c])

Ранг и масть первой карты сохраняются в R и S соответственно. Три другие карты хранятся в B , C и D .

Например, ['3c','6h','6c','2s']становится:

[ [ 16, '3c' ], [ 19, '6h' ], [ 19, '6c' ], [ 15, '2s' ] ]
    ^^    ^     <---------->  <---------->  <---------->
    R     S          B             C             D

Затем мы сравниваем каждую пару в [B, C, D] . Эти элементы неявно приводятся к строкам, когда они сравниваются друг с другом:

[ 19, '6h' ] --> '19,6h'

Поскольку и ранг, и карта гарантированно состоят ровно из двух символов, сравнение безопасно в лексикографическом порядке.

Мы вычисляем:

(D < C) | 2 * ((D < B) + (C < B))

Ниже приведены все возможные комбинации:

 B, C, D | v0 = D < B  | v1 = C < B  | v2 = D < C  | v2|2*(v0+v1)
---------+-------------+-------------+-------------+--------------
 S, M, L |    false    |    false    |    false    |      0
 S, L, M |    false    |    false    |    true     |      1
 M, S, L |    false    |    true     |    false    |      2
 M, L, S |    true     |    false    |    true     |      3
 L, S, M |    true     |    true     |    false    |      4
 L, M, S |    true     |    true     |    true     |      5

Наконец, мы строим выходную карту, используя R , S и приведенный выше результат:

'A23456789TJQK'[(R += D < C | 2 * ((D < B) + (C < B))) % 13] + S
Arnauld
источник
Ваш вариант не бесполезен, это просто неправильный выбор базы и мощности! Используйте 92427**3и измените, k+7чтобы k+8сохранить 1 байт:a=>(k='A23456789TJQK'+92427**3)[[[r,s],...x]=a.map((c,i)=>[k.search(c[0])+10,c[1],i]),(r-k[x.sort().map(c=>k=k*2|c[2])|k+8])%13]+s
asgallant
187**97и k+15тоже работает, но я уверен, что это только два набора, которые короче для этого алгоритма.
asgallant
@asgallant Хорошая находка!
Арнаулд
@asgallant 1/34547с k+14также работает.
Арно
15

Python 2 , 143 140 138 136 127 125 124 123 121 байт

lambda(S,V),*l:S+N[F(V)+int(`map(sorted(l,key=lambda(s,v):(F(v),s)).index,l)`[1::3],3)*3/10]
N='23456789TJQKA'*2;F=N.find

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

Тузы высокие


Кодирует три карты, находя их позиции в отсортированном списке карт ( 0=smallest, 1=middle, 2=largest):

cards:   [SK, C4, H4]
sorted:  [C4, H4, SK]

ranks:   [ 2            index of SK in sorted
ranks:   [ 2,  0        index of C4 in sorted
ranks:   [ 2,  0,  1    index of H4 in sorted
ranks:   [ 2,  0,  1] = L,S,M

Это преобразуется в целое число в базе 3 и умножается на 3 и делится на 10:

int('201',3) = 19 -> 19*3//10 = 5

Различные кодировки:

cards            base3    *3   /10
[0, 1, 2]  012     5      15     1
[0, 2, 1]  021     7      21     2
[1, 0, 2]  102     11     33     3
[1, 2, 0]  120     15     45     4
[2, 0, 1]  201     19     57     5
[2, 1, 0]  210     21     63     6

Добавлено:

  • -2 байта, благодаря овсу
TFeld
источник
Я думал о том, как я мог бы решить эту проблему, используя троичный подход, когда писал задачу, но я не нашел хорошего способа сделать это ... Умножение на 3было умным! Хороший ответ :)
Стьюи Гриффин
@ StewieGriffin Спасибо :) Теперь я добавляю 0в конец и делю на 10, что выглядит как эквивалент.
TFeld
1
@Arnauld. Я обновил описание, чтобы, надеюсь, стало немного понятнее, что я делаю.
TFeld
10

Желе , 33 байта

ØDḊḊ;“TJQKA”p“CDHS”
¢iⱮµḊŒ¿×4+Ḣị¢

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

объяснение

Первая строка - ниладическая. Выдает список из 52 карт

ØDḊḊ;“TJQKA”p“CDHS”
ØD                   Digits: '0123456789'
  ḊḊ                 Dequeue twice: '23456789'
    ;                Append with...
     “TJQKA”         ...the string 'TJQKA': '23456789TJQKA'. These are the ranks
            p        Cartesian product with...
             “CDHS”  ...the suits.
                     This yields the list of all cards in lexicographic order:
                                 ['2C', '2D', '2H', '2S',
                                  '3C', ...         'AS']

В основной ссылке ¢вызывается результат первой ссылки, которая является списком карточек.

¢iⱮµḊŒ¿×4+Ḣị¢
¢              List of cards
 iⱮ            Index of each (Ɱ) of the inputs in the list.
   µ           New monadic link. The list of indices become this links argument.
    Ḋ          Remove the first one.
     Œ¿        Index of the permutation of the last three items. Gives a number 1-6
               as described in the problem statement.
       ×4      Multiply this by 4 so that when we add to the index of the first
               card we end up in the same suit.
         +Ḣ    Add the first index.
           ị   Use this number to index into...
            ¢  ...the list of cards.
dylnan
источник
1
Вы не можете использовать 1для туза.
Эрик Outgolfer
@EriktheOutgolfer перешел обратно на A
dylnan
Вы можете использовать регистр для сохранения байта
Джонатан Аллан
5

APL (Dyalog Unicode) , 49 байтов SBCS

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'

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

Обзор: 'CDHS'∘.,2↓⎕D,'TJQKA'генерирует внешний продукт, поэтому 2d матрица с (C2 C3 C4 ...), (D2 D3 D4 ...), .... Затем мы транспонируем эту матрицу, чтобы получить, (C2 D2 H2 ...), ...а затем сгладить это.

Спасибо @ngn за то 2-⌊1.8⊥, что он принимает порядок карточек (SML = 1 2 3) и оценивает их (например, от 1 до 6 в ОП).

Объяснение кода:

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'
                                       D,'TJQKA'  Concatenate a list of numbers with TJQKA
                                     2            Drop 2 (removes "01")
                                  ∘.,              Generate the outer product of this prefixed with
                            'CDHS'                 The suits
                                                  Invert rows/columns
                          ,                        Flatten (matrix -> array)
                        x                         Store in x
                      ⍳⍨                           Inverted ⍳⍨: find the indices, in our cards,
                                                  of the argument cards
                   i                              Store these indices in i
                 1                                Remove the first index
                                                  Grade: get ordered indices
         2-⌊1.8                                   The magic happens here: get the number from 1 to 6
       4×                                          Multiply by 4 to get the same "back" on the card
    i-                                            Substract the result from our first index (which we had discarded)
x⌽⍨                                               (Modulated) Index into x (our cards) with this value
Вен
источник
4

Сетчатка , 218 208 байт

[JQK]
1$&
T`AJQK`1123
*' G0`
\d+
5**
' G, 1,`
T`CD\HS`d
\d
*
/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6
\d
$+3-$&
(\d+)-(\d+)
$1*_$2*
_{13}(_+)|(_{1,13})
$.($1$2

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

Объяснение:

[JQK]
1$&
T`AJQK`1123

Заменяет тузы, валеты, дамы, дамы и короли на 1, 11, 12 и 13. Первые две строки 1предшествуют букве перед буквой, а последняя транслитерирует вторую цифру.

*' G0`

*Указывает на то, что этот этап не следует изменять рабочую строку. Это может сделать сцену бессмысленной, но это будет полезно позже. 'Делит рабочую строку в каждом пространстве, и G0занимает первую (так он находит первую карту).

\d+
5**
' G, 1,`'

Первые две строки умножают числа на карточках на 5, а затем превращают их в одинарные (например, 5 представляется как _____), чтобы мы могли добавить меньшие суммы для мастей позже. Последняя строка разделяется на пробелы и содержит последние три карты.

T`CD\HS`d
\d
*

Это преобразует трефы, алмазы, червы и пики в 0, 1, 2 и 3 соответственно, и превращает число в одинарное. Так как теперь он находится на присоединенной части номера карты, он даст уникальное значение для карты, определяя ее высоту.

/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6

Это находит порядок карточек и значение, добавляемое к первой карточке. Например, в первой строке /^(_+)¶\1_+/(совпадают ордера, которые имеют среднее значение больше, чем первое значение. Он создает цикл if-else для того, что делать (так как этот порядок соответствует перестановкам 1, 2 и 4). Kзнаменует собой константу

\d
$+3-$&

Помните ранее, когда мы *указывали, что этап не повлияет на рабочую строку? Это где мы используем это. Эта стадия является стадией замены; он заменяет номер для добавления $+3-$&. $+3получает доступ к *сцене и получает масть и номер первой карты, -выступает в качестве разделителя и $&является матчем. Итак, рабочая строка сейчас{suit}{original number}-{number to add}

(\d+)-(\d+)
$1*_$2*

Это превращает два числа в одинарные и складывает их вместе.

_{13}(_+)|(_{1,13})
$.($1$2

Верхняя строка фиксирует либо число, либо число - 13 (поэтому мы не получаем выходные данные, например, S16). Нижняя строка превращает захваченное число обратно в основание 10, и результат печатается неявно.

lolad
источник
Исправлена! Я перевернул регулярное выражение, чтобы оно расставило приоритеты числам больше 13
lolad
3

Древесный уголь , 64 62 байта

≔⪪⭆⁺⭆⁸⁺²ιTJQKA⭆CDHS⁺λι²δ≔E⟦ηζε⟧⌕διυ§δ⁺⌕δθ×⁴⊕⁺∧⌕υ⌊υ⊗⊕¬⌕υ⌈υ‹⊟υ⊟υ

Попробуйте онлайн! Ссылка на подробную версию кода. Использует в Tтечение 10 и сортирует Aвысоко. Индекс перестановки не очень легко декодируется; другой порядок перестановок спас бы меня как минимум на три байта. Объяснение:

⁺⭆⁸⁺²ιTJQKA

Добавьте 2 ко всем целым числам от 0 до 7, затем объедините их и добавьте суффикс TJQKAдля карточек с изображениями и туза. Это позволяет сэкономить 2 байта над строковым литералом, хотя оказывается, что при Aбольшом значении в любом случае можно было бы сэкономить байты за счет сжатия строк.

≔⪪⭆...⭆CDHS⁺λι²δ

Карта карт и мастей, соединяющих их вместе. Поскольку это обычно создает вложенный массив, результаты вместо этого объединяются в одну строку, которая затем снова разделяется на пары символов.

≔E⟦ηζε⟧⌕διυ

Найдите позиции второй, третьей и четвертой карт.

⊕⁺∧⌕υ⌊υ⊗⊕¬⌕υ⌈υ‹⊟υ⊟υ

Вычислить 1-индексированный индекс перестановки. Первые две перестановки имеют наименьшую карту в первую очередь; это проверено с помощью ⌕υ⌊υ. Две другие пары перестановок различаются относительно того, является ли самая большая карта первой; это проверено с помощью ⌕υ⌈υ. Логические и арифметические операции затем сопоставляют эти тесты со значениями 0, 2и 4; затем это увеличивается в 1зависимости от сравнения между третьей и четвертой картами, проверенными с помощью ‹⊟υ⊟υ. Наконец индекс увеличивается, чтобы дать желаемую кодировку.

§δ⁺⌕δθ×⁴...

Умножьте это на 4, повторяя расстояние между карточками одной масти, добавьте положение первой карточки, циклически индексируйте и напечатайте результат.

Нил
источник
2

Pyth, 42 байта

+hhQ@J+`M}2Tmk"JQKA"+hhKm,xJtdhdQhx.pStKtK

Действительно некрасиво ...

Попробуйте онлайн: Demontration или Test Suite

Jakube
источник
2

J , 68 байт

r=.'23456789TJQKA'
{:@{.,~0{r|.~1+(r i.0{{.)+(>,{r;'CDHS')A.@/:@i.}.

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

Примечание: -3 байта TIO, потому что f=.не считается. Попробую дальше играть в гольф и добавлю объяснение завтра.

Ион
источник
1

T-SQL, 211 байт

Ввод является табличной переменной. Используя T для 10, тузы низкие

Формат для карт ранг / масть KH, 6D, TS

DECLARE @ TABLE(c char(2),i int identity(4,-1))
INSERT @
VALUES('2C'),('AH'),('QS'),('KC')

SELECT
substring(max(h+h),max(charindex(q,h)*w)+power(sum(r)*3,.5)-11,1)+max(right(c,w))
FROM(SELECT*,i%4*power(3,rank()over(order by w,charindex(q,h),c))r
FROM(SELECT*,i/4w,left(c,1)q,'A23456789TJQK'h FROM @)d)y

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

Обратите внимание, как рассчитывается значение SML (12-17):

Логически S, M, L (1,2,3) преобразуется в числовое значение

первая карта оценивается 27 * значение последовательности

вторая карта оценивается 9 * значение последовательности

третья карта оценивается 3 * значение последовательности

При умножении на 3 квадратный корень, округленный в меньшую сторону, становится хорошим последовательным числом.

Order    27,9,3*order=r   sum(r)*3    floor sqrt
S M L -> 1*27+2*9+3*3  -> 162      -> 12
S L M -> 1*27+3*9+2*3  -> 180      -> 13
M S L -> 2*27+1*9+3*3  -> 216      -> 14 
M L S -> 2*27+3*9+1*3  -> 252      -> 15
L S M -> 3*27+1*9+2*3  -> 288      -> 16
L M S -> 3*27+2*9+1*3  -> 306      -> 17
t-clausen.dk
источник
1

05AB1E , 37 байт

2TŸ.•3u§•S«.•ôì•âíJuDIkćsD{œJsJk>4*+è

Порт @dylnan 's Jelly ответа , но, к сожалению, 05AB1E не имеет встроенного индекса перестановки ..

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

2TŸ                # Push the list [2,3,4,5,6,7,8,9,10]
   .•3u§•S         # Push compressed string "jqka", converted to a list of characters
          «        # Merge the lists together
.•ôì•              # Push compressed string "cdhs"
     â             # Create each possible pair
      í            # Reverse each pair
       Ju          # Join each pair together, and convert to uppercase
D                  # Duplicate the deck
 Ik                # Get the index of the cards of the input-list in the deck
   ć               # Extract head; pop and push remainder and head
    s              # Swap to get the remainder
     D{            # Create a sorted copy
       œ           # Get the permutations of that
        JsJk       # Get the index of the unsorted permutation in this permutations list
            >      # Increase it by 1 (since 05AB1E has 0-based indexing)
             4*    # Multiply it by 4
               +   # Add it to the extracted head
                è  # And index it into the duplicated deck
                   # (after which the result is output implicitly)

Посмотрите эту подсказку 05AB1E (раздел Как сжимать строки, не являющиеся частью словаря? ), Чтобы понять, почему .•3u§•есть "jqka"и .•ôì•есть "cdhs".

Кевин Круйссен
источник