Einstein escribió un acertijo. Dijo que el 98% del mundo no podía resolverlo.
Resolví este enigma en unos 25 minutos mientras estaba en el tren para ir a trabajar. Básicamente es solo deducción.
El acertijo
Hay 5 casas en 5 colores diferentes en una fila.
En cada casa vive una persona con una nacionalidad diferente.
Los 5 propietarios beben un determinado tipo de bebida, fuman una determinada marca de cigarros y mantienen una determinada mascota.
Ningún propietario tiene la misma mascota, fuma la misma marca de cigarros ni bebe la misma bebida.
Pregunta: ¿Quién es el dueño del pescado?
Para resolver este enigma, Einstein proporciona 15 pistas:
- El británico vive en la casa roja.
- El sueco mantiene a los perros como mascotas.
- El danés bebe té.
- La casa verde está a la izquierda inmediata de la casa blanca.
- El dueño de la casa verde toma café.
- El dueño que fuma Pall Mall cría pájaros.
- El dueño de la casa amarilla fuma Dunhill.
- El dueño que vive en la casa del centro bebe leche.
- El noruego vive en la primera casa.
- El dueño que fuma Blends vive al lado del que tiene gatos.
- El dueño que mantiene el caballo vive al lado del que fuma Dunhill.
- El dueño que fuma Bluemasters bebe cerveza.
- El alemán fuma Príncipe.
- El noruego vive al lado de la casa azul.
- El dueño que fuma Blends vive al lado del que bebe agua.
Con estos consejos puede llegar a una solución.
Tu tarea: crea un programa que resuelva este enigma por ti. La codificación dura de la solución no está permitida (duh)
Está permitido codificar las pistas en cualquier formato.
Formato de ejemplo:
//Hints in order
(Nationality:Brit)==(Color:Red)
(Nationality:Swede)==(Pet:Dogs)
(Nationality:Dane)==(Drink: Tea)
(Color:Green)/(Color:White)
(Color:Green)==(Drink:Coffee)
(Smoke:PallMall)==(Pet:Birds)
(Color:Yellow)==(Smoke:Dunhill)
(House:3)==(Drink:Milk)
(Nationality:Norwegian)==(House:1)
(Smoke:Blend)/\(Pet:Cats)
== significa igual a
/ significa en el lado izquierdo de
\ significa en el lado derecho de
/ \ significa izquierda o derecha de
Como dije, está permitido codificar pistas o tenerlas como entrada.
Salida: La salida debe estar en el siguiente formato (con los valores correctos, solo para los trolls;))
_____________ _____________ _____________ _____________ _____________
| Number | | Number | | Number | | Number | | Number |
| Nationality | | Nationality | | Nationality | | Nationality | | Nationality |
| Color | | Color | | Color | | Color | | Color |
| Drink | | Drink | | Drink | | Drink | | Drink |
| Smoke | | Smoke | | Smoke | | Smoke | | Smoke |
| Pet | | Pet | | Pet | | Pet | | Pet |
--------------- --------------- --------------- --------------- ---------------
The <Nationality> in the <Color> house owns the fish!
Usted puede cambiar los cuadros de arte Ascii, siempre que sean cuadros, sin importar qué símbolos use.
Cualquier conocimiento sobre este acertijo y solución no se puede utilizar en el programa. Debería usar lógica pura y deducción para resolver el enigma.
Etiquetó esto como un codegolf, pero podría ser un desafío de código, no estoy seguro. Cualquier idea sobre los criterios ganadores para un desafío de código no dude en compartir :)
Por ahora este es el código de golf, por lo que gana el programa con el bytecount más bajo.
Buena suerte y feliz codificación :)
Respuestas:
Prólogo - 954 Personajes
Salida
Llave:
fuente
Ruby 322 + entrada 442
Búsqueda de fuerza bruta de casi 25 mil millones de respuestas posibles.
Mi computadora tardaría unos 75 días en ejecutar este programa.
¡Nunca verifiqué si este programa imprime una respuesta correcta!
Correr como
ruby riddle.rb < riddle.in
riddle.rb (332 bytes)
riddle.in (442 bytes)
El archivo de entrada debe contener 5 líneas de nombres, seguidas de líneas de expresiones lógicas. Los números de las casas son del 0 al 4. Debe haber un
fish
.El programa llama
Array#permutation
cinco veces para encontrar todas las formas de ordenar los conjuntos de nacionalidades, colores, bebidas, humos y mascotas. El ciclo largo esc.product(*d){|a|...}
, llamandoArray#product
a repetir casi 25 mil millones de respuestas posibles. El cuerpo del bucle tiene la forma(f=eval ...)&&(...)
. Laeval ...
parte evalúa las expresiones lógicas. Si todo es cierto, entoncesf
es el número de casa del pez y la&&(...)
parte imprime la respuesta. La casa número 0 es verdadera en Ruby.¡El código golf significa no agregar código para la velocidad! ¡Pero me faltan 75 días para ejecutar el programa!
fuente
Prolog, 653 caracteres
fuente
Smalltalk 1332 caracteres
Usando Smalltalk simple:
Salida:
Como la versión de golf es casi ilegible, aquí está el código del desarrollador con nombres propios, sangría y espacios para facilitar la lectura:
Usando una biblioteca de resolución de restricciones:
Usar una biblioteca de resolución de restricciones, que es muy similar a la descrita en el manual de OZ / Mozart. Como espero que se queje de que esto no es válido para el concurso ;-), se agrega solo para su diversión e inspiración (busque un paquete de imprenta en su idioma), sin golf y sin contar caracteres.
Observe el operador "=:", que significa "unificar con". El solucionador utiliza un algoritmo de retroceso en el conjunto de restricciones definidas en el bloque del problema. El código restante imprime la solución en cuadros:
Salida:
Editar: ¡Vaya! Olvidé imprimir la línea "quién posee el pez" en la versión simple.
fuente
Ruby 1166 caracteres
Editar: actualizado para el formato de salida correcto
Se ejecuta consistentemente en menos de 0.2 segundos en un MBP i5.
Fuente: Ver en Github
Un trazador de líneas:
Acolchado con nuevas líneas para adaptarse a la página:
Salidas:
Código sin golf
Salidas:
El uso de
shuffle
en la configuración inicial garantiza rutas de solución únicas en todo momento. Puede ver esto por la cantidad de intentos que se modifican entre ejecuciones. Esto mitiga la necesidad de alimentar la entrada por separado, aunque alterar el código para hacerlo sería trivial.fuente