Escreva um programa ou função que tenha uma string (ou o equivalente do seu idioma), determine se a string é uma palavra ou não e emita um valor verdadeiro ou falso.
(Isso não é uma duplicata de Isso é mesmo uma palavra? As palavras incorretas são geradas de uma maneira muito diferente que eu acredito que faz deste um desafio completamente diferente)
As palavras serão todas minúsculas, entre 5 e 10 caracteres, e não terão apóstrofos.
As palavras corretas são um subconjunto selecionado aleatoriamente da lista de palavras em inglês do SCOWL (tamanho 50).
As palavras incorretas são geradas por dois métodos: troca e substituição.
As palavras "trocadas" são geradas usando um shuffle Fisher-Yates modificado nas letras das palavras (reais) selecionadas aleatoriamente. Em vez de trocar as letras todas as vezes, uma carta pode ou não ser trocada (a probabilidade varia, portanto, algumas palavras serão mais realistas que outras). Se a nova palavra corresponder a uma palavra existente, o resultado será descartado e gerará outra palavra.
As palavras de "substituição" são geradas usando um método semelhante, mas em vez de trocar a letra por outra letra, cada letra tem a chance de ser substituída por outra letra aleatória.
Cada método é usado para gerar 50% das palavras falsas.
Pontuação
Sua função deve ter menos de 150 bytes . A pontuação é determinada da seguinte forma:
percentage of answers correct + ((150 - length of program) / 10)
Regras
Como isso lida com um grande número de casos de teste (cada lista de palavras tem 1000 palavras), um programa de teste automatizado é adequado. O testador automatizado não conta para a duração do programa; no entanto, deve ser publicado para que outros possam testá-lo.
- Sem brechas.
- Não há embutidos relacionados a ortografia / dicionário.
Recursos
Lista de palavras: http://pastebin.com/Leb6rUvt
Lista de não palavras (atualizada) : http://pastebin.com/rEyWdV7S
Outros recursos (lista de palavras SCOWL e o código usado para gerar as palavras aleatórias): https://www.dropbox.com/sh/46k13ekm0zvm19z/AAAFL25Z8ogLvXWTDmRwVdiGa?dl=0
fonte
quais
,paves
,colic
,supermax
. (Nota: Fiquei encantado ao descobrir quesupermax
é uma palavra real)Respostas:
PHP, 64,9 (50%, 1 byte)
Bem, não tenho muita certeza se essa é uma resposta aceitável, mas aqui vai:
Execute assim:
Obviamente, para uma lista igualmente grande de palavras corretas e incorretas, isso resulta em 50% de falsos positivos e 0% em falsos negativos, portanto, 50% de corretas. Como o programa tem 1 byte, você recebe o bônus de comprimento máximo possível (não obstante, respostas com comprimento zero).
fonte
CJam, 78,6 (78,5%, 149 bytes)
Corresponde 696 palavras reais e não corresponde a 874 não-palavras, dando
1570/2000 = 0.785
. Testado no intérprete on-line no Chrome - não tenho certeza se o link permanente funcionará no Firefox. Caso contrário, a sequência, que contém os imprimíveis, pode ser obtida porO programa apenas faz o hash da entrada e executa uma pesquisa com base em 1077 possíveis buckets. Eu tentei jogar golfe com regex, mas as não-palavras estavam muito próximas das palavras reais para serem úteis.
Experimente online! | Conjunto de testes (cole a lista completa de palavras para contar o número de correspondências)
fonte
Mathematica, 69,35 (69,35%, 150 bytes)
Explicação
A função verificará se a palavra contém certos pares de letras que raramente ocorrem em palavras reais.
True
Nesse caso, a função retornará , indicando que a palavra provavelmente não é uma palavra real. Por exemplo, o par"ii"
ocorre 21 vezes na lista de não palavras, enquanto não ocorre na lista de palavras.Taxa correta
fonte
CSharp, 69,85 (57,45%, 26 bytes)
Verifico se a segunda letra da palavra está na lista de segundas letras mais populares em inglês ( deste site ).
Teste automatizado:
Resultado:
Cálculo:
fonte
ES6, 76 (67,4%, 64 bytes)
Uma resposta mais séria desta vez. Este é um algoritmo bastante simples. Retorna um valor verdadeiro quando o segundo caractere de uma palavra é um dos
aeinoru
. Não produz uma taxa de sucesso significativamente melhor do que apenas1
, mas ainda é muito curto.Teste aqui.
&!
por>
qxy
, adicionando segundos caracteres mais comuns (comuns) para compensar falsos negativos, eliminando a vírgula redundante na regexfiopq
fonte