Einstein a écrit une énigme. Il a dit que 98% du monde ne pouvait pas le résoudre.
J'ai résolu cette énigme en environ 25 minutes dans le train pour travailler. C'est simplement une déduction.
L'énigme
Il y a 5 maisons de 5 couleurs différentes d'affilée.
Dans chaque maison vit une personne de nationalité différente.
Les 5 propriétaires boivent un certain type de boisson, fument une certaine marque de cigare et gardent un certain animal de compagnie.
Aucun propriétaire n'a le même animal de compagnie, ne fume la même marque de cigare ou ne boit la même boisson.
Question: à qui appartient le poisson?
Pour résoudre cette énigme, Einstein fournit 15 conseils:
- Le Britannique habite dans la maison rouge.
- Le Suédois garde les chiens comme animaux de compagnie.
- Le Danois boit du thé.
- La maison verte se trouve immédiatement à gauche de la maison blanche.
- Le propriétaire de la maison verte boit du café.
- Le propriétaire qui fume Pall Mall élève des oiseaux.
- Le propriétaire de la maison jaune fume Dunhill.
- Le propriétaire vivant dans la maison centrale boit du lait.
- Le Norvégien vit dans la première maison.
- Le propriétaire qui fume Blends vit à côté de celui qui garde les chats.
- Le propriétaire qui garde le cheval vit à côté de celui qui fume Dunhill.
- Le propriétaire qui fume des Bluemasters boit de la bière.
- L'Allemand fume Prince.
- Le Norvégien habite à côté de la maison bleue.
- Le propriétaire qui fume Blends vit à côté de celui qui boit de l'eau.
Avec ces conseils, vous pouvez trouver une solution.
Votre tâche: créer un programme qui résoudra cette énigme pour vous. Codage en dur la solution n'est pas autorisée (duh)
Il est autorisé de coder en dur les indices dans n'importe quel format.
Exemple de format:
//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)
== signifie égal à
/ signifie à gauche de
\ signifie à droite de
/ \ signifie à gauche ou à droite de
Comme je l'ai dit, il est possible soit de coder en dur, soit de les avoir en entrée.
Sortie: La sortie doit être au format suivant (avec les valeurs correctes, juste pour les 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!
Les boîtes d'art Ascii peuvent être modifiées par vous, tant qu'elles sont des boîtes, peu importe les symboles que vous utilisez.
Aucune connaissance de cette énigme et de cette solution ne peut être utilisée dans le programme. Il devrait utiliser la logique pure et la déduction pour résoudre l'énigme.
Taggé comme un codegolf mais pourrait être un défi de code, je ne sais pas. N'hésitez pas à partager vos réflexions sur les critères de réussite pour un défi de code :)
Pour l'instant, il s'agit de code-golf, donc le programme avec le plus petit nombre de victoires gagne.
Bonne chance et bon codage :)
Réponses:
Prolog - 954 caractères
Production
Clé:
la source
Ruby 322 + entrée 442
Recherche brutale de près de 25 milliards de réponses possibles.
Mon ordinateur mettrait environ 75 jours pour exécuter ce programme.
Je n'ai jamais vérifié si ce programme imprime une réponse correcte!
Courir comme
ruby riddle.rb < riddle.in
riddle.rb (332 octets)
riddle.in (442 octets)
Le fichier d'entrée doit contenir 5 lignes de noms, suivies de lignes d'expressions logiques. Les numéros de maison sont de 0 à 4. Il doit y avoir un
fish
.Le programme appelle
Array#permutation
cinq fois pour trouver toutes les façons de commander les tableaux de nationalités, de couleurs, de boissons, de fumée et d'animaux de compagnie. La longue boucle estc.product(*d){|a|...}
, appelantArray#product
à itérer près de 25 milliards de réponses possibles. Le corps de boucle a la forme(f=eval ...)&&(...)
. Laeval ...
partie évalue les expressions logiques. Si tout est vrai, alorsf
c'est le numéro de la maison du poisson et la&&(...)
partie imprime la réponse. La maison numéro 0 est vraie à Ruby.Le golf de code signifie ne pas ajouter de code pour la vitesse! Mais il me manque 75 jours pour exécuter le programme!
la source
Prolog, 653 caractères
la source
Smalltalk 1332 caractères
Utilisation de Smalltalk simple:
Production:
Comme la version golfée est presque illisible, voici le code du développeur avec les noms propres, l'indentation et les espaces de lisibilité:
Utilisation d'une bibliothèque de solveurs de contraintes:
Utilisation d'une bibliothèque de solveurs de contraintes, très similaire à celle décrite dans le manuel OZ / Mozart. Comme je m'attends à ce que vous vous plaigniez que cela n'est pas valable pour le concours ;-), il est ajouté uniquement pour votre amusement et votre inspiration (recherchez un package de contrefaçon dans votre langue), non golfé et sans compter les caractères.
Remarquez l'opérateur "=:", qui signifie "unifier avec". Le solveur utilise un algorithme de retour arrière sur l'ensemble des contraintes définies dans le bloc problème. Le code restant imprime la solution dans des boîtes:
Production:
Edit: oups - j'ai oublié d'imprimer la ligne "à qui appartient le poisson" dans la version ordinaire.
la source
Ruby 1166 caractères
Modifier: mis à jour pour un format de sortie correct
Fonctionne régulièrement en moins de 0,2 seconde sur un MBP i5.
Source: Vue sur Github
Bon mot:
Rembourré de nouvelles lignes pour s'adapter à la page:
Les sorties:
Code non golfé
Les sorties:
L'utilisation de
shuffle
dans la configuration initiale garantit à chaque fois des chemins de solution uniques. Vous pouvez le voir par le nombre de tentatives de modification entre les exécutions. Cela atténue le besoin d'alimenter l'entrée séparément, bien que la modification du code pour ce faire serait triviale.la source