Você precisa escrever um solucionador de forca. Testando contra esta lista de palavras em inglês [1] , vence o solucionador que resolve o maior número de palavras, com o número total de palpites incorretos sendo o desempate. Todas as palavras da lista de palavras serão testadas em ordem aleatória.
[1]: esta lista de palavras é retirada daqui , os números são removidos, as palavras com comprimento 1 ou com caracteres não alfabéticos são removidas e as 4096 palavras únicas mais frequentes são escolhidas como esta lista de palavras.
Os detalhes:
Seu programa irá interagir com o programa do jogo, que fornecerá a você os caracteres sublinhados e as letras adivinhadas corretamente. Seu programa dará a entender seus palpites e deve inferir a partir da entrada se o palpite anterior estava certo ou errado. Depois de estar errado por 6 vezes, seu programa perde. Seu programa deve estar pronto para o próximo jogo após o término de cada jogo (após vitória ou derrota).
O tamanho do seu código deve ser estritamente menor que 2048 bytes, e seu programa não deve usar recursos externos (incluindo, entre outros, o acesso à lista de palavras no armazenamento local ou na Internet).
Exemplo : (a entrada é precedida por >
aqui apenas para esclarecimento - ela não está realmente presente na entrada)
>_______ // 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
Suponha que você esteja errado por 6 vezes, você receberá uma entrada final, o que implica que seu palpite está errado, e seu programa deve estar pronto para iniciar uma nova rodada (por exemplo, faça outra entrada).
Se você ganhar,
>_angman
h
>hangman
>_____ // new round
Depois de saber que você ganhou (porque a entrada não possui sublinhados), você deve estar pronto para aceitar a próxima rodada.
Seu programa deve terminar quando receber uma entrada END
.
Se o seu programa não for determinístico (depende de aleatoriedade, pseudo-aleatoriedade, hora do sistema, temperatura ambiente, meu humor etc.), você deve declarar explicitamente isso na sua inscrição e sua pontuação será obtida 10 vezes (por mim, a menos que seja instruído de outra forma) e média.
Nota : se você usa idiomas como python, libere explicitamente seu stdout após cada declaração de impressão.
O programa do jogo é o seguinte (crédito para 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')
Uso: python ./game.py [yoursolverprogram]
Exemplo: python ./game.py ruby ./solver.rb
Isso deve funcionar como o antigo programa de pontuação, mas não depende de pipes nomeados, para que possa funcionar em outras plataformas. Consulte o histórico de revisões se você estiver interessado no antigo.
subprocess
de um fifo externo para dirigir o jogo? Dessa forma, o código funcionará para outros sistemas operacionais (por exemplo, Cygwin no Windows). Aqui está game.py
modificado para usar subprocess
para iniciar o programa nomeado na linha de comando: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Use-o como python game.py <program> [args]
, por exemplo python game.py python hangman.py
.