Devi scrivere un risolutore dell'impiccato. Testando contro questo elenco di parole inglesi [1] , il risolutore che risolve il maggior numero di parole vince, con il numero di ipotesi errate totali che è il tie-breaker. Tutte le parole nell'elenco delle parole verranno testate in ordine casuale.
[1]: questo elenco di parole viene preso da qui , quindi i numeri vengono rimossi, quindi le parole con lunghezza 1 o con caratteri non alfabetici vengono rimosse, quindi le 4096 parole uniche più frequenti vengono scelte come questo elenco di parole.
I dettagli:
Il tuo programma interagirà con il programma di gioco, che ti fornirà tramite stdin i caratteri di sottolineatura e le lettere correttamente indovinate. Il tuo programma fornirà a stdout le tue ipotesi e deve dedurre dall'input se la supposizione precedente fosse giusta o sbagliata. Dopo essersi sbagliato per 6 volte, il programma perde. Il programma deve essere pronto per la partita successiva al termine di ogni partita (dopo la vittoria o la perdita).
La lunghezza del codice deve essere strettamente inferiore a 2048 byte e il programma non deve utilizzare risorse esterne (incluso ma non limitato all'accesso all'elenco di parole nella memoria locale o da Internet).
Esempio : (l'input è preceduto da >
qui solo per chiarimenti - non è effettivamente presente nell'input)
>_______ // 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
Supponiamo che ti sbagli per 6 volte, riceverai un input finale che implica che la tua ipotesi sia sbagliata e il tuo programma deve essere pronto per iniziare un nuovo round (cioè prendere un altro input).
Se vinci,
>_angman
h
>hangman
>_____ // new round
Dopo aver saputo che hai vinto (perché l'input non ha sottolineature), devi essere pronto ad accettare il round successivo.
Il programma deve terminare quando riceve un input END
.
Se il tuo programma non è deterministico (dipende da casualità, pseudo casualità, tempo di sistema, temperatura ambiente, stato d'animo, ecc.), Devi dichiarare esplicitamente che nella tua presentazione, e il tuo punteggio sarà preso 10 volte (da me, se non diversamente indicato) e media.
Nota : se usi linguaggi come Python, cancella esplicitamente il tuo stdout dopo ogni istruzione di stampa.
Il programma di gioco è il seguente (credito a 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')
Uso: python ./game.py [yoursolverprogram]
Esempio: python ./game.py ruby ./solver.rb
Questo dovrebbe funzionare come il vecchio programma di calcolo del punteggio, ma non dipende dalle pipe nominate, quindi può funzionare su altre piattaforme. Fare riferimento alla cronologia delle revisioni se si è interessati a quello precedente.
subprocess
invece di un FIFO esterno per guidare il gioco? In questo modo il codice funzionerà per altri sistemi operativi (ad esempio, Cygwin su Windows). Ecco game.py
modificato per utilizzare subprocess
per avviare il programma denominato nella riga di comando: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Usalo come python game.py <program> [args]
, ad es python game.py python hangman.py
.