Zadanie pochodzi z wykładu MIT prof. Devadasa pt. Możesz czytać w myślach . Szczegółowe objaśnienie sztuczki można znaleźć w połączonym filmie lub w tym dokumencie . Spróbuję to wyjaśnić prościej.
Okazuje się, że został wynaleziony w latach 30. XX wieku i jest znany jako „Five-Card Trick of Fitch Cheney” .
Sztuczka wygląda następująco:
- Pięć losowych kart wybiera się z talii kart. Publiczność i twój asystent je widzą, ale ty nie.
- Twój asystent (z którym ćwiczyłeś) wybierze cztery z tych kart i pokaże je w określonej kolejności. Pamiętaj, że ukryta karta nie jest wybierana losowo z 5 kart. Asystent wybiera kartę, która sprawi, że lewa zadziała.
- Na podstawie informacji, które możesz zebrać z czterech kart, wydedukujesz, czym jest piąta karta.
W jaki sposób?
Pamiętaj o dwóch następujących kwestiach:
Wybierając 5 losowych kart, masz gwarancję, że co najmniej dwie karty mają ten sam kolor 1 .
Poniższy obrazek pokazuje okrąg ze wszystkimi rangami 2 . Ponieważ jest to okrąg, można liczyć: J, Q, K, A, 2, 3 (tj. Zliczanie modułowe). Masz gwarancję, że ukryta karta nie ma tej samej rangi co pierwsza, ponieważ będą miały ten sam kolor (wyjaśniono poniżej). Zawsze można wybrać pierwszą kartę i ukryte karty, tak aby ukryta karta była od 1 do 6 rang wyższych niż pierwsza (przy liczeniu w kręgach). Jeśli pierwsza karta ma wartość 1 , ukryta karta będzie wynosić 2,3,4,5,6 lub 7 . Jeśli pierwszą kartą jest J , ukrytą kartą będą Q, K, A, 2,3 lub 4 itd.
Algorytm:
Pierwsza karta: ta karta będzie miała ten sam kolor co karta ukryta. Karta będzie także punktem odniesienia, którego użyjesz przy ustalaniu rangi ukrytej karty.
Karty 2., 3. i 4. dekodują wartość z zakresu 1–6 . Trzy karty nazywamy S, M, L (najmniejsza karta, środkowa karta, największa karta). Wartości zostaną zakodowane w następujący sposób (porządek leksykograficzny):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Tak więc, jeśli ranga pierwszej karty wynosi 5 , a pozostałe trzy karty mają rangę 4 Q 7 ( zamawia się je SLM ), to ostatnia karta ma rangę 5 + 2 = 7 . Możesz wybrać, czy as ma być najwyższą czy najniższą kartą, o ile jest ona spójna.
Jeśli kilka kart ma tę samą wartość, kolor określa kolejność, w której C <D <H <S .
Format wejściowy:
Cztery karty zostaną podane jako H3 (trzy serca), DK (król diamentów) i tak dalej. Zamiast tego możesz wybrać dane wejściowe na odwrót jako 3H i KD .
Dane wejściowe mogą mieć dowolny dogodny format, ale nie można łączyć listy kolorów w jednej zmiennej i listy rang w innej. 'D5', 'H3' ..
i [['D',5],['H',3] ...
oba są w porządku, ale 'DHCH',[5,3,1,5]
nie jest. Nie można korzystać z numerów zamiast liter, z wyjątkiem T .
Wynik
Ukryta karta, w tym samym formacie co wejście.
Przykład
Zróbmy solucję:
Input:
D3 S6 H3 H9
Wiemy, że ukryta karta to diament, ponieważ pierwsza karta to diament. Wiemy również, że ranga wynosi 4,5,6,7,8 lub 9, ponieważ ranga pierwszej karty to 3 .
Pozostałe karty są uporządkowane 6,3,9 ==> M, S, L , co koduje wartość 3 . Ukryta karta to zatem 3 + 3 = 6 karo, dlatego wyjście powinno wynosić D6 .
Przypadki testowe:
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
To jest golf golfowy , więc wygrywa najkrótsze rozwiązanie w każdym języku. Wyjaśnienia są zachęcane!
1 Istnieją cztery kolory ( C lubs, D iamonds, H earts i S pades).
2 jest 13 stopnie, 2,3,4,5,6,7,8,9,10, J, P, K, A . Możesz wybrać T zamiast 10 .
92427**3
i zmodyfikuj,k+7
abyk+8
zapisać 1 bajt: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