Вы должны написать решатель Hangman. Тестирование по этому списку английских слов [1] , решатель, который решает наибольшее количество слов, побеждает, с количеством полных неверных догадок. Все слова в списке слов будут проверены в случайном порядке.
[1]: Этот список слов берется отсюда , затем удаляются цифры, затем удаляются слова длиной 1 или не алфавитными символами, а в качестве этого списка слов выбираются наиболее часто встречающиеся 4096 уникальных слов.
Детали:
Ваша программа будет взаимодействовать с игровой программой, которая выдаст вам через подчеркивание и правильно угаданные буквы. Ваша программа выдаст ваши догадки, и на основании входных данных она определит, было ли предыдущее предположение правильным или неправильным. После того, как вы ошиблись 6 раз, ваша программа проигрывает. Ваша программа должна быть готова к следующей игре после окончания каждой игры (после победы или поражения).
Длина вашего кода должна быть строго меньше 2048 байт, и ваша программа не должна использовать какие-либо внешние ресурсы (включая, но не ограничиваясь, доступ к списку слов в локальном хранилище или из Интернета).
Пример : ( >здесь вводу предшествует только пояснение - на самом деле его нет на входе)
>_______ // 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
Предположим, что вы ошибаетесь 6 раз, вы получите окончательный результат, который подразумевает, что ваше предположение неверно, и ваша программа должна быть готова начать новый раунд (то есть сделать другой ввод).
Если вы выиграете,
>_angman
h
>hangman
>_____ // new round
Зная, что вы выиграли (потому что у ввода нет подчеркиваний), вы должны быть готовы принять следующий раунд.
Ваша программа должна завершиться, когда получит вход END.
Если ваша программа не является детерминированной (зависит от случайности, псевдослучайности, системного времени, температуры окружающей среды, моего настроения и т. Д.), Вы должны явно указать это в своем представлении, и ваш счет будет взят 10 раз (мной, если не указано иное) и в среднем.
Примечание : если вы используете такие языки, как python, пожалуйста, очищайте ваш стандартный вывод после каждого оператора печати.
Программа игры выглядит следующим образом (кредит 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')
Использование: python ./game.py [yoursolverprogram]
Пример: python ./game.py ruby ./solver.rb
Это должно работать как старая программа скоринга, но не зависит от именованных каналов, поэтому может работать на других платформах. Обратитесь к истории изменений, если вас интересует старая.
subprocessвместо внешнего fifo для управления игрой? Таким образом, код будет работать для других ОС (например, Cygwin в Windows). Вот что game.pyмодифицировано для subprocessзапуска программы, названной в командной строке: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Используйте это как python game.py <program> [args], например python game.py python hangman.py.