Eles dizem que hate
é uma palavra forte. Eu queria descobrir o porquê, então dei uma boa olhada na palavra.
Percebi que toda consoante tinha uma vogal depois dela. Isso fez parecer muito forte para mim, então eu decidi que é isso que torna uma palavra forte.
Quero encontrar palavras mais fortes, então vou precisar de um programa para isso!
Encontrar palavras fortes
Palavras fortes são aquelas em que cada consoante (letras do conjunto BCDFGHJKLMNPQRSTVWXZ
) é seguida por uma vogal (letras do conjunto AEIOUY
). É isso aí. Nada mais importa.
Se a palavra começar com uma vogal, você não precisa se preocupar com nenhuma das letras antes da primeira consoante. Se a palavra não tem consoantes, é automaticamente uma palavra forte!
Alguns exemplos de palavras fortes são agate
, hate
e you
. agate
ainda é uma palavra forte porque, embora comece com uma vogal, toda consoante ainda é seguida por uma vogal. you
é uma palavra forte porque não tem consoantes.
Não há restrição de comprimento para palavras fortes.
O desafio
Escreva um programa ou função que use uma string não vazia como entrada e emita um valor verdadeiro se for uma palavra forte ou um valor falso se não for.
Esclarecimentos
- Você pode optar por receber a entrada em minúsculas ou maiúsculas. Especifique qual em sua resposta.
- As palavras não conterão pontuação de nenhum tipo. Eles conterão apenas letras simples no conjunto
ABCDEFGHIJKLMNOPQRSTUVWXYZ
. - Em vez de valores verdadeiros e falsos, você pode escolher dois valores distintos e consistentes para retornar para verdadeiro e falso. Se você fizer isso, especifique os valores que você escolheu na sua resposta.
- Como alternativa, você pode gerar um valor falso para uma palavra forte e um valor verdadeiro para uma palavra não forte.
Casos de teste
Input -> Output
hate -> true
love -> true
popularize -> true
academy -> true
you -> true
mouse -> true
acorn -> false
nut -> false
ah -> false
strong -> false
false -> false
parakeet -> false
Pontuação
Como se trata de código-golfe , a resposta com o mínimo de bytes vence!
fonte
""
uma entrada possível?Respostas:
JavaScript (ES6),
362827 bytesEconomizou 1 byte invertendo o resultado, conforme sugerido por LarsW
Recebe entrada em minúsculas. Retorna
false
para uma palavra forte etrue
para uma palavra não forte.Quão?
Anexamos um
0
(não vogal) no final da sequência de entrada e procuramos dois caracteres consecutivos que não sejam vogais. Isso nos permite cobrir os dois casos que tornam uma palavra não forte:Casos de teste
Mostrar snippet de código
fonte
+0
? Parece funcionar bem sem ele+0
, retornaria falsos positivos nas palavras que terminam com uma consoante.!
(dois valores distintos)Python 2 , 48 bytes
Uma função sem nome que pega uma sequência (minúscula)
s
e retornaFalse
se forte ouTrue
não.Experimente online! (inverte os resultados para corresponder ao OP)
Quão?
Palavras não fortes têm uma consoante seguida por uma consoante ou terminam em uma consoante.
O código adiciona uma consoante ao final (
s+'b'
) para fazer com que o teste necessário seja apenas para duas consoantes seguidas.Ele descobre se cada letra da palavra alterada é uma vogal com a compreensão da lista
[v in'aeiouy'for v in s+'b']
.Agora, ele precisa verificar dois
False
resultados seguidos (sinalizando uma palavra não forte), obtendo uma representação de string (usando`...`
) desta lista e procurando a existência de'se, F'
. Esta é a string mais curta encontrada em,'False, False'
mas nenhum de'True, True'
:;'False, True'
; ou'True, False'
.Como exemplo, considere
'nut'
, a compreensão da lista avalia cada letra,v
, da'nutb'
para a existência em'aeiouy'
ceder a lista[False, True, False, False]
, a representação de cadeia desta lista é'[False, True, False, False]'
que contém'e, F'
aqui:'[False, True, Fals>>e, F<<alse]'
portanto, a função retornaTrue
o que significa que a porca é não uma palavra forte.fonte
Geléia ,
109 bytesUm link monádico que pega uma lista de caracteres e retorna:
0
se forte1
se nãoExperimente online! ou veja a suíte de testes .
Quão?
Nota: O motivo do uso
Ạ
é apenas para salvar um byte em excesso1
(já que queremos usá-lo11
imediatamente).fonte
Ạ
coisa em seu código ... caso contrário, você poderia ter feitoe€ØY;1w11
ou algoẇ
tem um argumento à esquerda, que é um número, é convertida implicitamente em uma lista decimal de dígitos, para que os onze se tornem[1,1]
.05AB1E , 8 bytes
Código
Usa a codificação 05AB1E . Experimente online!
Explicação
Exemplo
fonte
R , 43 bytes
Experimente online!
Um porto da resposta JavaScript de Arnauld; retorna 1 para palavras fracas e
integer(0)
fortes; anexa um(espaço) ao final da sequência.
Isso é realmente vetorizado; com um vetor de strings, ele retorna os índices (com base em 1) das palavras fracas.
fonte
$
, gostaria de explicar isso mais?paste0(s,0)
, mas isso é apenas uma piada. Acho @Charlie está referenciando algo como isto:grep("[^aeiouy]([^aeiouy]|$)",s)
Dyalog APL, 20 bytes
Experimente online!
fonte
⎕←
.Haskell ,
6154 bytesExperimente online!
Eu tive que adicionar um
z
no final da string para lidar com o caso de uma consoante à direita.fonte
Java (OpenJDK 8) ,
9381 bytesExperimente online!
fonte
s->{int w=0,p=w,l;for(char c:s){l="aeiouy".indexOf(c)>>31;w|=p&l;p=l;}return w+p>=0;}
.s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
[a-z&&[^aeiouy]]
uma resposta anterior . ;)Casca , 12 bytes
Experimente online!
Agradecemos a H.PWiz pela ajuda com -4.
Retorna valores inconsistentes, mas adequadamente verdadeiros ou falsos.Graças a Leo por -1, agora retorna um valor consistente de verdade / falsidade.
fonte
Pitão , 18 bytes
Verifique todos os casos de teste.
"Emprestou" a regex da resposta JS . Isso retorna
False
para palavras fortes,True
caso contráriofonte
13 ISO-8859-1 bytes, 13 chars
. Eu acho que isso deve ficar bem.Brachylog ,
181110 bytesExperimente online!
Puro e simples (exceto talvez os 2 bytes iniciais extras para lidar com o caso consoante final, como "periquito").
É falsey para palavras fortes e verdade para palavras não fortes.
fonte
Python 2 , 58 bytes
-30 bytes ao perceber que pode ser tão simples quanto a resposta JS de Arnauld .
Experimente online!
fonte
f=lambda s...
f=\
cabeçalho).'[^aeiouy]([^aeiouy]|$)'
(24 bytes) por"[^aeiouy]("*2+")|$)"
(21 bytes) para salvar 3 bytes, pois o grupo vazio()
, não altera o comportamento da pesquisa ( TIO ).Perl 5, 31 bytes (30 + 1)
+1 byte para
-p
sinalizador de linha de comando. Imprime a palavra se for uma palavra forte ou a sequência vazia, se não for.fonte
$_=$/if/[^aeiouy]{2}/
.Gelatina , 11 bytes
Experimente online!
Sim, eu sei que fui derrotado por Jonathan Allan, mas eu queria compartilhar minha abordagem de qualquer maneira: P
-4 bytes roubando um pouco da resposta de Jonathan Allan (em vez de anexar uma consoante para verificar a última letra da caixa de letras, basta acrescentar 1)
-1 byte graças às milhas
fonte
a2\
ou emȦ2Ƥ
vez deṡ2Ȧ€
ØC
para garantir que issoYy
fosse contado como uma consoante, porque de alguma forma eu me lembrava de trás para a frente. Obrigado!Awk, 39 bytes
imprime
n
para palavras não fortes, nada (ou apenas uma nova linha) para palavras fortesseguindo o pacote e procurando duas não vogais consecutivas na entrada em minúsculas
teste
fonte
Kotlin , 49 bytes
Verdadeiro e falso são trocados
Embelezado
Teste
TryItOnline
Baseado na resposta de @ Arnauld
fonte
Retina ,
2318 bytesExperimente online! Saídas 0 para forte, 1 se não. Adicione 1 byte para oferecer suporte a maiúsculas e minúsculas. Editar: salvou 5 bytes graças a @ovs.
fonte
Java 8,
5342 bytes-11 bytes usando o mesmo regex que na resposta Kotlin de @jrtapsell .
Experimente aqui. (
false
se forte;true
se não)Explicação:
Portanto, basicamente verifica se podemos encontrar duas consoantes adjacentes ou se a String termina com uma consoante.
Resposta antiga ( 53 bytes ):
Experimente aqui. (
true
se forte;false
se não)Usa regex para verificar se a string de entrada corresponde ao regex 'strong'. Observe que
String#matches
em Java é adicionado automaticamente^...$
para verificar se a String corresponde inteiramente ao regex especificado.Explicação":
Uma pesquisa em vez de correspondências (como muitas outras respostas usam) é realmente mais longa em Java:
70 bytes :
Experimente aqui. (
false
se forte;true
se não)fonte
Ruby , 25 bytes
Experimente online!
Todo mundo está fazendo isso, então por que o Ruby não pode?
fonte
SOGL V0.12 ,
1918 bytesExperimente aqui!
Explicação:
fonte
05AB1E , 11 bytes
Experimente online!
Usa o algoritmo de Jonathan, retorna
0
para verdadeiro e1
para falso.fonte
Swift 3.1 , 85 bytes
Experimente aqui!
Isso toma emprestado a expressão regular de Arnauld .
fonte
Lua, 41 bytes
Lê da entrada padrão
Lua (string de carregamento), 37 bytes
Lê do (s) parâmetro (s) da função
Entrada em minúscula
Vê se existe uma sequência de comprimento 2 ou mais, consistindo apenas de não vogais (consoantes) ou se a sequência termina com uma não vogal
Retorna verdadeiro / falso
fonte
C ++,
195194 bytes-1 bytes graças a Zacharý
Maiúsculas, retorne verdadeiro se a entrada for uma palavra forte, caso contrário, false (C ++ tem int simples para boolar regras de conversão implícitas, 0 => falso, verdadeiro caso contrário)
Código a testar:
fonte
return
e!
.C, 107 bytes
Retorna 1 para palavra forte e 0 para palavra fraca . Testado com as palavras dadas no post principal.
fonte
C (gcc) , 59 bytes
Experimente online!
fonte
PHP, 69 bytes
Retorna 1 é a palavra não é forte.
fonte
/", str
->/",str
e[1]))) return
->[1])))return
mas eu não sei muito bem o PHP, então não tenho certeza.[B-Z]
?[B-Z]
inclui vogais.[^AEIOUY]
funciona, no entanto.if
instrução.CJam , 57 bytes
Experimente online!
Lê entrada, converte para 1s para consoantes, 0s para vogais. Para cada consoante, AND variável predefinida X (predefinida para 1) com o valor do próximo caractere. Saída X
fonte