Il compito è stato preso da una lezione del MIT del Prof. Devadas chiamata Puoi leggere le menti . Una spiegazione dettagliata del trucco può essere trovata nel video collegato o in questo documento . Proverò a spiegarlo in termini più semplici.
Si scopre che questo è stato inventato negli anni '30 ed è noto come "Five-Card Trick of Fitch Cheney" .
Il trucco va così:
- Cinque carte casuali sono scelte da un mazzo di carte. Il pubblico e il tuo assistente possono vederli, ma tu no.
- Il tuo assistente (con il quale ti sei esercitato) selezionerà quattro di quelle carte e te le mostrerà in un ordine specifico. Nota che la carta nascosta non viene scelta casualmente dalle 5 carte. L'assistente prende una / la carta che farà funzionare il trucco.
- Deducerai, in base alle informazioni che puoi raccogliere dalle quattro carte, qual è la quinta carta.
Come?
Tieni a mente i seguenti due punti:
Quando si scelgono 5 carte casuali, si garantisce che almeno due carte hanno lo stesso seme 1 .
L'immagine seguente mostra un cerchio con tutti i gradi 2 . Poiché è un cerchio, è possibile contare: J, Q, K, A, 2, 3 (ovvero conteggio modulare). Hai la garanzia che la carta nascosta non ha lo stesso valore della prima, poiché saranno dello stesso seme (spiegato di seguito). È sempre possibile scegliere la prima carta e le carte nascoste in modo tale che la carta nascosta sia tra 1 e 6 gradi più alta della prima (quando si conta nei cerchi). Se la prima carta è 1 , la carta nascosta sarà 2,3,4,5,6 o 7 . Se la prima carta è J , la carta nascosta sarà Q, K, A, 2,3 o 4 e così via.
L'algoritmo:
La prima carta: questa carta avrà lo stesso seme della carta nascosta. La carta sarà anche il punto di riferimento che userai per capire il valore della carta nascosta.
Le carte 2a, 3a e 4a decodificano un valore compreso nell'intervallo 1 ... 6 . Chiameremo le tre carte S, M, L (carta più piccola, carta centrale, carta più grande). I valori verranno codificati in questo modo (ordine lessicografico):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Quindi, se il rango della prima carta è 5 e le restanti tre carte hanno rango 4 Q 7 (sono ordinate SLM ), allora l'ultima carta ha rango 5 + 2 = 7 . Puoi scegliere se l'asso deve essere la carta più alta o più bassa, purché sia coerente.
Se più carte condividono il valore, allora il seme determinerà l'ordine, dove C <D <H <S .
Formato di input:
Le quattro carte saranno date come H3 (tre di cuori), DK (re di quadri) e così via. Puoi scegliere di prendere l'input viceversa come 3H e KD .
L'input può essere in qualsiasi formato conveniente, ma non è possibile combinare l'elenco dei semi in una variabile e l'elenco dei ranghi in un'altra. 'D5', 'H3' ..
e [['D',5],['H',3] ...
sono entrambi OK, ma 'DHCH',[5,3,1,5]
non lo è. Non è possibile utilizzare i numeri al posto delle lettere, ad eccezione di T .
Produzione
La carta nascosta, nello stesso formato dell'input.
Esempio
Facciamo una procedura dettagliata:
Input:
D3 S6 H3 H9
Sappiamo che la carta nascosta è un diamante, poiché la prima carta è un diamante. Sappiamo anche che il valore è 4,5,6,7,8 o 9 poiché il valore della prima carta è 3 .
Le carte rimanenti sono ordinate 6,3,9 ==> M, S, L , che codifica il valore 3 . La carta nascosta è quindi 3 + 3 = 6 di diamanti, quindi l'output dovrebbe essere D6 .
Casi test:
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
Questo è code-golf , quindi vince la soluzione più breve in ogni lingua. Le spiegazioni sono incoraggiate!
1 Ci sono quattro semi ( C lubs, D iamonds, H earts e S pads).
2 ci sono 13 gradi, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Puoi scegliere di usare T invece di 10 .
92427**3
e modificarek+7
perk+8
salvare 1 byte: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