O objetivo desse desafio é escrever um programa capaz de adivinhar uma palavra no menor número possível de tentativas. É baseado no conceito do programa de TV Lingo ( http://en.wikipedia.org/wiki/Lingo_(US_game_show) ).
Regras
Dado o tamanho de uma palavra passada como o primeiro argumento em sua linha de comando, o programa do jogador realiza cinco tentativas de adivinhar a palavra escrevendo uma suposição na saída padrão seguida por um único \ncaractere.
Depois de adivinhar, o programa recebe uma string em sua entrada padrão, também seguida por um único \ncaractere.
A cadeia tem o mesmo comprimento que a palavra a adivinhar e é composta por uma sequência dos seguintes caracteres:
X: o que significa que a letra fornecida não está presente na palavra para adivinhar?: o que significa que a letra fornecida está presente na palavra para adivinhar, mas em outro localO: o que significa que a letra neste local foi adivinhada corretamente
Por exemplo, se a palavra a adivinhar for dents, e o programa a enviar dozes, ela receberá OXX?Oporque de sestá correta, eestá fora de lugar oe znão está presente.
Tenha cuidado para que, se uma carta estiver presente mais vezes na tentativa de adivinhação do que na palavra para adivinhar, ela não será marcada como ?e Omais vezes que o número de ocorrências da letra na palavra para adivinhar. Por exemplo, se a palavra a adivinhar for coziese o programa enviar tosses, ela será recebida XOXXOOporque existe apenas uma spara localizar.
As palavras são escolhidas de uma lista de palavras em inglês. Se a palavra enviada pelo programa não for uma palavra válida do tamanho correto, a tentativa será considerada uma falha automática e somente Xserão retornadas.
O programa player deve assumir que um arquivo nomeado wordlist.txte contendo uma palavra por linha está presente no diretório de trabalho atual e pode ser lido conforme necessário.
As suposições devem ser compostas apenas por caracteres minúsculos alfabéticos ( [a-z]).
Nenhuma outra operação de rede ou arquivo é permitida para o programa.
O jogo termina quando uma sequência composta apenas Oé retornada ou depois que o programa fez 5 tentativas e não conseguiu adivinhar a palavra.
Pontuação
A pontuação de um jogo é dada pela fórmula dada:
score = 100 * (6 - number_of_attempts)
Portanto, se a palavra for adivinhada corretamente na primeira tentativa, são dados 500 pontos. A última tentativa vale 100 pontos.
Não adivinhar a palavra concede zero pontos.
O pit
Os programas dos jogadores serão avaliados tentando fazê-los adivinhar 100 palavras aleatórias para cada tamanho de palavra entre 4 e 13 caracteres, inclusive.
A seleção aleatória de palavras será feita com antecedência, para que todas as entradas tenham que adivinhar as mesmas palavras.
O programa vencedor e a resposta aceita serão os que alcançarem a pontuação mais alta.
Os programas serão executados em uma máquina virtual Ubuntu, usando o código em https://github.com/noirotm/lingo . As implementações em qualquer idioma são aceitas desde que sejam fornecidas instruções razoáveis para compilar e / ou executá-las.
Estou fornecendo algumas implementações de teste em ruby no repositório git, fique à vontade para se inspirar nelas.
Esta pergunta será atualizada periodicamente com as classificações das respostas publicadas, para que os desafiantes possam melhorar suas entradas.
A avaliação final oficial será realizada no dia 1º de julho .
Atualizar
Agora, as entradas podem assumir a presença de wordlistN.txtarquivos para acelerar a leitura da lista de palavras para o tamanho atual das palavras para N entre 4 e 13, inclusive.
Por exemplo, há um wordlist4.txtarquivo contendo todas as quatro palavras da letra e wordlist10.txttodas as dez palavras da letra, e assim por diante.
Resultados da primeira volta
Na data de 01/07/2014 - três entradas foram enviadas, com os seguintes resultados:
4 5 6 7 8 9 10 11 12 13 Total
./chinese-perl-goth.pl 8100 12400 15700 19100 22100 25800 27900 30600 31300 33600 226600
java Lingo 10600 14600 19500 22200 25500 28100 29000 31600 32700 33500 247300
./edc65 10900 15800 22300 24300 27200 29600 31300 33900 33400 33900 262600
** Rankings **
1: ./edc65 (262600)
2: java Lingo (247300)
3: ./chinese-perl-goth.pl (226600)
Todas as entradas tiveram desempenho consistente, com um vencedor claro, sendo a entrada em C ++ da @ edc65.
Todos os participantes são incríveis. Até agora, até agora não consegui derrotar @ chinese-perl-goth.
Se mais entradas forem enviadas, outra avaliação será realizada. As entradas atuais também podem ser aprimoradas se você sentir que pode fazer melhor.