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 .
źródło
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
187**97
ik+15
również działa, ale jestem prawie pewien, że są to jedyne dwa zestawy krótsze dla tego algorytmu.1/34547
zk+14
również działa.Python 2 ,
143140138136127125124123121 bajtówWypróbuj online!
Asy są wysokie
Koduje trzy karty, znajdując ich pozycję na posortowanej liście kart (
0=smallest, 1=middle, 2=largest
):Jest to konwertowane na liczbę całkowitą w bazie 3 i mnożone przez 3 i dzielone przez 10:
Różne kodowania to:
Zapisano:
źródło
3
było sprytne! Dobra odpowiedź :)0
na końcu i dzielę przez 10, co wygląda na równoważne.Galaretka , 33 bajty
Wypróbuj online!
Wyjaśnienie
Pierwsza linia jest niladyczna. Daje listę 52 kart
W głównym linku
¢
wywołuje wynik pierwszego linku, którym jest lista kart.źródło
1
asa.APL (Dyalog Unicode) , 49 bajtów SBCS
Wypróbuj online!
Przegląd:
'CDHS'∘.,2↓⎕D,'TJQKA'
generuje produkt zewnętrzny, więc macierz 2D z(C2 C3 C4 ...), (D2 D3 D4 ...), ...
. Następnie transponujemy tę macierz, aby ją uzyskać,(C2 D2 H2 ...), ...
a następnie spłaszczyć.Dzięki @ngn za
2-⌊1.8⊥
, który przyjmuje kolejność kart (SML = 1 2 3) i ocenia je (jak od 1 do 6 w PO).Objaśnienie kodu:
źródło
Siatkówka ,
218208 bajtówWypróbuj online!
Wyjaśnienie:
Zastępuje asy, walety, królowe i króle 1, 11, 12 i 13. Pierwsze dwie linie poprzedzają
1
przed literą, a ostatnia transliteracja drugiej cyfry.*
Wskazuje, że na tym etapie nie należy zmodyfikować ciąg roboczy. Może to powodować, że scena wydaje się bezcelowa, ale przyda się później.'
Dzieli ciąg roboczy w każdej przestrzeni iG0
trwa pierwsza (tak stwierdzi pierwszą kartę).Pierwsze dwa wiersze mnożą liczby na kartach przez 5, a następnie zamieniają je w jedności (na przykład 5 jest reprezentowane jako _____), dzięki czemu możemy później dodać mniejsze kwoty dla kolorów. Ostatnia linia dzieli się na spacje i zachowuje ostatnie trzy karty.
Konwertuje trefl, karo, kier i pik na odpowiednio 0, 1, 2 i 3, i zamienia liczbę na jednorzędową. Ponieważ jest on teraz dołączony do części liczbowej karty, da unikalną wartość karcie, określając jej wysokość.
Znajduje to kolejność kart i wartość dodawaną do pierwszej karty. Na przykład w pierwszym wierszu
/^(_+)¶\1_+/(
pasuje do zamówień, których środkowa wartość jest większa niż pierwsza wartość. Tworzy pętlę if-else dla tego, co należy zrobić (ponieważ kolejność ta odpowiada permutacjom 1, 2 i 4).K
oznacza stałą.Pamiętasz wcześniej, kiedy zwykliśmy
*
wskazywać, że etap nie wpłynie na działający ciąg? Właśnie tam go używamy. Ten etap jest etapem zastępującym; zastępuje numer, który należy dodać$+3-$&
.$+3
wchodzi na*
scenę, otrzymuje kolor i numer pierwszej karty,-
działa jako separator i$&
jest meczem. Więc łańcuch roboczy jest teraz{suit}{original number}-{number to add}
To zamienia dwie liczby w jedności i dodaje je do siebie.
Górna linia przechwytuje liczbę lub liczbę - 13 (abyśmy nie otrzymywali wyników np. S16). Dolna linia zmienia przechwyconą liczbę z powrotem w podstawę 10, a wynik jest drukowany niejawnie.
źródło
Węgiel drzewny ,
6462 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Używa
T
10 i sortujeA
wysoko. Wskaźnik permutacji nie był bardzo łatwo dekodowany; inna kolejność permutacji zaoszczędziłaby mi co najmniej trzy bajty. Wyjaśnienie:Dodaj 2 do wszystkich liczb całkowitych od 0 do 7, a następnie połącz je i przyrostek
TJQKA
dla kart graficznych i asa. Pozwala to zaoszczędzić 2 bajty na literałach ciągu, chociaż okazuje się, żeA
wysokie może i tak zaoszczędzić bajt dzięki kompresji ciągu.Mapuj karty i kolory, łącząc je ze sobą. Ponieważ normalnie tworzyłoby to zagnieżdżoną tablicę, wyniki są zamiast tego konkatenowane w pojedynczy łańcuch, który następnie jest ponownie dzielony na pary znaków.
Znajdź pozycje drugiej, trzeciej i czwartej karty.
Oblicz 1-indeksowany indeks permutacji. Pierwsze dwie kombinacje mają najpierw najmniejszą kartę; jest to testowane przez
⌕υ⌊υ
. Pozostałe dwie pary permutacji różnią się w zależności od tego, czy największa karta jest pierwsza; jest to testowane przez⌕υ⌈υ
. Operacje logiczne i arytmetyczne następnie odwzorować te testy do wartości0
,2
a4
; jest to następnie zwiększane,1
zależnie od porównania trzeciej i czwartej karty, testowanej przez‹⊟υ⊟υ
. Na koniec indeks jest zwiększany, aby uzyskać pożądane kodowanie.Pomnóż to przez 4 powtórzenie odległości między kartami tego samego koloru, dodaj pozycję pierwszej karty i cyklicznie indeksuj i drukuj wynik.
źródło
Python 2 , 147 bajtów
Wypróbuj online!
źródło
Pyth, 42 bajty
Naprawdę brzydka ...
Wypróbuj online: Demontration lub Test Suite
źródło
J , 68 bajtów
Wypróbuj online!
Uwaga: -3 off bajtów TIO, ponieważ się
f=.
nie liczy. Spróbuję zagrać w golfa dalej i dodam wyjaśnienia jutro.źródło
JavaScript (Node.js) , 124 bajty
Wypróbuj online!
JavaScript (Node.js) , 125 bajtów
Wypróbuj online!
źródło
T-SQL, 211 bajtów
Dane wejściowe to zmienna tabelowa. Przy użyciu T na 10 asy są niskie
Format rangi / koloru karty KH, 6D, TS
Wypróbuj online bez golfa
Zwróć uwagę, jak obliczana jest wartość SML (12-17):
Logicznie S, M, L (1,2,3) jest konwertowane na wartość liczbową
Po pomnożeniu przez 3, pierwiastek kwadratowy zaokrąglony w dół staje się ładną kolejną liczbą.
źródło
05AB1E , 37 bajtów
Port @dylnan odpowiedzi galaretki , ale niestety 05AB1E nie ma wbudowanego indeksu permutacji.
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków, które nie są częścią słownika? ), Aby zrozumieć, dlaczego
.•3u§•
jest"jqka"
i.•ôì•
jest"cdhs"
.źródło