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 .
fuente
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
187**97
yk+15
también funciona, pero estoy bastante seguro de que esos son los únicos dos conjuntos que son más cortos para este algoritmo.1/34547
conk+14
también funciona.Python 2 ,
143140138136127125124123121 bytesPruébalo en línea!
Los ases son altos
Codifica las tres cartas al encontrar su posición en una lista ordenada de las cartas (
0=smallest, 1=middle, 2=largest
):Esto se convierte en un número entero en la base 3 y se multiplica por 3, y se divide por 10:
Las diferentes codificaciones son:
Salvado:
fuente
3
fue inteligente! Buena respuesta :)0
al final y divido por 10, lo que parece ser equivalente.Jalea , 33 bytes
Pruébalo en línea!
Explicación
La primera línea es niládica. Produce una lista de las 52 cartas.
En el enlace principal,
¢
llama al resultado del primer enlace, que es la lista de tarjetas.fuente
1
para as.APL (Dyalog Unicode) , SBCS de 49 bytes
Pruébalo en línea!
Descripción general:
'CDHS'∘.,2↓⎕D,'TJQKA'
genera el producto externo, por lo que una matriz 2D con(C2 C3 C4 ...), (D2 D3 D4 ...), ...
. Luego transponemos esta matriz para obtener(C2 D2 H2 ...), ...
y luego aplanar eso.Gracias a @ngn por el
2-⌊1.8⊥
, que toma el orden de las tarjetas (SML = 1 2 3) y las califica (como el 1 al 6 en el OP).Explicación del código:
fuente
Retina ,
218208 bytesPruébalo en línea!
Explicación:
Reemplaza ases, jotas, reinas y reyes con 1, 11, 12 y 13. Las primeras dos líneas anteponen una
1
antes de la letra, y la última translitera el segundo dígito.El
*
indica que esta etapa no debe modificar la cadena de trabajo. Esto puede hacer que el escenario parezca inútil, pero será útil más adelante. El'
divide la cadena de trabajo en cada espacio, yG0
toma el primero (por lo que se encuentra la primera tarjeta).Las primeras dos líneas multiplican los números en las tarjetas por 5, luego los convierten en unarios (por ejemplo, 5 se representa como _____), para que podamos agregar cantidades más pequeñas para palos más adelante. La línea final se divide en espacios y mantiene las últimas tres cartas.
Esto convierte clubes, diamantes, corazones y espadas a 0, 1, 2 y 3 respectivamente, y convierte el número en unario. Dado que ahora está en la parte adjunta de la parte del número de la tarjeta, le dará un valor único para la tarjeta, determinando qué tan alto es.
Esto encuentra el orden de las tarjetas y el valor para agregar a la primera tarjeta. Por ejemplo, en la primera línea
/^(_+)¶\1_+/(
coincide las órdenes que tienen un valor medio mayor que el primer valor. Crea un bucle if-else para saber qué hacer (ya que este orden coincide con las permutaciones 1, 2 y 4).K
marca una constante¿Recuerdas antes cuando solíamos
*
indicar que una etapa no afectaría la cadena de trabajo? Aquí es donde lo usamos. Esta etapa es una etapa de reemplazo; reemplaza el número para agregar$+3-$&
.$+3
accede al*
escenario, obtiene el palo y el número de la primera carta,-
actúa como separador y$&
es el partido. Entonces la cadena de trabajo es ahora{suit}{original number}-{number to add}
Esto convierte los dos números en unarios y los suma.
La línea superior captura el número o el número - 13 (para que no obtengamos, por ejemplo, S16). La línea inferior convierte el número capturado nuevamente en la base 10, y el resultado se imprime implícitamente.
fuente
Carbón ,
6462 bytesPruébalo en línea! El enlace es a la versión detallada del código. Usos
T
para 10 y clasificaA
alto. El índice de permutación no se decodificó muy fácilmente; un orden de permutación diferente me habría ahorrado al menos tres bytes. Explicación:Agregue 2 a todos los enteros de 0 a 7, luego concatente y sufijo
TJQKA
para las tarjetas con imágenes y as. Esto ahorra 2 bytes sobre un literal de cadena, aunque resulta que tener un valorA
alto habría ahorrado un byte a través de la compresión de cadena de todos modos.Mapa sobre las tarjetas y los trajes, concatenando a los dos juntos. Como esto normalmente produciría una matriz anidada, los resultados se concatenan en una sola cadena que luego se divide en pares de caracteres nuevamente.
Encuentra las posiciones de la segunda, tercera y cuarta cartas.
Calcule el índice de permutación indexado 1. Las dos primeras permutaciones tienen primero la carta más pequeña; Esto se prueba a través de
⌕υ⌊υ
. Los otros dos pares de permutaciones se diferencian en cuanto a si la carta más grande es la primera; Esto se prueba a través de⌕υ⌈υ
. Las operaciones lógicas y aritméticas luego asignan estas pruebas a los valores0
,2
y4
; esto se incrementa1
dependiendo de la comparación entre la tercera y la cuarta carta, probada mediante‹⊟υ⊟υ
. Finalmente, el índice se incrementa para dar la codificación deseada.Multiplique eso por 4 repitiendo la distancia entre cartas del mismo palo, agregue la posición de la primera carta e indexe e imprima cíclicamente el resultado.
fuente
Python 2 , 147 bytes
Pruébalo en línea!
fuente
Pyth, 42 bytes
Realmente feo...
Pruébelo en línea: Demontration o Test Suite
fuente
J , 68 bytes
Pruébalo en línea!
Nota: -3 off TIO bytes porque
f=.
no cuenta. Intentará jugar más al golf y agregará una explicación mañana.fuente
JavaScript (Node.js) , 124 bytes
Pruébalo en línea!
JavaScript (Node.js) , 125 bytes
Pruébalo en línea!
fuente
T-SQL, 211 bytes
La entrada es una variable de tabla. Usando T para 10, los ases son bajos
Formato para tarjetas rango / palo KH, 6D, TS
Pruébelo en línea sin golf
Observe cómo se calcula el valor SML (12-17):
Lógicamente, S, M, L (1,2,3) se convierte en un valor numérico
Al multiplicar por 3, la raíz cuadrada redondeada hacia abajo se convierte en un buen número secuencial.
fuente
05AB1E , 37 bytes
Puerto de la respuesta Jelly de @dylnan , pero desafortunadamente 05AB1E no tiene el índice de permutación incorporado.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Consulte este consejo mío de 05AB1E (sección ¿Cómo comprimir cadenas que no forman parte del diccionario? ) Para comprender por qué
.•3u§•
es"jqka"
y.•ôì•
es"cdhs"
.fuente