A tarefa é retirada de uma palestra do Prof. Devadas, do MIT, chamada Você pode ler mentes . Uma explicação detalhada do truque pode ser encontrada no vídeo vinculado ou neste documento . Vou tentar explicar em termos mais simples.
Acontece que isso foi inventado na década de 1930 e é conhecido como o "truque de cinco cartas da Fitch Cheney" .
O truque é assim:
- Cinco cartas aleatórias são escolhidas de um baralho. A platéia e seu assistente podem vê-los, mas você não.
- Seu assistente (com quem você praticou) selecionará quatro dessas cartas e as mostrará em uma ordem específica. Observe que o cartão oculto não é escolhido aleatoriamente entre os 5 cartões. O assistente escolhe um / o cartão que fará o truque funcionar.
- Você deduzirá, com base nas informações que pode coletar dos quatro cartões, o que é o quinto cartão.
Quão?
Lembre-se dos dois pontos a seguir:
Ao escolher 5 cartas aleatórias, você tem a garantia de que pelo menos duas cartas têm o mesmo naipe 1 .
A imagem abaixo mostra um círculo com todas as classificações 2 . Como é um círculo, é possível contar: J, Q, K, A, 2, 3 (isto é, contagem modular). Você está garantido que a carta oculta não tem a mesma classificação que a primeira, pois será do mesmo naipe (explicado abaixo). Sempre é possível escolher o primeiro cartão e os cartões ocultos, de modo que o cartão oculto esteja entre 1 e 6 graus mais alto que o primeiro (quando contando em círculos). Se o primeiro cartão for 1 , o cartão oculto será 2,3,4,5,6 ou 7 . Se o primeiro cartão for J , o cartão oculto será Q, K, A, 2,3 ou 4 e assim por diante.
O algoritmo:
A primeira carta: esta carta terá o mesmo naipe da carta oculta. O cartão também será o ponto de referência que você usará ao descobrir a classificação do cartão oculto.
As 2ª, 3ª e 4ª cartas decodificam um valor no intervalo inclusivo 1 ... 6 . Chamaremos os três cartões de S, M, L (cartão menor, cartão do meio, cartão maior). Os valores serão codificados desta forma (ordem lexicográfica):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Portanto, se o ranking da primeira carta for 5 e as três cartas restantes tiverem classificação 4 Q 7 (elas são ordenadas SLM ), a última carta terá classificação 5 + 2 = 7 . Você pode escolher se o ás deve ser a carta mais alta ou mais baixa, desde que seja consistente.
Se várias cartas compartilharem o mesmo ranking, o naipe determinará a ordem em que C <D <H <S .
Formato de entrada:
As quatro cartas serão dadas como H3 (três de copas), DK (rei de diamantes) e assim por diante. Você pode optar por considerar a entrada como 3H e KD .
A entrada pode estar em qualquer formato conveniente, mas você não pode combinar a lista de naipes em uma variável e a lista de classificações em outra. 'D5', 'H3' ..
e [['D',5],['H',3] ...
são ambos OK, mas 'DHCH',[5,3,1,5]
não é. Você não pode usar números em vez de letras, com exceção de T .
Resultado
O cartão oculto, no mesmo formato que a entrada.
Exemplo
Vamos fazer uma explicação passo a passo:
Input:
D3 S6 H3 H9
Sabemos que o cartão oculto é um diamante, pois o primeiro cartão é um diamante. Também sabemos que o ranking é 4,5,6,7,8 ou 9, já que o ranking da primeira carta é 3 .
Os cartões restantes são encomendados 6,3,9 ==> M, S, L , que codifica o valor 3 . O cartão oculto é, portanto, 3 + 3 = 6 de diamantes, portanto a saída deve ser D6 .
Casos de teste:
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
Isso é código-golfe , então a solução mais curta em cada idioma vence. As explicações são incentivadas!
1 Existem quatro naipes ( C Lubs, D iamonds, H earts e S PAdES).
2 Existem 13 fileiras, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Você pode optar por usar T em vez de 10 .
92427**3
e modifiquek+7
parak+8
salvar 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