Votre objectif est d'écrire un programme qui résoudra tout puzzle Mastermind en 6 mouvements ou moins.
Contexte
Mastermind est un jeu de société. Le but du jeu est de deviner exactement la combinaison (couleurs et ordre) de 4 chevilles colorées cachées par l'autre joueur. Quand une supposition est faite, l'autre joueur répond entre 0 et 4 chevilles blanches et ou rouges. Une cheville rouge est l'endroit où la couleur et l'emplacement sont corrects. Une cheville blanche est l'endroit où la couleur est représentée dans les pièces restantes, mais est au mauvais endroit. S'il y a des couleurs en double dans la supposition, il n'y aura qu'une seule cheville attribuée par couleur correspondante dans le secret. (Donc - si le secret contenait 1 bleu et que la supposition avait 2 bleus avec un au bon endroit, il y aurait une cheville rouge donnée). Il existe 6 couleurs différentes et des doublons peuvent être utilisés.
Ainsi, par exemple, un jeu peut se dérouler comme suit: (en supposant que la solution est Rouge Vert Vert Bleu)
1: Blue Purple Black Green - 2 white pegs
2: Green Red Black Blue - 2 white pegs, 1 red peg
3: Green Green Green Blue - 3 red pegs
4: Red Green Green Blue - 4 red pegs
Les règles sont développées sur Wikipedia
Exigences
- Le programme doit lire depuis stdin et écrire dans stdout
- J'utiliserai des chiffres pour plus de simplicité au lieu de couleurs. La combinaison à deviner sera 4 nombres entre 1 et 6
Ils doivent produire leurs suppositions sous la forme d'une série de 4 nombres séparés par des espaces de 1 à 6 se terminant par une nouvelle ligne. Par exemple:
1 5 2 2 \ n
Le programme recevra ensuite en entrée après sa supposition 2 entiers compris entre 0 et 4 séparés par un espace et se terminant par une nouvelle ligne. Le premier sera la quantité de chevilles blanches, le second la quantité de chevilles rouges.
- Sur une entrée de "0 4" (4 piquets rouges), le programme doit se terminer
- Le programme doit être capable de résoudre n'importe quel casse-tête en moins de 6 tours (votre programme donnant une sortie, suivi de l'entrée de réponse est de 1 tour). Il n'y a pas de bonus (en raison de la complexité de la preuve) pour pouvoir le résoudre en moins.
- La solution doit être complètement interne et incluse dans la source. Seules les bibliothèques standard sont autorisées. La solution ne peut donc pas s'appuyer sur d'autres fichiers (tels que des dictionnaires) ou sur Internet.
Exemple d'entrée / sortie
> is your programs output
< is the responding input
Solution is 1 5 6 6
> 1 2 3 4
< 0 1
> 4 1 6 6
< 1 2
> 1 6 5 6
< 2 2
> 1 5 6 6
< 0 4
Notation
- Il s'agit de Code Golf pur et simple . La solution la plus courte en octets gagne.
Ceci est ma première question sur Code Golf. Je m'excuse si j'ai fait quelque chose de mal, mais j'ai essayé au mieux de faire en sorte qu'il n'y ait absolument aucune ambiguïté et d'empêcher autant de règles que possible d'avocat. Si j'ai été ambigu ou peu clair, n'hésitez pas à poser des questions.
1 2 3 4
revenir0 1
?Réponses:
Python 2Python 3,359 365338 caractèresDrôle, il m'a fallu de nombreuses modifications pour réaliser que j'avais un nom de variable à cinq caractères.
Je n'aime pas les longues importations. J'ai l'impression que je devrais être en mesure d'implémenter un remplacement
collections.Counter
qui sauverait l'importation.Je n'aime pas non plus
print(*(m.pop()))
la fin. J'ai l'impression qu'il devrait disparaître dans la boucle while, mais je ne peux pas trouver un moyen de le faire sans l'allonger.la source
TypeError: join() takes exactly one argument (2 given)
lereturn j(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)
. aussi, sum () renvoie un int, tandis que j (str.join) devrait prendre un itérableprint
, et je pense qu'elle est légèrement plus courte. Il correspond également mieux au comportement demandé (arrêt sur "4 0" plutôt que lorsque vous connaissez la réponse). Etlen(m)>1
==m[1:]
. L'importation est en effet ennuyeux -from a,b import *
aurait été agréable.4 0
, ce qui est dans les critères objectifs, et d'autres fois, il sortira avec une exception:print(*(m.pop())) KeyError: 'pop from an empty set'
4 0
c'est quatre chevilles blanches. Je pense que le score est inversé.Haskell,
317304J'adore écrire des programmes interactifs purement fonctionnels! Mais bien sûr, ce style a certaines limites: il se termine maintenant avec une erreur, mais vous n'avez pas spécifié que ce n'est pas correct. J'aurais besoin de refactoriser le tout dans la
IO
monade pour obtenir une sortie sans erreur.la source
Python,
385357 caractères, résout en 5 mouvementsPlus je le change, il grandit de plus en plus comme celui de Steven Rumbalski ... La principale différence est qu'il travaille avec des cordes plutôt qu'avec des entiers.
Implémentation de l'algorithme de Knuth (correctement maintenant, j'espère).
A emprunté la fonction de notation à Steven Rumbalski.
Cela prend beaucoup de temps pour générer la première supposition, s'améliore plus tard.
Le codage en dur it (
g=len(A)==1296 and [1,1,2,2] or ...
) facilite la vie si vous voulez le tester.Je ne compte pas 4 nouvelles lignes + tabulations, qui peuvent être remplacées par des points-virgules.
la source
"%d "*4%tuple(g)
from collections import*
a,b=map(int,raw_input())
product(*[range(1,7)]*4)
Counter(r(x,i)for i in A).values()