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 \n
caractere.
Depois de adivinhar, o programa recebe uma string em sua entrada padrão, também seguida por um único \n
caractere.
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?O
porque d
e s
está correta, e
está fora de lugar o
e z
nã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 O
mais vezes que o número de ocorrências da letra na palavra para adivinhar. Por exemplo, se a palavra a adivinhar for cozies
e o programa enviar tosses
, ela será recebida XOXXOO
porque existe apenas uma s
para 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 X
serão retornadas.
O programa player deve assumir que um arquivo nomeado wordlist.txt
e 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.txt
arquivos 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.txt
arquivo contendo todas as quatro palavras da letra e wordlist10.txt
todas 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.