Задача взята из лекции MIT профессора Девадаса под названием « Вы можете читать мысли» . Подробное объяснение этого трюка можно найти в связанном видео или в этом документе . Я постараюсь объяснить это в более простых терминах.
Оказывается, это было изобретено в 1930-х годах и известно как «Пятикарточный трюк Фитча Чейни» .
Трюк выглядит так:
- Пять случайных карт выбираются из колоды карт. Аудитория и ваш помощник увидят их, а вы нет.
- Ваш помощник (с которым вы тренировались) выберет четыре из этих карт и покажет их вам в определенном порядке. Обратите внимание, что скрытая карта не выбирается случайным образом из 5 карт. Помощник выбирает / карту, которая заставит трюк работать.
- На основании информации, которую вы можете получить из четырех карт, вы получите, что такое пятая карта.
Как?
Имейте в виду следующие два момента:
При выборе 5 случайных карт вам гарантируется, что как минимум две карты имеют одинаковую масть 1 .
Изображение ниже показывает круг со всеми рядами 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 .
источник
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
187**97
иk+15
тоже работает, но я уверен, что это только два набора, которые короче для этого алгоритма.1/34547
сk+14
также работает.Python 2 ,
143140138136127125124123121 байтПопробуйте онлайн!
Тузы высокие
Кодирует три карты, находя их позиции в отсортированном списке карт (
0=smallest, 1=middle, 2=largest
):Это преобразуется в целое число в базе 3 и умножается на 3 и делится на 10:
Различные кодировки:
Добавлено:
источник
3
было умным! Хороший ответ :)0
в конец и делю на 10, что выглядит как эквивалент.Желе , 33 байта
Попробуйте онлайн!
объяснение
Первая строка - ниладическая. Выдает список из 52 карт
В основной ссылке
¢
вызывается результат первой ссылки, которая является списком карточек.источник
1
для туза.APL (Dyalog Unicode) , 49 байтов SBCS
Попробуйте онлайн!
Обзор:
'CDHS'∘.,2↓⎕D,'TJQKA'
генерирует внешний продукт, поэтому 2d матрица с(C2 C3 C4 ...), (D2 D3 D4 ...), ...
. Затем мы транспонируем эту матрицу, чтобы получить,(C2 D2 H2 ...), ...
а затем сгладить это.Спасибо @ngn за то
2-⌊1.8⊥
, что он принимает порядок карточек (SML = 1 2 3) и оценивает их (например, от 1 до 6 в ОП).Объяснение кода:
источник
Сетчатка ,
218208 байтПопробуйте онлайн!
Объяснение:
Заменяет тузы, валеты, дамы, дамы и короли на 1, 11, 12 и 13. Первые две строки
1
предшествуют букве перед буквой, а последняя транслитерирует вторую цифру.*
Указывает на то, что этот этап не следует изменять рабочую строку. Это может сделать сцену бессмысленной, но это будет полезно позже.'
Делит рабочую строку в каждом пространстве, иG0
занимает первую (так он находит первую карту).Первые две строки умножают числа на карточках на 5, а затем превращают их в одинарные (например, 5 представляется как _____), чтобы мы могли добавить меньшие суммы для мастей позже. Последняя строка разделяется на пробелы и содержит последние три карты.
Это преобразует трефы, алмазы, червы и пики в 0, 1, 2 и 3 соответственно, и превращает число в одинарное. Так как теперь он находится на присоединенной части номера карты, он даст уникальное значение для карты, определяя ее высоту.
Это находит порядок карточек и значение, добавляемое к первой карточке. Например, в первой строке
/^(_+)¶\1_+/(
совпадают ордера, которые имеют среднее значение больше, чем первое значение. Он создает цикл if-else для того, что делать (так как этот порядок соответствует перестановкам 1, 2 и 4).K
знаменует собой константуПомните ранее, когда мы
*
указывали, что этап не повлияет на рабочую строку? Это где мы используем это. Эта стадия является стадией замены; он заменяет номер для добавления$+3-$&
.$+3
получает доступ к*
сцене и получает масть и номер первой карты,-
выступает в качестве разделителя и$&
является матчем. Итак, рабочая строка сейчас{suit}{original number}-{number to add}
Это превращает два числа в одинарные и складывает их вместе.
Верхняя строка фиксирует либо число, либо число - 13 (поэтому мы не получаем выходные данные, например, S16). Нижняя строка превращает захваченное число обратно в основание 10, и результат печатается неявно.
источник
Древесный уголь ,
6462 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Использует в
T
течение 10 и сортируетA
высоко. Индекс перестановки не очень легко декодируется; другой порядок перестановок спас бы меня как минимум на три байта. Объяснение:Добавьте 2 ко всем целым числам от 0 до 7, затем объедините их и добавьте суффикс
TJQKA
для карточек с изображениями и туза. Это позволяет сэкономить 2 байта над строковым литералом, хотя оказывается, что приA
большом значении в любом случае можно было бы сэкономить байты за счет сжатия строк.Карта карт и мастей, соединяющих их вместе. Поскольку это обычно создает вложенный массив, результаты вместо этого объединяются в одну строку, которая затем снова разделяется на пары символов.
Найдите позиции второй, третьей и четвертой карт.
Вычислить 1-индексированный индекс перестановки. Первые две перестановки имеют наименьшую карту в первую очередь; это проверено с помощью
⌕υ⌊υ
. Две другие пары перестановок различаются относительно того, является ли самая большая карта первой; это проверено с помощью⌕υ⌈υ
. Логические и арифметические операции затем сопоставляют эти тесты со значениями0
,2
и4
; затем это увеличивается в1
зависимости от сравнения между третьей и четвертой картами, проверенными с помощью‹⊟υ⊟υ
. Наконец индекс увеличивается, чтобы дать желаемую кодировку.Умножьте это на 4, повторяя расстояние между карточками одной масти, добавьте положение первой карточки, циклически индексируйте и напечатайте результат.
источник
Python 2 , 147 байт
Попробуйте онлайн!
источник
Pyth, 42 байта
Действительно некрасиво ...
Попробуйте онлайн: Demontration или Test Suite
источник
J , 68 байт
Попробуйте онлайн!
Примечание: -3 байта TIO, потому что
f=.
не считается. Попробую дальше играть в гольф и добавлю объяснение завтра.источник
JavaScript (Node.js) , 124 байта
Попробуйте онлайн!
JavaScript (Node.js) , 125 байт
Попробуйте онлайн!
источник
T-SQL, 211 байт
Ввод является табличной переменной. Используя T для 10, тузы низкие
Формат для карт ранг / масть KH, 6D, TS
Попробуйте онлайн ungolfed
Обратите внимание, как рассчитывается значение SML (12-17):
Логически S, M, L (1,2,3) преобразуется в числовое значение
При умножении на 3 квадратный корень, округленный в меньшую сторону, становится хорошим последовательным числом.
источник
05AB1E , 37 байт
Порт @dylnan 's Jelly ответа , но, к сожалению, 05AB1E не имеет встроенного индекса перестановки ..
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Посмотрите эту подсказку 05AB1E (раздел Как сжимать строки, не являющиеся частью словаря? ), Чтобы понять, почему
.•3u§•
есть"jqka"
и.•ôì•
есть"cdhs"
.источник