Ihr Ziel ist es, ein Programm zu schreiben, das jedes Mastermind-Puzzle in 6 oder weniger Zügen löst.
Hintergrund
Mastermind ist ein Brettspiel. Das Ziel des Spiels ist es, die Kombination (Farben und Reihenfolge) von 4 farbigen Stiften, die der andere Spieler verbirgt, genau zu erraten. Wenn eine Vermutung vorliegt, antwortet der andere Spieler mit 0 bis 4 weißen und / oder roten Stiften. Bei einem roten Stift stimmen Farbe und Position. Bei einem weißen Stift ist die Farbe in den übrigen Stücken dargestellt, befindet sich jedoch an der falschen Stelle. Wenn die Vermutung doppelte Farben enthält, wird im Geheimnis nur ein Stift pro entsprechender Farbe vergeben. (Also - wenn das Geheimnis 1 Blau enthielte und die Vermutung 2 Blues mit einem an der richtigen Stelle hatte, würde ein roter Stift gegeben werden). Es gibt 6 verschiedene Farben und Duplikate können verwendet werden.
So könnte ein Spiel beispielsweise wie folgt ablaufen: (Angenommen, die Lösung lautet Rot Grün Grün Blau.)
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
Die Regeln werden auf Wikipedia erweitert
Bedarf
- Das Programm muss von stdin lesen und nach stdout schreiben
- Ich werde der Einfachheit halber Zahlen anstelle von Farben verwenden. Die zu erratende Kombination besteht aus 4 Zahlen zwischen 1 und 6
Sie müssen ihre Vermutungen als eine Reihe von 4 durch Leerzeichen getrennten Zahlen von 1 bis 6 ausgeben, die mit einem Zeilenumbruch abschließen. Zum Beispiel:
1 5 2 2 \ n
Das Programm erhält anschließend als Eingabe 2 ganze Zahlen zwischen 0 und 4, die durch ein Leerzeichen getrennt sind und mit einer neuen Zeile abschließen. Das erste ist die Anzahl der weißen Stifte, das zweite die Anzahl der roten Stifte.
- Bei einer Eingabe von "0 4" (4 rote Stifte) muss das Programm beendet werden
- Das Programm muss in der Lage sein, jedes Rätsel in weniger als 6 Runden zu lösen (Ihr Programm gibt eine Ausgabe aus, gefolgt von einer Antworteingabe von 1 Runde). Es gibt keinen Bonus (aufgrund der Komplexität der Beweise), wenn Sie es in weniger lösen können.
- Die Lösung muss vollständig intern sein und in der Quelle enthalten sein. Es sind nur Standardbibliotheken zulässig. Die Lösung ist daher möglicherweise nicht auf andere Dateien (z. B. Wörterbücher) oder das Internet angewiesen.
Beispiel Eingabe / Ausgabe
> 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
Wertung
- Das ist schlicht und einfach Code Golf . Die kürzeste Lösung in Bytes gewinnt.
Dies ist meine erste Code Golf Frage. Ich entschuldige mich, wenn ich etwas falsch gemacht habe, aber ich habe versucht, so gut wie möglich sicherzustellen, dass es absolut keine Unklarheiten gibt, und verhindert, dass so viele Regeln wie möglich erlassen werden. Wenn ich mehrdeutig oder unklar war, können Sie gerne Fragen stellen.
1 2 3 4
zurückkehren0 1
?Antworten:
Python 2Python 3,359 365338 ZeichenWitzigerweise habe ich viele Änderungen vorgenommen, um festzustellen, dass ich einen fünfstelligen Variablennamen hatte.
Ich mag die langen Importe nicht. Es fühlt sich an, als ob ich in der Lage sein sollte, einen Ersatz zu implementieren
collections.Counter
, der den Import erspart.Das gefällt mir auch
print(*(m.pop()))
am Ende nicht. Es fühlt sich an, als sollte es in der while-Schleife verschwinden, aber ich kann keinen Weg finden, es zu tun, ohne es länger zu machen.quelle
TypeError: join() takes exactly one argument (2 given)
aufreturn j(sum(min(g.count(c),k.count(c))for c in set(g))-b,b)
. Außerdem gibt sum () ein int zurück, während j (str.join) einen iterablen Wert annehmen sollteprint
und ich denke, es ist etwas kürzer. Es stimmt auch besser mit dem angeforderten Verhalten überein (Anhalten bei "4 0", anstatt wenn Sie die Antwort kennen). Undlen(m)>1
==m[1:]
. Import ist ja nervig -from a,b import *
wäre schön gewesen.4 0
, was in den objektiven Kriterien ist, und ein anderes Mal wird es mit einer Ausnahme beendet:print(*(m.pop())) KeyError: 'pop from an empty set'
4 0
ist vier weiße Stifte. Ich denke, Sie haben die Wertung umgekehrt.Haskell,
317304Ich liebe es, rein funktionale interaktive Programme zu schreiben! Dieser Stil hat natürlich einige Einschränkungen: Er wird jetzt mit einem Fehler beendet, aber Sie haben nicht angegeben, dass dies nicht in Ordnung ist. Ich müsste das Ganze in die
IO
Monade umgestalten , um einen fehlerfreien Ausgang zu erhalten.quelle
Python,
385357 Zeichen, löst in 5 ZügenJe mehr ich es ändere, desto mehr ähnelt es Steven Rumbalski ... Der Hauptunterschied besteht darin, dass er eher mit Zeichenfolgen als mit ganzen Zahlen arbeitet.
Knuths Algorithmus implementiert (hoffe ich jetzt richtig).
Leihte die Scoring-Funktion von Steven Rumbalski.
Es dauert lange, bis die erste Vermutung erstellt ist, und wird später besser.
Die Hardcodierung von it (
g=len(A)==1296 and [1,1,2,2] or ...
) erleichtert das Leben, wenn Sie es testen möchten.Ich zähle nicht 4 Zeilenumbrüche + Tabulatorpaare, die durch Semikolons ersetzt werden können.
quelle
"%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()