Вам потрібно написати розв'язувач 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, будь-ласка, явно протріть ваш stdout після кожного твердження про друк.
Ігрова програма така (зарахування 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
гру замість зовнішньої фіфо ? Таким чином код буде працювати для інших ОС (наприклад, Cygwin в Windows). Тут game.py
модифіковано для subprocess
запуску програми, названої в командному рядку: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Використовуйте його як python game.py <program> [args]
, наприклад python game.py python hangman.py
.