您需要编写一个Hangman解算器。根据该英语单词列表[1]进行测试,解决最多单词数量的求解器获胜,而总不正确猜想的数量成为决胜局。单词列表中的所有单词将以随机顺序进行测试。
[1]:从此处获取此单词列表,然后删除数字,然后删除长度为1或带有非字母字符的单词,然后选择最常见的4096个唯一单词作为此单词列表。
细节:
您的程序将与游戏程序进行交互,该程序将通过stdin为您提供下划线和正确猜出的字母。您的程序将给出您的猜测的标准,并且必须从输入中推断先前的猜测是对还是错。错误6次后,您的程序将丢失。每个游戏结束后(输赢之后),您的程序必须为下一个游戏做好准备。
您的代码长度必须严格小于2048个字节,并且程序不得使用任何外部资源(包括但不限于访问本地存储或Internet上的单词表)。
示例:(输入之前>
仅在此处进行澄清-输入中实际上不存在该输入)
>_______ // 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之类的语言,请在每个print语句后显式刷新标准输出。
游戏程序如下(记入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来驱动游戏吗?这样,代码将可用于其他操作系统(例如,Windows上的Cygwin)。这里的game.py
修改,以使用subprocess
来启动名为在命令行程序:gist.github.com/nneonneo/d173f8888e1ea0c6fe37。使用它python game.py <program> [args]
,例如python game.py python hangman.py
。