Vous devez écrire un solveur du pendu. En testant cette liste de mots anglais [1] , le solveur qui résout le plus grand nombre de mots gagne, le nombre total de suppositions incorrectes étant le bris d'égalité. Tous les mots de la liste de mots seront testés dans un ordre aléatoire.
[1]: Cette liste de mots est extraite d' ici , puis les nombres sont supprimés, puis les mots de longueur 1 ou avec des caractères non alphabétiques sont supprimés, puis les 4096 mots uniques les plus fréquents sont choisis comme cette liste de mots.
Les détails:
Votre programme interagira avec le programme de jeu, qui vous donnera à travers stdin les caractères de soulignement et les lettres correctement devinées. Votre programme vous donnera une idée de vos suppositions, et il doit déduire de l'entrée si la supposition précédente était bonne ou mauvaise. Après s'être trompé 6 fois, votre programme perd. Votre programme doit être prêt pour le prochain match après la fin de chaque match (après une victoire ou une perte).
La longueur de votre code doit être strictement inférieure à 2048 octets et votre programme ne doit utiliser aucune ressource externe (y compris, mais sans s'y limiter, l'accès à la liste de mots sur le stockage local ou à partir d'Internet).
Exemple : (L'entrée est précédée >
ici uniquement à des fins de clarification - elle n'est pas réellement présente dans l'entrée)
>_______ // 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
Supposons que vous vous trompiez 6 fois, vous recevrez une entrée finale qui implique que votre supposition est fausse, et votre programme doit être prêt à commencer un nouveau cycle (c'est-à-dire prendre une autre entrée).
Si tu gagnes,
>_angman
h
>hangman
>_____ // new round
Après avoir su que vous avez gagné (parce que l'entrée n'a pas de soulignement), vous devez être prêt à accepter le tour suivant.
Votre programme doit se terminer lorsqu'il reçoit une entrée END
.
Si votre programme n'est pas déterministe (dépend de l'aléatoire, de la pseudo-aléatoire, de l'heure du système, de la température ambiante, de mon humeur, etc.), vous devez déclarer explicitement que dans votre soumission, et votre score sera pris 10 fois (par moi, sauf instruction contraire) et moyenne.
Remarque : si vous utilisez des langages comme python, veuillez vider explicitement votre stdout après chaque instruction print.
Le programme du jeu est le suivant (crédit à 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')
Usage: python ./game.py [yoursolverprogram]
Exemple: python ./game.py ruby ./solver.rb
Cela devrait fonctionner comme l'ancien programme de notation, mais ne dépend pas des canaux nommés, il peut donc fonctionner sur d'autres plates-formes. Reportez-vous à l'historique des révisions si vous êtes intéressé par l'ancien.
subprocess
au lieu d'une fifo externe pour piloter le jeu? De cette façon, le code fonctionnera pour d'autres systèmes d'exploitation (par exemple, Cygwin sous Windows). Voici une game.py
modification à utiliser subprocess
pour démarrer le programme nommé sur la ligne de commande: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Utilisez-le comme python game.py <program> [args]
, par exemple python game.py python hangman.py
.