De acordo com esta página , a melhor estratégia para adivinhar as palavras do carrasco em inglês é calcular as chances de cada letra em uma lista de palavras que atenda às nossas condições. Mas, como sou muito preguiçosa, não quero calcular todas as palavras do dicionário sozinha. Mas, como sei que você está sempre aqui para me ajudar, tenho certeza de que será capaz de me tornar um rei de um código que fará isso por mim. E, como meu disco rígido está quase cheio, eu gostaria do menor código possível. Isso significa que este é um código-golfe, e a submissão com a menor quantidade de bytes vencerá, mas também a mais precisa! .
Entrada / Saída
Uma palavra aleatória dessa lista de palavras será usada.
Seu programa deve aceitar, em argumentos ou por entrada do usuário (pop-ups, stdin, qualquer que seja),
- Comprimento da palavra
- Carta incorreta já encontrada, ou 0, se acabamos de iniciar o jogo, e você não forneceu nenhuma carta incorreta.
- Letras já encontradas E sua posição na palavra
Exemplo: ./hangsolver 6 XBZ 1P 4P 2E 6E
Aqui, eu escolhi a palavra "pessoas". Para maior clareza: PE _ P _ E (Letras incorretas são XB e Z)
Isso significa que, em um jogo, terei que lançar seu script várias vezes!
A saída será uma única letra, sua próxima tentativa.
Regras
- Aquele que adivinhar 10 palavras em menos tentativas do que os outros vencerá.
- Em caso de empate, o código mais curto em bytes vence.
- Se ainda houver um empate, o programa mais rápido vencerá.
- Você pode assumir que só existem estas palavras no idioma inglês
- Vou tentar apenas palavras válidas da lista de palavras.
- Eu tenho um bom computador, a energia da CPU não será um problema (mas tente responder o mais rápido possível!)
- Você não pode resolver com um solucionador on-line, mas pode fazer o download da lista de palavras ou passar como argumento. Você pode assumir que ele será nomeado "wordlist.txt" e no mesmo diretório do seu script.
- Seu código deve ser capaz de executar em um sistema operacional comum. Pode ser windows, mac ou ubuntu / debian / CentOS ou Redhat.
- Você não pode usar um solucionador externo.
- No entanto, você pode encurtar o URL para a lista de palavras.
- Este código-golfe terminará no dia primeiro de setembro.
- Você DEVE usar o método descrito acima.
Boa sorte !
Lista de palavras encontrada aqui no SE.
fonte
Respostas:
PowerShell,
248246241 bytesUngolfed
Bem, o máximo que pude sem alterar a maneira como funciona:
Demolir
A abordagem adotada aqui foi primeiro gerar uma expressão regular para obter as possíveis palavras da lista de palavras. Como sei o tamanho da palavra e as letras que não funcionaram, posso fazer uma expressão regular com bastante facilidade.
Portanto, no exemplo PEOPLE, 6 letras com XBZ não fazendo parte da palavra, gostaria de gerar
^PE[^XBZ]P[^XBZ]E$
.Estou explorando o fato de que
Get-Content
(gc
) retorna uma matriz de linhas, e o-match
operador, quando usado com uma matriz do lado esquerdo, retorna uma matriz de correspondências em vez de um bool, para que eu possa obter rapidamente uma lista de apenas palavras que são candidatos, uma vez que eu tenho o regex.Para gerar o regex, começo com uma matriz (
$e
) da classe de caracteres correspondentes negativos com$c
elementos ($c
sendo o número de letras na palavra). Iterando os números de 1 a 1$c
, procuro uma letra correspondente nessa posição e, se ela existir, substituo o elemento$e
por essa letra.Depois de percorrer todas as posições, a matriz final é
-join
editada (com uma string vazia) e temos nosso regex.Então agora eu tenho uma variedade de todas as palavras possíveis. Uma rápida
-join
sequência vazia com isso me dá uma grande sequência concatenada de todas as palavras, a que eu divido\B
(não é um limite de palavras, se eu dividir em uma sequência vazia, receberei 2 elementos em branco extras), então agora tenho uma matriz de todas as letras em todas as palavras possíveis.Tubar isso para dentro
Where-Object
permite filtrar as letras que já foram correspondidas. Esta parte foi uma verdadeira dor. Ele teve que lidar com a lista de letras correspondentes (que incluem a posição) sendo 1 elemento, mais de 1 elemento ou 0 elementos, forçando$b
primeiro uma matriz para-match
poder operar com todas elas, mas que (infelizmente neste caso ) retorna uma matriz, então temos que verificar.Count
. Usar!(thing).Count
é um pouco menor que usar(thing).Count-gt0
.Seguindo em frente, agora temos um conjunto de todos os caracteres únicos (como
string
s e nãochar
) de todas as palavras possíveis, menos as letras que já foram adivinhadas corretamente.A inserção de um canal
Group-Object
me dá um objeto com as contagens de cada letra; portanto, um rápidoSort-Object count
acesso facilita a obtenção da contagem mais alta. Em vez de(thing|sort count -des)[0]
usarmos(thing|sort count)[-1]
. No PowerShell,[-1]
obtém o último elemento. Neste ponto, ainda estamos lidando com os objetos que vieram,Group-Object
então obtemos a.Name
propriedade que é a letra que mais aparece.Notas
wordlist.txt
caso contrário isso poderia economizar alguns bytes..\hangman.ps1 7 0
) é executada em cerca de 350ms.fonte
Python3, 299 bytes
certeza de que isso pode ser jogado ainda mais.
Filtra a lista de palavras para possíveis correspondências, cria um mapa de frequência de caracteres e seleciona o caractere que ocorre com mais frequência que ainda não foi selecionado.
fonte
''.join(..)
s. Se todos os elementos internos forem cadeias de comprimento 1, você poderá alterá-lo para'..'[2::5]
, onde os apóstrofos são reticulares.Java,
646640631607606 (curto)790789779 bytes (rápido)BAIXO
VELOZES
Coloque o arquivo da lista de palavras na pasta.
Algoritmo de versão curta
p[i] == q[i] || q[i] == '\0'
que p é uma palavra da lista de palavras (matriz de caracteres) eq é a palavra que estamos tentando adivinharAlgoritmo de versão longa
fonte
PHP, 346 bytes
Funciona da seguinte maneira:
Premissas:
>=5.4
wordlist.txt
arquivo na pasta atualfonte
php hangman.php 6 YH 2E 6E 3O 1P 4P PHP Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1 Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1
Tentou fazê-lo acho que as pessoasPowershell, 153 bytes
Inspirado pela resposta do briantist .
Como outros escritores, usei o nome do arquivo
wordlist.txt
. Embora fosse possível escolher um nome mais curto.Script de teste com menos golfe:
Resultado:
Valores variáveis para
&$f 7 0 2o,5e,7t
:fonte