Вы должны написать решатель 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
.