Musisz napisać solver Hangman. Testując tę listę angielskich słów [1] , wygrywa solver, który rozwiązuje największą liczbę słów, przy czym liczba niepoprawnych zgadnięć jest rozstrzygająca. Wszystkie słowa na liście słów zostaną przetestowane w losowej kolejności.
[1]: Ta lista słów jest pobierana stąd , a następnie usuwane są liczby, następnie usuwane są słowa o długości 1 lub ze znakami niealfabetycznymi, a następnie jako tę listę słów wybiera się najczęściej 4096 niepowtarzalnych słów.
Szczegóły:
Twój program wejdzie w interakcję z programem do gry, który przekaże ci standardowe podkreślenia i poprawnie odgadnięte litery. Twój program da ci standardowe domysły i na podstawie danych wejściowych musi wywnioskować, czy poprzednie domniemanie było prawidłowe, czy złe. Po 6 razy pomyłce twój program przegrywa. Twój program musi być gotowy do następnej gry po zakończeniu każdej gry (po wygranej lub przegranej).
Długość kodu musi być mniejsza niż 2048 bajtów, a program nie może używać żadnych zasobów zewnętrznych (w tym między innymi dostępu do listy słów w lokalnej pamięci masowej lub przez Internet).
Przykład : (Dane wejściowe poprzedza się >tutaj wyłącznie w celu wyjaśnienia - nie są one faktycznie obecne w danych wejściowych)
>_______ // 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
Załóżmy, że jesteś w błędzie przez 6 razy, otrzymasz końcowy wkład, który sugeruje, że twoje domysły są błędne, a twój program musi być gotowy do rozpoczęcia nowej rundy (tj. Weź inny wkład).
Jeśli wygrasz,
>_angman
h
>hangman
>_____ // new round
Po dowiedzeniu się, że wygrałeś (ponieważ wkład nie ma podkreślników), musisz być gotowy na przyjęcie następnej rundy.
Twój program musi zakończyć się, gdy otrzyma dane wejściowe END.
Jeśli twój program nie jest deterministyczny (zależy od losowości, pseudolosowości, czasu systemowego, temperatury otoczenia, mojego nastroju itp.), Musisz wyraźnie to zaznaczyć w swoim zgłoszeniu, a twój wynik zostanie pobrany 10 razy (przeze mnie, chyba że zalecono inaczej) i uśrednione.
Uwaga : jeśli używasz języków takich jak python, po każdym poleceniu wydruku wyraźnie wypróżnij swoje standardowe wyjście.
Program gry jest następujący ( przypis do 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')
Stosowanie: python ./game.py [yoursolverprogram]
Przykład: python ./game.py ruby ./solver.rb
Powinno to działać jak stary program oceniania, ale nie zależy od nazwanych potoków, więc może działać na innych platformach. Jeśli interesuje Cię stara wersja, zapoznaj się z historią wersji.
subprocessz zewnętrznego fifo do prowadzenia gry? W ten sposób kod będzie działał dla innych systemów operacyjnych (na przykład Cygwin w systemie Windows). Oto game.pyzmodyfikowano, aby użyć subprocessdo uruchomienia programu o nazwie podanej w wierszu polecenia: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Użyj go jako python game.py <program> [args]np python game.py python hangman.py.