Задача взята из лекции 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