Você deve escrever um programa ou função que use uma string de 4 caracteres como entrada e produza um valor indicando se a string é uma palavra em inglês ou não. Você pode cometer erros em 15% dos casos de teste fornecidos.
Detalhes da entrada:
Entrada é uma cadeia de quatro caracteres que contém apenas as letras em inglês em minúsculas (az).
Detalhes da saída:
Se a entrada for uma palavra em inglês, você deve gerar um booleano true
ou um número inteiro 1
.
Se a entrada não for uma palavra em inglês, você deve gerar um booleano false
ou um número inteiro 0
.
Listas de palavras
lista de palavras em inglês de 4 letras (2236 palavras)
lista de cadeias de caracteres sem palavras de 4 letras (2236 cadeias)
A lista de não palavras contém seqüências de letras uniformemente geradas aleatoriamente com as palavras reais removidas delas.
Testando
Seu programa ou função não deve cometer mais de 15% de erros nas listas de palavras fornecidas juntas. Isso significa que você pode fornecer uma saída incorreta para 670 das 4472 entradas fornecidas.
Você deve postar o programa ou a função de teste também para que outras pessoas possam verificar sua resposta. A duração do seu programa de testes não conta na sua pontuação de envios.
As brechas padrão não são permitidas.
Seu programa não deve usar fontes externas, por exemplo, acessar a Web ou ler arquivos.
Isso é código-golfe, portanto o programa ou função mais curto vence.
fonte
Respostas:
Ruby, 29 bytes
Espero que eu tenha entendido direito - é minha primeira vez em programação em Ruby. Na verdade, eu fiz todos os meus testes em Python, mas
import re
foi muito longo para mim.Esta é uma função anônima que recebe uma string e gera as saídas de
true/false
acordo. Ele usa uma regex que procura uma das duas coisas a seguir:jqxz
Se um deles estiver presente, classificamos a entrada como não uma palavra.
A função corresponde a 2030 palavras (falha incorreta em 206) e falha em 1782 não palavras (correspondência incorreta em 454), para um total de 660 classificações incorretas. Testado em ideone .
Obrigado a @ MartinBüttner pela ajuda do Ruby. Martin também aponta que um programa completo ocupa o mesmo número de bytes:
Também obrigado a user20150203 por simplificar o regex.
Ruby,
15861488134912881203 bytesPara um bônus, aqui está uma função com uma regex muito mais longa:
Eu queria mostrar que o regex ainda pode superar a compactação, portanto este classifica todos os casos corretamente . O regex em si é um pouco como decaimento exponencial - os primeiros bits correspondem a muitas não-palavras, depois a cada bit corresponde menos e menos até que eu desisti e concatenou o restante (cerca de 200) no final. Alguns dos que ficaram pareciam surpreendentemente com palavras reais (como
chia
qual é uma palavra).Joguei o regex no meu limpador de golfe regex, que escrevi para outro desafio - ele jogava cerca de 300 bytes antes de tentar embaralhar as coisas manualmente. Ainda há um bocado justo para jogar golfe.
fonte
->s{!s[/[^aeiou]{3}|[jqxz]/]}
possui apenas 29 bytes e corresponde a 2030 palavras (falha incorreta em 206) e falha em 1782 não -words (correspondendo incorretamente a 454), para um total de 660 classificações incorretas. "v
. Obrigado user20150203!Groovy,
7774Eu escrevi o programa de teste em Java, que você pode encontrar neste Gist no Github. Aqui está a saída do meu programa de teste:
(Falha em 629 casos de teste)
PS Acho que isso vai acabar com um problema de golfe regular em breve ...
Se a resposta do Sp3000 (a função) for convertida para Groovy, ela terminará com a mesma contagem de caracteres. Como função nomeada:
ou função sem nome:
fonte
Javascript, 1626 bytes:
Eu queria ir para uma solução que, para cada personagem, tivesse uma pista de qual deles poderia vir depois. Não é tão curto, mas não regex e um resultado bastante bom (palavras: 101 erros, não palavras, 228 erros)
Aqui está uma implementação funcional http://fiddle.jshell.net/jc73sjyn/
Em resumo: o Objeto g contém os caracteres de a a z (como chaves) e, para cada um deles, existe um conjunto de caracteres (também como chaves), cada um representando um caractere que pode vir depois, juntamente com sua porcentagem de probabilidade . Onde não há objeto, não há probabilidade.
As 3 pontuações (4 letras -> 3 avaliações) são multiplicadas, e uma palavra com pontuação igual ou superior a 60 é considerada uma palavra real.
Exemplo: para a palavra 'lidar', existem três pesquisas:
g [c] [o] = 20
g [o] [p] = 5
g [p] [e] = 20
score = 20 * 5 * 20 = 2000, que é mais de 60, para que um seja válido.
(Eu sou bastante novo com javascript, então pode haver maneiras de torná-lo mais curto que eu não conheço.)
EDIÇÃO ATUAL:
Completamente irrelevante até agora, mas avaliei meu caminho para um g mais correto:
Novos resultados:
palavras: 53 erros, não-palavras: 159 erros
http://fiddle.jshell.net/jc73sjyn/2/
fonte
for
loop.w=>
porfunction(w)
e funcionará para todos os navegadores.Python 2, 5254 bytes
Esta solução separa as boas palavras em duas metades. A pesquisa verifica primeiro os 2 primeiros caracteres para encontrar a sequência correta e, em seguida, procura os 2 caracteres seguintes nessa sequência. Não é muito compacto, mas rápido de escrever. Este método corresponde a cada palavra sem erros.
fonte
C # WPF,
110139Mais curta
Resposta antiga
fonte
var
e não introduzindo variáveis, a menos que seja necessário.Word VBA, 25 bytes
Função de janela imediata anônima do VBE que recebe entrada como a seleção atual e sai se for uma palavra como booleana para a janela imediata do VBE.
Função do testador
A função abaixo foi usada para testar a função acima contra os casos de teste. A função falhou 9,07% dos casos (396 das palavras reais e 10 das palavras falsas)
fonte
Mathematica, 33 bytes
Ei, alguém tinha que fazer isso!
Auto-explicativo.
fonte
Javascript ES6, 32 bytes:
Usando a regex da resposta do @ Sp3000 :
Isso cria uma função anônima. Para usá-lo, basta envolvê-lo
()
.Exemplo:
Isso tem exatamente a mesma taxa de falhas do @ Sp3000 e retorna
true
ou defalse
acordo.Todos os créditos devidos ao @ Sp3000 por me deixar usar o regex dele.
fonte
F = function(s) { return /[^aeiou]{3}|[jqxz]/.test(s) }
.