La tarea fue tomada de una conferencia del MIT por el Prof. Devadas llamada Puedes leer mentes . Puede encontrar una explicación detallada del truco en el video vinculado o en este documento . Trataré de explicarlo en términos más simples.
Resulta que esto fue inventado en la década de 1930, y se conoce como el "truco de cinco cartas de Fitch Cheney" .
El truco es así:
- Se eligen cinco cartas al azar de una baraja de cartas. El público y su asistente pueden verlos, pero usted no.
- Su asistente (con quien ha practicado) seleccionará cuatro de esas tarjetas y se las mostrará en un orden específico. Tenga en cuenta que la carta oculta no se elige al azar de las 5 cartas. El asistente elige una / la tarjeta que hará que el truco funcione.
- En base a la información que puede obtener de las cuatro cartas, deducirá cuál es la quinta carta.
¿Cómo?
Tenga en cuenta los siguientes dos puntos:
Al elegir 5 cartas al azar, tiene la garantía de que al menos dos cartas tienen el mismo palo 1 .
La siguiente imagen muestra un círculo con todos los rangos 2 . Como es un círculo, es posible contar: J, Q, K, A, 2, 3 (es decir, conteo modular). Se le garantiza que la carta oculta no tiene el mismo rango que la primera, ya que serán del mismo palo (se explica a continuación). Siempre es posible elegir la primera carta y las cartas ocultas de modo que la carta oculta tenga entre 1 y 6 rangos más altos que la primera (al contar en círculos). Si la primera carta es 1 , la carta oculta será 2,3,4,5,6 o 7 . Si la primera carta es J , la carta oculta será Q, K, A, 2,3 o 4 y así sucesivamente.
El algoritmo:
La primera carta: esta carta tendrá el mismo palo que la carta oculta. La tarjeta también será el punto de referencia que usará al determinar el rango de la tarjeta oculta.
Las tarjetas segunda, tercera y cuarta decodifican un valor en el rango inclusivo 1 ... 6 . Llamaremos a las tres tarjetas S, M, L (tarjeta más pequeña, tarjeta del medio, tarjeta más grande). Los valores se codificarán así (orden lexicográfico):
S M L -> 1
S L M -> 2
M S L -> 3
M L S -> 4
L S M -> 5
L M S -> 6
Entonces, si el rango de la primera carta es 5 , y las tres cartas restantes tienen rangos 4 Q 7 (están ordenadas SLM ), entonces la última carta tiene rango 5 + 2 = 7 . Puedes elegir si el as debe ser la carta más alta o más baja, siempre que sea consistente.
Si varias cartas comparten rango, entonces el palo determinará el orden, donde C <D <H <S .
Formato de entrada:
Las cuatro cartas se darán como H3 (tres de corazones), DK (Rey de diamantes) y así sucesivamente. Puede optar por tomar la entrada al revés como 3H y KD .
La entrada puede estar en cualquier formato conveniente, pero no puede combinar la lista de trajes en una variable y la lista de rangos en otra. 'D5', 'H3' ..
y [['D',5],['H',3] ...
ambos están bien, pero 'DHCH',[5,3,1,5]
no lo es. No se pueden utilizar los números en lugar de letras, a excepción de T .
Salida
La tarjeta oculta, en el mismo formato que la entrada.
Ejemplo
Hagamos un tutorial:
Input:
D3 S6 H3 H9
Sabemos que la carta oculta es un diamante, ya que la primera carta es un diamante. También sabemos que el rango es 4,5,6,7,8 o 9 ya que el rango de la primera carta es 3 .
Las cartas restantes se ordenan 6,3,9 ==> M, S, L , que codifica el valor 3 . La carta oculta es, por lo tanto, 3 + 3 = 6 de diamantes, por lo tanto, la salida debe ser D6 .
Casos de prueba:
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
Este es el código de golf , por lo que gana la solución más corta en cada idioma. ¡Se alientan las explicaciones!
1 Hay cuatro trajes ( C lubs, D iamonds, H earts y S pades).
2 Hay 13 filas, 2,3,4,5,6,7,8,9,10, J, Q, K, A . Puedes elegir usar T en lugar de 10 .
92427**3
y modifiquek+7
parak+8
guardar 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