Sie müssen einen Hangman-Löser schreiben. Bei der Prüfung anhand dieser englischen Wortliste [1] gewinnt der Löser, der die meisten Wörter löst, wobei die Anzahl der insgesamt falschen Vermutungen der entscheidende Faktor ist. Alle Wörter in der Wortliste werden in zufälliger Reihenfolge getestet.
[1]: Diese Wortliste stammt von hier , dann werden die Zahlen entfernt, dann werden Wörter mit der Länge 1 oder mit nicht alphabetischen Zeichen entfernt, und dann werden die häufigsten 4096 eindeutigen Wörter als diese Wortliste ausgewählt.
Die Details:
Ihr Programm interagiert mit dem Spielprogramm, das Sie durch die Unterstriche und richtig erratenen Buchstaben führt. Ihr Programm wird geben, um Ihre Vermutungen auszudrücken, und es muss aus der Eingabe abgeleitet werden, ob die vorherige Vermutung richtig oder falsch war. Nach 6 Fehlversuchen verliert Ihr Programm. Ihr Programm muss nach jedem Spielende (nach Gewinn oder Verlust) für das nächste Spiel bereit sein.
Ihre Codelänge muss streng unter 2048 Byte liegen, und Ihr Programm darf keine externen Ressourcen verwenden (einschließlich, aber nicht beschränkt auf den Zugriff auf die Wortliste im lokalen Speicher oder über das Internet).
Beispiel : (Die Eingabe wird >
hier nur zur Verdeutlichung vorangestellt - sie ist tatsächlich nicht in der Eingabe vorhanden.)
>_______ // 7 underscores
a // Now you wait for input again
>_a___a_
e
>_a___a_ // Implies that your guess is wrong
>_____ // new round, this will be given ONLY IF you already have 6 losses
Angenommen, Sie liegen sechsmal falsch, dann erhalten Sie eine letzte Eingabe, die impliziert, dass Ihre Vermutung falsch ist, und Ihr Programm muss bereit sein, eine neue Runde zu beginnen (dh eine weitere Eingabe vorzunehmen).
Wenn du gewinnst,
>_angman
h
>hangman
>_____ // new round
Nachdem Sie wissen, dass Sie gewonnen haben (da die Eingabe keine Unterstriche enthält), müssen Sie bereit sein, die nächste Runde anzunehmen.
Ihr Programm muss beendet werden, wenn es eine Eingabe erhält END
.
Wenn Ihr Programm nicht deterministisch ist (abhängig von Zufälligkeit, Pseudozufälligkeit, Systemzeit, Umgebungstemperatur, meiner Stimmung usw.), müssen Sie dies in Ihrer Einreichung ausdrücklich angeben, und Ihre Punktzahl wird zehnmal (von mir, sofern nicht anders angegeben) vergeben. und gemittelt.
Hinweis : Wenn Sie Sprachen wie Python verwenden, müssen Sie Ihre stdout nach jeder print-Anweisung explizit löschen.
Das Spielprogramm sieht wie folgt aus ( Dank an Nneonneo ):
import sys, random, subprocess
proc = subprocess.Popen(sys.argv[1:], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def p(x):
proc.stdin.write(x+'\n')
proc.stdin.flush()
wordlist=[]
f=open('wordlist.txt', 'r')
for i in f:
wordlist.append(i[:-1] if i[-1]=='\n' else i)
# wordlist=[i[:-1] for i in f]
random.shuffle(wordlist)
score=0
totalerr=0
for s in wordlist:
s2=[]
for i in s:
s2.append('_')
err=0
p(''.join(s2))
while err<6 and '_' in s2:
c=proc.stdout.readline().strip()
nomatch=True
for i in range(0, len(s)):
if s[i]==c:
s2[i]=c
nomatch=False
if nomatch:
err+=1
totalerr+=1
p(''.join(s2))
if err<6:
score+=1
p('END')
sys.stderr.write('score is '+str(score)+', totalerr is '+str(totalerr)+'\n')
Verwendung: python ./game.py [yoursolverprogram]
Beispiel: python ./game.py ruby ./solver.rb
Dies sollte wie das alte Scoring-Programm funktionieren, ist jedoch nicht von Named Pipes abhängig, sodass es auch auf anderen Plattformen funktioniert. Lesen Sie den Revisionsverlauf, wenn Sie an der alten interessiert sind.
subprocess
anstelle eines externen Fifo das Spiel zu steuern? Auf diese Weise funktioniert der Code auch für andere Betriebssysteme (z. B. Cygwin unter Windows). Hier wurde eine game.py
Änderung vorgenommen, subprocess
um das in der Befehlszeile angegebene Programm zu starten: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Verwenden Sie es als python game.py <program> [args]
zB python game.py python hangman.py
.