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


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

Ваш вариант не бесполезен, это просто неправильный выбор базы и мощности! Используйте 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 байта, благодаря овсу

Я думал о том, как я мог бы решить эту проблему, используя троичный подход, когда писал задачу, но я не нашел хорошего способа сделать это ... Умножение на 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.

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, и результат печатается неявно.


Исправлена! Я перевернул регулярное выражение, чтобы оно расставило приоритеты числам больше 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

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

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".

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