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 .

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

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

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.

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

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.


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.




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.



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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.