Profesor MIT potrafi czytać w myślach!

46

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:

  1. Wybierając 5 losowych kart, masz gwarancję, że co najmniej dwie karty mają ten sam kolor 1 .

  2. 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.

szeregi kart od A do K ułożone w okrąg


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 , 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 .

Stewie Griffin
źródło

Odpowiedzi:

17

JavaScript (ES6), 130 102 bajtów

Pobiera dane wejściowe jako tablicę ciągów w "Rs"formacie, gdzie R to ranga, a s to kolor. Oczekuje „T” na 10. Asy są niskie.

a=>(s='A23456789TJQK')[([[R,[,S]],B,C,D]=a.map(c=>[s.search(c[0])+14,c]),R+=D<C|2*((D<B)+(C<B)))%13]+S

Wypróbuj online!

W jaki sposób?

Najpierw przekształcamy każdą kartę w tablicę [ranga, karta], gdzie ranga jest wartością liczbową w [14 ... 26], a karta jest oryginalnym ciągiem.

[[R, [, S]], B, C, D] = a.map(c => ['A23456789TJQK'.search(c[0]) + 14, c])

Rangę i garnitur z pierwszej karty są przechowywane w R i S odpowiednio. Trzy pozostałe karty są przechowywane w B , C i D .

Na przykład ['3c','6h','6c','2s']staje się:

[ [ 16, '3c' ], [ 19, '6h' ], [ 19, '6c' ], [ 15, '2s' ] ]
    ^^    ^     <---------->  <---------->  <---------->
    R     S          B             C             D

Następnie porównujemy każdą parę w [B, C, D] . Te elementy są domyślnie przymuszane do ciągów, gdy są one porównywane ze sobą:

[ 19, '6h' ] --> '19,6h'

Ponieważ zarówno ranga, jak i karta składają się z dokładnie dwóch znaków, można bezpiecznie porównywać w porządku leksykograficznym.

Obliczamy:

(D < C) | 2 * ((D < B) + (C < B))

Poniżej znajdują się wszystkie możliwe kombinacje:

 B, C, D | v0 = D < B  | v1 = C < B  | v2 = D < C  | v2|2*(v0+v1)
---------+-------------+-------------+-------------+--------------
 S, M, L |    false    |    false    |    false    |      0
 S, L, M |    false    |    false    |    true     |      1
 M, S, L |    false    |    true     |    false    |      2
 M, L, S |    true     |    false    |    true     |      3
 L, S, M |    true     |    true     |    false    |      4
 L, M, S |    true     |    true     |    true     |      5

Na koniec budujemy kartę wyjściową przy użyciu R , S i powyższego wyniku:

'A23456789TJQK'[(R += D < C | 2 * ((D < B) + (C < B))) % 13] + S
Arnauld
źródło
Twój wariant nie jest bezużyteczny, to po prostu zły wybór bazy i mocy! Użyj 92427**3i zmodyfikuj, k+7aby k+8zapisać 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
asgallant
187**97i k+15również działa, ale jestem prawie pewien, że są to jedyne dwa zestawy krótsze dla tego algorytmu.
asgallant
@asgallant Ładne znalezisko!
Arnauld,
@asgallant 1/34547z k+14również działa.
Arnauld
15

Python 2 , 143 140 138 136 127 125 124 123 121 bajtów

lambda(S,V),*l:S+N[F(V)+int(`map(sorted(l,key=lambda(s,v):(F(v),s)).index,l)`[1::3],3)*3/10]
N='23456789TJQKA'*2;F=N.find

Wypróbuj online!

Asy są wysokie


Koduje trzy karty, znajdując ich pozycję na posortowanej liście kart ( 0=smallest, 1=middle, 2=largest):

cards:   [SK, C4, H4]
sorted:  [C4, H4, SK]

ranks:   [ 2            index of SK in sorted
ranks:   [ 2,  0        index of C4 in sorted
ranks:   [ 2,  0,  1    index of H4 in sorted
ranks:   [ 2,  0,  1] = L,S,M

Jest to konwertowane na liczbę całkowitą w bazie 3 i mnożone przez 3 i dzielone przez 10:

int('201',3) = 19 -> 19*3//10 = 5

Różne kodowania to:

cards            base3    *3   /10
[0, 1, 2]  012     5      15     1
[0, 2, 1]  021     7      21     2
[1, 0, 2]  102     11     33     3
[1, 2, 0]  120     15     45     4
[2, 0, 1]  201     19     57     5
[2, 1, 0]  210     21     63     6

Zapisano:

  • -2 bajty, dzięki ovs
TFeld
źródło
Kiedy pisałem wyzwanie, myślałem o tym, jak to rozwiązać, stosując podejście trójskładnikowe, ale nie znalazłem dobrego sposobu na zrobienie tego ... Pomnożenie przez 3było sprytne! Dobra odpowiedź :)
Stewie Griffin
@StewieGriffin Dzięki :) Teraz dodaję 0na końcu i dzielę przez 10, co wygląda na równoważne.
TFeld
1
@Arnauld. Zaktualizowałem opis, aby mam nadzieję, że nieco wyjaśnię, co robię.
TFeld
10

Galaretka , 33 bajty

ØDḊḊ;“TJQKA”p“CDHS”
¢iⱮµḊŒ¿×4+Ḣị¢

Wypróbuj online!

Wyjaśnienie

Pierwsza linia jest niladyczna. Daje listę 52 kart

ØDḊḊ;“TJQKA”p“CDHS”
ØD                   Digits: '0123456789'
  ḊḊ                 Dequeue twice: '23456789'
    ;                Append with...
     “TJQKA”         ...the string 'TJQKA': '23456789TJQKA'. These are the ranks
            p        Cartesian product with...
             “CDHS”  ...the suits.
                     This yields the list of all cards in lexicographic order:
                                 ['2C', '2D', '2H', '2S',
                                  '3C', ...         'AS']

W głównym linku ¢wywołuje wynik pierwszego linku, którym jest lista kart.

¢iⱮµḊŒ¿×4+Ḣị¢
¢              List of cards
 iⱮ            Index of each (Ɱ) of the inputs in the list.
   µ           New monadic link. The list of indices become this links argument.
    Ḋ          Remove the first one.
     Œ¿        Index of the permutation of the last three items. Gives a number 1-6
               as described in the problem statement.
       ×4      Multiply this by 4 so that when we add to the index of the first
               card we end up in the same suit.
         +Ḣ    Add the first index.
           ị   Use this number to index into...
            ¢  ...the list of cards.
dylnan
źródło
1
Nie możesz użyć 1asa.
Erik the Outgolfer,
@EriktheOutgolfer zmienił się z powrotem na A
dylnan
Możesz użyć rejestru, aby zapisać bajt
Jonathan Allan
5

APL (Dyalog Unicode) , 49 bajtów SBCS

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'

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:

x⌽⍨⊃i-4×2-⌊1.8⊥⍋1i←⎕⍳⍨x←,⍉'CDHS'∘.,2↓⎕D,'TJQKA'
                                       D,'TJQKA'  Concatenate a list of numbers with TJQKA
                                     2            Drop 2 (removes "01")
                                  ∘.,              Generate the outer product of this prefixed with
                            'CDHS'                 The suits
                                                  Invert rows/columns
                          ,                        Flatten (matrix -> array)
                        x                         Store in x
                      ⍳⍨                           Inverted ⍳⍨: find the indices, in our cards,
                                                  of the argument cards
                   i                              Store these indices in i
                 1                                Remove the first index
                                                  Grade: get ordered indices
         2-⌊1.8                                   The magic happens here: get the number from 1 to 6
       4×                                          Multiply by 4 to get the same "back" on the card
    i-                                            Substract the result from our first index (which we had discarded)
x⌽⍨                                               (Modulated) Index into x (our cards) with this value
Ven
źródło
4

Siatkówka , 218 208 bajtów

[JQK]
1$&
T`AJQK`1123
*' G0`
\d+
5**
' G, 1,`
T`CD\HS`d
\d
*
/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6
\d
$+3-$&
(\d+)-(\d+)
$1*_$2*
_{13}(_+)|(_{1,13})
$.($1$2

Wypróbuj online!

Wyjaśnienie:

[JQK]
1$&
T`AJQK`1123

Zastępuje asy, walety, królowe i króle 1, 11, 12 i 13. Pierwsze dwie linie poprzedzają 1przed literą, a ostatnia transliteracja drugiej cyfry.

*' G0`

*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 i G0trwa pierwsza (tak stwierdzi pierwszą kartę).

\d+
5**
' G, 1,`'

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.

T`CD\HS`d
\d
*

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ść.

/^(_+)¶\1/(/¶(_+)¶\1/(K`1
/^(_+)¶_+¶\1/(K`2
))K`4
/^(_+)¶_+¶\1/(K`3
/¶(_+)¶\1/(K`5
)))K`6

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). Koznacza stałą.

\d
$+3-$&

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-$&. $+3wchodzi 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}

(\d+)-(\d+)
$1*_$2*

To zamienia dwie liczby w jedności i dodaje je do siebie.

_{13}(_+)|(_{1,13})
$.($1$2

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.

lolad
źródło
Naprawiony! Odwróciłem wyrażenie regularne, aby nadać priorytet liczbom większym niż 13
Lolad
3

Węgiel drzewny , 64 62 bajtów

≔⪪⭆⁺⭆⁸⁺²ιTJQKA⭆CDHS⁺λι²δ≔E⟦ηζε⟧⌕διυ§δ⁺⌕δθ×⁴⊕⁺∧⌕υ⌊υ⊗⊕¬⌕υ⌈υ‹⊟υ⊟υ

Wypróbuj online! Link jest do pełnej wersji kodu. Używa T10 i sortuje Awysoko. Wskaźnik permutacji nie był bardzo łatwo dekodowany; inna kolejność permutacji zaoszczędziłaby mi co najmniej trzy bajty. Wyjaśnienie:

⁺⭆⁸⁺²ιTJQKA

Dodaj 2 do wszystkich liczb całkowitych od 0 do 7, a następnie połącz je i przyrostek TJQKAdla kart graficznych i asa. Pozwala to zaoszczędzić 2 bajty na literałach ciągu, chociaż okazuje się, że Awysokie może i tak zaoszczędzić bajt dzięki kompresji ciągu.

≔⪪⭆...⭆CDHS⁺λι²δ

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.

≔E⟦ηζε⟧⌕διυ

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ści 0, 2a 4; jest to następnie zwiększane, 1zależ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.

Neil
źródło
2

Python 2 , 147 bajtów

lambda a:a[0][0]+R[h(map(a[1:].index,sorted(a[1:],key=lambda c:(I(c[1]),c))))+I(a[0][1])]
R='A23456789TJQK'*2;I=R.index
h=lambda(x,y,z):x*2+(y>z)+1

Wypróbuj online!

Chas Brown
źródło
144 bajty
ovs
2

Pyth, 42 bajty

+hhQ@J+`M}2Tmk"JQKA"+hhKm,xJtdhdQhx.pStKtK

Naprawdę brzydka ...

Wypróbuj online: Demontration lub Test Suite

Jakube
źródło
2

J , 68 bajtów

r=.'23456789TJQKA'
{:@{.,~0{r|.~1+(r i.0{{.)+(>,{r;'CDHS')A.@/:@i.}.

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.

Jonasz
źródło
1

JavaScript (Node.js) , 124 bajty

s=>(k='23456789TJQKA')[p=t=>k.search(s[t][0])+32+s[t][1],u=p(0),(u[0]+u[1]-2*(p(1)<p(2))-2*(p(1)<p(3))-(p(2)<p(3)))%13]+u[2]

Wypróbuj online!

JavaScript (Node.js) , 125 bajtów

s=>(k='23456789TJQKA')[p=s.map(t=>k.search(t[0])+32+t[1]),u=p[0],(u[0]+u[1]-2*(p[1]<p[2])-2*(p[1]<p[3])-(p[2]<p[3]))%13]+u[2]

Wypróbuj online!

l4m2
źródło
1

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

DECLARE @ TABLE(c char(2),i int identity(4,-1))
INSERT @
VALUES('2C'),('AH'),('QS'),('KC')

SELECT
substring(max(h+h),max(charindex(q,h)*w)+power(sum(r)*3,.5)-11,1)+max(right(c,w))
FROM(SELECT*,i%4*power(3,rank()over(order by w,charindex(q,h),c))r
FROM(SELECT*,i/4w,left(c,1)q,'A23456789TJQK'h FROM @)d)y

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ą

pierwsza karta ma wartość sekwencji 27 *

druga karta ma wartość sekwencji równą 9 *

trzecia karta ma wartość sekwencji 3 *

Po pomnożeniu przez 3, pierwiastek kwadratowy zaokrąglony w dół staje się ładną kolejną liczbą.

Order    27,9,3*order=r   sum(r)*3    floor sqrt
S M L -> 1*27+2*9+3*3  -> 162      -> 12
S L M -> 1*27+3*9+2*3  -> 180      -> 13
M S L -> 2*27+1*9+3*3  -> 216      -> 14 
M L S -> 2*27+3*9+1*3  -> 252      -> 15
L S M -> 3*27+1*9+2*3  -> 288      -> 16
L M S -> 3*27+2*9+1*3  -> 306      -> 17
t-clausen.dk
źródło
1

05AB1E , 37 bajtów

2TŸ.•3u§•S«.•ôì•âíJuDIkćsD{œJsJk>4*+è

Port @dylnan odpowiedzi galaretki , ale niestety 05AB1E nie ma wbudowanego indeksu permutacji.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

2TŸ                # Push the list [2,3,4,5,6,7,8,9,10]
   .•3u§•S         # Push compressed string "jqka", converted to a list of characters
          «        # Merge the lists together
.•ôì•              # Push compressed string "cdhs"
     â             # Create each possible pair
      í            # Reverse each pair
       Ju          # Join each pair together, and convert to uppercase
D                  # Duplicate the deck
 Ik                # Get the index of the cards of the input-list in the deck
   ć               # Extract head; pop and push remainder and head
    s              # Swap to get the remainder
     D{            # Create a sorted copy
       œ           # Get the permutations of that
        JsJk       # Get the index of the unsorted permutation in this permutations list
            >      # Increase it by 1 (since 05AB1E has 0-based indexing)
             4*    # Multiply it by 4
               +   # Add it to the extracted head
                è  # And index it into the duplicated deck
                   # (after which the result is output implicitly)

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".

Kevin Cruijssen
źródło