Seu programa deve encontrar todas as palavras nesta lista de palavras que contenham todas as vogais ( a e i o u y
). Existem maneiras fáceis de fazer isso, mas estou procurando a resposta mais curta. Vou usar qualquer idioma, mas gostaria de ver o Bash.
Aqui está um exemplo (poderia ser muito melhorado):
cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"
Sua pontuação é o comprimento do código.
-5 pontos para contar todas as ocorrências da palavra.
Menor pontuação ganha.
code-challenge
natural-language
O médico
fonte
fonte
Respostas:
GolfScript, 20 caracteres - 5 = 15 pontos
Com base na solução de Howard , mas usando um teste mais curto (
\-!
economiza um caractere mais&,6=
), anexos de comprimento mais curtos (.,+
= 3 caracteres) e formatação de saída mais curta (ninguém disse que a saída tinha que ser separada por nova linha, portanto,`
economiza um caracteren*
).Aqui está a saída, considerando a lista de palavras em minúsculas como entrada (quebras de linha inseridas para facilitar a leitura):
(Ps. Tecnicamente, dado que o desafio diz apenas que o código precisa trabalhar para essa entrada específica,
n%{'aeiouy'\-!},`43
seria um caractere mais curto ainda. Porém, considero que trapaça.)Explicação:
n%
divide a entrada em novas linhas em uma matriz.{ },
é um operador "grep", executando o código entre chaves entre cada elemento da matriz e selecionando aqueles para os quais ele retorna um valor verdadeiro.'aeiouy'\-
pega a string literalaeiouy
e remove todos os caracteres encontrados na palavra candidata. Em!
seguida, nega logicamente a string resultante, produzindo1
(true) se a string está vazia e0
(false) se não estiver..,+
faz uma cópia da matriz filtrada, conta o número de palavras e anexa o resultado à matriz original.`
desvaloriza a matriz, convertendo-a em uma representação de string de seu conteúdo. (Sem ele, as palavras na matriz seriam simplesmente concatenadas na saída, produzindo uma confusão ilegível.)fonte
GolfScript, 19 caracteres
Uso:
Saída:
Se você também quiser exibir a contagem no final, poderá usar
que tem mais quatro caracteres.
fonte
Python - 46 caracteres
Versão legível: já é bastante legível :-)
fonte
APL, 21-5 = 16
Espera encontrar a lista de palavras como
w
. Retorna uma lista das palavras que contêm todas as vogais, além de sua contagem. Testado com ngn apl . Aqui está um exemplo .Explicação
fonte
Ruby 38
Edição 34: Melhor até agora (da @OI):
Edit 1: Acabei de notar que a pergunta solicitada para 'y' ser incluída entre as vogais, por isso editei minha pergunta de acordo. Como @Nik apontou em um comentário para sua resposta,
"aeiouy".chars
um caractere é menor que%w[a e i o u y]
, mas deixarei o último por diversidade, mesmo que eu esteja arriscando pesadelos com a oportunidade perdida.Edição 2: Agradecemos à @OI por sugerir a melhoria:
que salva 11 caracteres do que eu tinha antes.
Edite 3 e 3a: a @OI interrompe mais algumas:
then
e novamente (3b):
Eu sou um mero escriba!
Aqui estão mais duas soluções pouco complexas:
Inicialmente tive:
s
é uma sequência que contém as palavras, separadas por novas linhas. Uma matriz de palavrass
contendo as cinco vogais é retornada. Para leitores não familiarizados com Ruby%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]
e com&
interseção de matriz.Suponha
No bloco
{...}
, inicialmenteentão "abreviações" não está selecionada.
Se a sequência
s
pode conter duplicatas,s.split.select...
pode ser substituída pors.split.uniq.select...
para remover duplicatas.Só notei que eu poderia salvar 1 caractere substituindo
size==6
porsize>5
.fonte
...size=5
é um bug - deve ser...size==5
s.split.select{|w|'aeiouy'.delete(w)==''}
s.split.select{|w|'aeiouy'.tr(w,'')==''}
. Tenho certeza de que você pode obter isso com menos de 40 caracteres se usar a lógica nil e o método String 'certo'. Ainda está procurando ... #Haskell - 67
fonte
Ruby - 28 caracteres (ou 27 se
y
for excluído das vogais)O comando completo a ser executado é (48 caracteres):
EDIT: substituído
puts
porp
conforme sugerido por @CarySwovelandfonte
%w[a e i o u]
economizaria 1 caracterep
porputs
mais 3.p
, eu raramente uso. Quanto a% w [], se y estiver incluído no conjunto de vogais, a versão com caracteres será ainda mais curta."aeiouy".delete(s)==''
pode economizar alguns caracteres.AWK - 29
Para executar: salve a lista de palavras em minúsculas em
wordlist.txt
. Então faça:Se o seu sistema não possuir
mawk
, tambémawk
pode ser usado.Você também pode executá-lo a partir de um arquivo, salvando o programa em
program.awk
e executandomawk
orawk
-f program.awk
.fonte
'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
!!Python, 45 caracteres
fonte
k [22-5 = 17 caracteres]
Renomeei o arquivo "corncob_lowercase.txt" para "w"
Conte as palavras [22 caracteres]
Saída
Encontre todas as palavras [25 caracteres]
No geral 43 palavras contendo todas as vogais
(a e i o u y)
Saída
fonte
Bytes Javascript / JScript 147 (152-5), 158 (163-5) ou 184 (189-5):
Aqui está minha versão Javascript e JScript horrivelmente "não-golfizada" (
164152152-5 = 147 bytes):function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}
Obrigado @GaurangTandon pela
search()
função, que me salvou um byte!RegExp baseado em desempenho HORRÍVEL , mas suporta letras maiúsculas e minúsculas (163-5 = 158 bytes):
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
RegExp com melhor desempenho, MAS leva muito mais bytes (189-5 = 184 bytes):
function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}
Este é apenas por diversão (175-5 bytes) e não conta como resposta:
function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}
Baseia-se na 1ª resposta, mas tem uma "reviravolta": você pode saber quantas vezes uma palavra foi encontrada.
Você simplesmente faz assim:
var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');
b.youaie //should be 4
Desde que
length
não tem todas as vogais, não será excluído e ainda seria uma resposta para o bônus.Como você chama isso?
"Simples": você quebra a função por dentro
()
e depois adiciona('string goes here');
ao final.Como isso:
(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');
Este exemplo retornará uma matriz apenas com 1 string: yoiuae
Eu sei que esta é a pior solução, mas funciona!
Por que estou contando -5?
Bem, matrizes Javascript / JScript têm uma propriedade (
length
) em matrizes que informa o número de elementos que ela possui.Depois de confirmado na pergunta, o bônus de -5 é para dizer o número de palavras.
Como o número de palavras está nessa propriedade, automaticamente tenho a pontuação de -5.
fonte
search()
vez deindexOf()
salvar 1 caractere..split()
on"aeiouy"
. JS faz um loop sobre uma matriz e uma string da mesma maneira. (Removendo o conserva ~ 10 caracteres)Ruby
3938Atualmente, a menor entrada Ruby ao contar todo o programa, incluindo entrada e saída.
Salve um char usando em
map
vez deeach
:Outra versão, 39 caracteres com saída mais bonita:
Ambos os programas recebem entrada de stdin ou como um nome de arquivo passado como argumento de linha de comando:
$ ruby wovels.rb wordlist.txt
Custa 3 caracteres extras para inclyde
y
como um wovel.fonte
Enumerable#grep
para encurtar isso? por exemplo,s.split.grep /a*e*i*o*u*y/
supondo ques
seja uma sequência de palavras separadas por novas linhas..*
combiná- la, entre as varetas.s = "aeiouy\neiouay\nyuaioe\n"
. Entãos.split.grep /a*e*i*o*u*y/
retorna["aeiouy", "eiouay", "yuaioe"]
para mim. Testando nopry
Ruby 2.0.0. Ótima solução, a propósito.grep
usava o=~
operador, mas aparentemente ele usa===
. Minha suspeita era que ele também corresponderia a strings que não contêm todos os manivelas, porque, por exemplo,/e*a*i*o*u*y/=~"eioy"
funciona. Realmente não entendo o que realmente faz===
entre um regex e um operador. Ótima descoberta; Sugiro que você a publique como resposta. edit Eu estava certo: tente por exemplo"heya"
.Mathematica (65 ou 314)
Duas abordagens muito diferentes, a melhor foi proposta por Belisarius nos comentários à minha resposta inicial. Primeiro, meu esforço brutal, que gera algoritmicamente todas as expressões regulares possíveis que correspondem a uma combinação de seis vogais (incluindo "y") e, em seguida, verifica cada palavra na lista de palavras de destino em relação a cada uma dessas 720 expressões regulares. Funciona, mas não é muito conciso e é lento.
~ 320 caracteres. Alguns podem ser salvos usando notação alternativa, e caracteres adicionais são perdidos ao preparar o arquivo de dicionário como uma lista de strings (o formato natural do dicionário no Mathematica. Outros idiomas podem não precisar dessa preparação, mas o Mathematica precisa). Se omitirmos essa etapa, presumindo que ela tenha sido tratada por nós, a mesma abordagem pode ser feita com menos de 250 caracteres e, se usarmos o dicionário interno do Mathematica, obteremos economias ainda maiores,
Menos de 200 caracteres. Contar o número de palavras encontradas requer apenas passar o resultado para
Length[Flatten[]]
, que pode ser adicionado ao redor de qualquer bloco de código acima ou pode ser feito posteriormente com, por exemplo,Length@Flatten@%
,. A lista de palavras especificada para esse desafio fornece 43 correspondências e o dicionário Mathematica fornece 64 (e é muito mais rápido). Cada dicionário possui palavras correspondentes que não estão no outro. O Mathematica localiza "profissionalmente", por exemplo, que não está na lista compartilhada, e a lista compartilhada encontra "eucariótico", que não está no dicionário do Mathematica.Belisarius propôs uma solução muito melhor. Supondo que a lista de palavras já tenha sido preparada e atribuída à variável
l
, ele define um único teste com base naStringFreeQ[]
função do Mathematica e aplica esse teste à lista de palavras usando oPick[]
função 65 caracteres, e é cerca de 400 vezes mais rápido que a minha abordagem.fonte
f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]
Ondel
está a lista de palavrasy
(! Conforme as exigências OP) como uma vogalPerl 6 - 35 caracteres
Inspirado na solução Ruby de @CarySwoveland:
Isso seleciona (
grep
s) cada linha que retornaTrue
para<a e i o u y> ⊆ *.comb
, que é apenas uma maneira elegante de pedir "é o conjunto('a','e','i','o','u','y')
um subconjunto (⊆
) do conjunto constituído pelas letras do input (*.comb
)?"Na verdade, ambos
<a e i o u y>
e*.comb
apenas criamList
s:⊆
(ou(<=)
se você estiver preso em ASCII) os transforma emSet
s para você.Para obter o número de linhas impressas, esse script de 42 caracteres - 5 = 37 pontos também produzirá isso:
fonte
C - 96 bytes
Salvei vários bytes de parênteses graças a uma feliz coincidência de precedência do operador.
fonte
Javascript - Pontuação = 124 - 5 = 119 !!!
Edição: 17/02/14
Muito obrigado a @Ismael Miguel por me ajudar a cortar ~ 12 caracteres !
Eu removi o formulário da função de notação de seta gorda porque, embora eu tenha visto o uso inicial, ele não funciona. Não faço ideia porque ...
Para fazer funcionar:
Passe todas as palavras separadas por nova linha como argumento para a função, como mostrado abaixo.
Teste:
fonte
k="aeiouy".split("")
para ficar dentro dofor(i in k)
loop. Usar em;
vez de novas linhas salva alguns bytes no Windows. E, no entanto, não vejo como ele irá lidar com uma lista de palavras. E como fazê-lo funcionar.k="aeiouy";o=0;for(i in k)
, tenteo=0;for(i in k='aeiouy')
. e usando o bytes salva, você pode usá-los para mudaro+=RegExp(k[i]).test(s)
parao+=RegExp(k[i],'i').test(s)
, ocupando mais de um byte, mas trabalhar com ambas maiúsculas e minúsculas.Bash + coreutils, 39
Recebe entrada de stdin.
fonte
sed 29 chars
Ordem escolhida entre Frequência de letras na wikipedia para acelerar a verificação.
No meu host:
e
fonte
Bash (grep) - 36 bytes
Observe a ordem das vogais testadas, menos frequentes primeiro. Para o caso de teste, isso é executado cerca de três vezes mais rápido que o teste, na ordem seguinte. Dessa forma, o primeiro teste remove um número maior de palavras, para que os testes subsequentes tenham menos trabalho a fazer. Obviamente, isso não afeta o comprimento do código. Muitas das outras soluções postadas aqui se beneficiariam de maneira semelhante ao realizar os testes nesta ordem.
fonte
D - 196
Sem golfe :
Uso :
C:\>rdmd vowels.d wordlist.txt
wordlist.txt
deve conter as palavras da lista em minúsculas.fonte
Rebol (104 caracteres)
Sem golfe:
d
agora contém lista de palavras encontradas. Aqui está um exemplo do console Rebol:fonte
Smalltalk (36/57 caracteres)
para obter a contagem, envie #size para a coleção resultante. A coleção de resultados contém 43 palavras ('abstemiously' 'com autoridade' ... 'inquestionavelmente' 'irreconhecivelmente')
O código acima tem 77 caracteres, mas eu poderia ter renomeado o arquivo da lista de palavras para 'w', então conto o nome do arquivo como 1, o que resulta em uma pontuação de 57.
A leitura do arquivo faz parte do problema ou não? Caso contrário (veja outros exemplos), e a lista de palavras já está em uma coleção c, o código será reduzido para:
que é de 36 caracteres (com espaço em branco omitível removido).
fonte
atualizado: espaços desnecessários removidos
Muito lento, mas no bash (81 caracteres):
EDIT:
echo $l|fold -w1
substituído porfold -w1<<<$l
conforme sugerido por @ nyuszika7hfonte
fold -w1<<<$l
vez deecho $l|fold -w1
. Nota: o código atual é de 84 caracteres, você não deve contar a nova linha à direita.JavaScript - 95 bytes
Aqui está o meu golfe.
E também gostaria de salientar que seu golfe não parece encontrar todas as ocorrências de vogais.
Ungolfed:
fonte
(?=.*a)
verificar sea
está em algum lugar na string.ordenar + uniq + sed
Este não corresponde a ocorrências repetidas de uma palavra. Também não corresponde à letra 'y' se ocorrer no início de uma palavra.
fonte
Bater
Não tão curto quanto o OP, mas uma linha no Bash:
fonte
C # - 170
Formatado:
Agora não está com disposição para implementar a contagem, mas deve ser fácil.O caminho para a (versão em minúscula da) lista de palavras deve ser passado ao programa como primeiro argumento:Saída:
Tomei a liberdade de produzir e separar vírgulas; nenhum dos quais está especificado nas regras (qual estado "deve encontrar todas as palavras", não como (e SE) como saída).
Incluindo contagem (+ saída): 192 - 5 = 187
Saída:
(Observe a contagem no final: 43)
Nenhuma saída ("deve encontrar todas as palavras"): 137 - 5 = 132
(Dobra as regras um bit e depois novamente: não realmente) Isso localiza todas as palavras e a contagem está disponível executando
r.Count()
.fonte
C-Sharp
Eu nunca fiz isso antes e não sei exatamente quais são os procedimentos de postagem. Mas é isso que eu vim com:
185 bytes
wordList
= aList<string>
de todas as palavras.se você deseja exibir um total:
219 - 5 = 214 bytes
Expandido
fonte
vb.net (pontuação 91 = 96c - 5) * 0
* 0 + 49c min
Isso cria uma enumeração que contém todas as palavras que contêm todas as vogais.
fonte
Your program must find all the words in this wordlist
. Este é a) não um programa, mas um trecho de um programa eb) não lê / usa a lista de palavras.Mathematica -
136102O link abreviado vai para http://www.mieliestronk.com/corncob_lowercase.txt
fonte
http://bit.ly/1iZE9kY
.Characters["aeiou"]
ou mais, se você incluiry
.