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.
subprocess
z 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.py
zmodyfikowano, aby użyć subprocess
do 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
.