Завдання взято з лекції MIT професора Девадаса під назвою You can read minds . Детальне пояснення хитрощі можна знайти у пов’язаному відео чи в цьому документі . Спробую пояснити це простішими термінами.
Виявляється, це було винайдено в 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 луби, D iamonds, H earts та S pad ).
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