É uma palavra forte?


33

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, hatee you. agateainda é 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 , a resposta com o mínimo de bytes vence!



1
A palavra vazia é ""uma entrada possível?
Silvio Mayolo

@SilvioMayolo Não é.
precisa saber é o seguinte

@LyricLy Se a entrada é "academia", a saída deve ser falsa, da maneira como entendo o problema. Porque 'm' é uma consoante.
Truth-seek

1
uma "banana" está cheio de ódio
jstnthms

Respostas:


18

JavaScript (ES6), 36 28 27 bytes

Economizou 1 byte invertendo o resultado, conforme sugerido por LarsW

Recebe entrada em minúsculas. Retorna falsepara uma palavra forte e truepara uma palavra não forte.

s=>/[^aeiouy]{2}/.test(s+0)

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:

  • contém duas consoantes consecutivas
  • ou termina com uma consoante

Casos de teste


Porque +0? Parece funcionar bem sem ele
Matheus Avellar

1
@MatheusAvellar Sem o +0, retornaria falsos positivos nas palavras que terminam com uma consoante.
Arnauld

Entendo, sem isso, não é possível encontrar duas não vogais consecutivas, se for a última letra da palavra. Inteligente!
Matheus Avellar

Deve ser capaz de omitir os !(dois valores distintos)
LarsW

@LarsW Thanks! Eu não percebi essa regra.
Arnauld

10

Python 2 , 48 bytes

lambda s:'se, F'in`[v in'aeiouy'for v in s+'b']`

Uma função sem nome que pega uma sequência (minúscula) se retorna Falsese forte ou Truenã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 Falseresultados 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 retorna Trueo que significa que a porca é não uma palavra forte.


7

Geléia ,  10  9 bytes

e€ØY;Ạ11ẇ

Um link monádico que pega uma lista de caracteres e retorna:

  • 0 se forte
  • 1 se não

Experimente online! ou veja a suíte de testes .

Quão?

e€ØY;Ạ11ẇ - Link: list of characters, s      e.g. "hate"  or  "you"  or  "not"
  ØY      - consonant yield                   "BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"
e€        - exists in? for €ach letter            [1,0,1,0]   [0,0,0]    [1,0,1]
     Ạ    - all truthy? (1 for any valid input)   1           1          1
    ;     - concatenate                           [1,0,1,0,1] [0,0,0,1]  [1,0,1,1]
      11  - literal eleven
        ẇ - sublist exists?                       0           0          1
          -  N.B.: left of ẇ implicitly makes digits so it looks for the sublist [1,1]

Nota: O motivo do uso é apenas para salvar um byte em excesso 1(já que queremos usá-lo 11imediatamente).


hmm, valores consistentes ...
Erik the Outgolfer,

O que você quer dizer?
Jonathan Allan

o hacky coisa em seu código ... caso contrário, você poderia ter feito e€ØY;1w11ou algo
Erik o Outgolfer

Por que onze? Palavras de corda não parecem estar vinculado ao número onze de qualquer forma
hyiltiz

@hyiltiz, quando a díade 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].
Jonathan Allan

5

05AB1E , 8 bytes

Código

žPS¡¦õÊP

Usa a codificação 05AB1E . Experimente online!

Explicação

žPS¡         # Split the string on consonants (bcdfghjklmnpqrstvwxz)
    ¦        # Remove the first element of the array to handle cases when the
               string starts with a consonant
     õÊP     # Check if the empty string is not in the array

Exemplo

             # "popularize"
žPS¡         # ['', 'o', 'u', 'a', 'i', 'e']
    ¦        # ['o', 'u', 'a', 'i', 'e']
     õÊ      # [1, 1, 1, 1, 1]
       P     # 1

Talvez esteja faltando alguma coisa, mas isso sempre retorne 1? Ele retorna 1 para os casos de verdade que eu tentei e os casos de teste de Falsey.
sundar - Restabelece Monica

(Ah, eu só notei quantos anos essa resposta (e pergunta) tem. Acho que algo no idioma mudou nesse meio tempo?)
sundar - Reinstate Monica

@ Sundar Sim boa captura! Parece que eu quebrei a função de divisão em algum momento. Vou corrigir isso o mais rápido possível.
Adnan

5

R , 43 bytes

function(s)grep("[^aeiouy]{2}",paste(s,""))

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.


Mesmo comentário aqui, você não pode usar $ na regex em vez de adicionar um espaço?
Charlie

@ Charlie Eu não tenho certeza de como você pretende usar $, gostaria de explicar isso mais?
Giuseppe

Gosto muito desta solução. Eu acho que a lógica é mais clara (e bytes é a mesma) com paste0(s,0), mas isso é apenas uma piada. Acho @Charlie está referenciando algo como isto: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL, 20 bytes

⎕←∧/2∨/0,⍨⍞∊'aeiouy'

Experimente online!


3
Eu acho que você não precisa ⎕←.
Zacharý 10/09/17

@ Zacharý Eu não costumava colocar isso, mas mais tarde me disseram (por Dennis, acredito) que um programa não deveria ser executado em um REPL.
Oberon

De que língua ele falou isso? Foi para o Dyalog APL? Eu sei que a política definitivamente se aplica a Python / JavaScript / etc.
Zacharý 13/09/17

3

Haskell , 61 54 bytes

f=and.(zipWith(||)=<<tail).(map(`elem`"aeiouy")).(++"z")

Experimente online!

Eu tive que adicionar um zno final da string para lidar com o caso de uma consoante à direita.


2

Java (OpenJDK 8) , 93 81 bytes

s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}

Experimente online!


Estou booleans medo não são a resposta: 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;}.
Jakob

1
Ou você ainda pode fazer isso:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

Boa resposta, mas com esse desafio, uma simples correspondência de expressões regulares é realmente um pouco menor. Ainda assim, +1 de mim.
Kevin Cruijssen

1
@KevinCruijssen Meu regex é horrível, não consegui fazê-lo funcionar: D. Vou fingir que eu queria ser original
Roberto Graham

@RobertoGraham " Vou fingir que queria ser original " Bem, certamente é. :) E eu costumava ser muito ruim no regex também, mas depois de algumas outras respostas aqui no PPCG usando o regex, estou me acostumando. E eu já tinha descoberto como combinar consoantes usando [a-z&&[^aeiouy]] uma resposta anterior . ;)
Kevin Cruijssen


2

Pitão , 18 bytes

:+Q1."2}M>åYà

Verifique todos os casos de teste.

"Emprestou" a regex da resposta JS . Isso retorna Falsepara palavras fortes, Truecaso contrário


@KevinCruijssen De fato, Pyth usa a ISO-8859-1. Por isso não estou convencido.
Mr. Xcoder

1
Userscript de @KevinCruijssen Downgoat me diz que é 13 bytes: 13 ISO-8859-1 bytes, 13 chars. Eu acho que isso deve ficar bem.
Sr. Xcoder 11/11/17

@KevinCruijssen Deve ser corrigido agora.
Mr. Xcoder

@KevinCruijssen Não vejo nenhuma diferença. Qual é o código que você vê na minha resposta e qual o código no meu link de teste?
Mr. Xcoder


2

Brachylog , 18 11 10 bytes

,Ḷs₂{¬∈Ẉ}ᵐ

Experimente 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.

,Ḷ               % append a newline (non-vowel) at the end of input, 
                 %   to catch final consonants
     s₂          % the result has some substring of length 2
       {¬∈Ẉ}ᵐ    % where neither of its elements belong to  
                 %   the set of alternate vowels (with "y")

1

Python 2 , 58 bytes

-30 bytes ao perceber que pode ser tão simples quanto a resposta JS de Arnauld .

lambda s:re.search('[^aeiouy]([^aeiouy]|$)',s)<1
import re

Experimente online!



Você não precisa atribuir o lambda a alguma coisa? isto é,f=lambda s...
OldBunny2800

@ OldBunny2800, a menos que você esteja usando a referência em seu código (é aceitável criar uma função sem nome que possa ser acessada para reutilização com o código do cabeçalho ou rodapé - aqui com o f=\cabeçalho).
Jonathan Allan

Eu acho que você pode substituir sua seqüência de caracteres padrão '[^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 ).
Jonathan Frech 10/09

@JonathanFrech Ele pode ficar ainda melhor
Mr. Xcoder

1

Perl 5, 31 bytes (30 + 1)

$_=''if/[^aeiouy](?![aeiouy])/

+1 byte para -psinalizador de linha de comando. Imprime a palavra se for uma palavra forte ou a sequência vazia, se não for.


"dois valores distintos e consistentes"
L3viathan 10/09/17

@ L3viathan As cadeias vazias são falsas e as cadeias não vazias são verdadeiras. Isso é válido.
LyricLy

As regras de veracidade do @ L3viathan Perl são realmente muito favoráveis ​​a desafios como esse. Não é a primeira vez que exploro esse fato exato.
Silvio Mayolo 10/09

Com palavras terminadas em nova linha, isso pode ser reduzido para $_=$/if/[^aeiouy]{2}/.
Nwellnhof 11/09

1

Gelatina , 11 bytes

e€ØY;1a2\¬Ȧ

Experimente online!

e€ØY;1a2\¬Ȧ  Main link
 €           For each letter
e            Is it an element of
  ØY         The consonants (excluding Yy)?
    ;1       Append 1 (true) (consonant) to make sure last letter isn't consonant
       2\    For all (overlapping) slices of length 2 (the <link><nilad>\ functionality)
      a      Logical AND of the two values; is it a consonant pair?
         ¬   Logical NOT vectorizing; for each (overlapping) pair, is it not a consonant pair?
          Ȧ  Any and all; make sure all pairs are not consonant pairs

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


Você pode salvar um byte usando a2\ou em Ȧ2Ƥvez deṡ2Ȧ€
miles

@ JonathanAllan facepalm Eu deliberadamente me certifiquei de usar ØCpara garantir que isso Yyfosse contado como uma consoante, porque de alguma forma eu me lembrava de trás para a frente. Obrigado!
HyperNeutrino 10/09

1

Awk, 39 bytes

/([^aeiouy]{2}|[^aeiouy]$)/{print "n"}

imprime npara palavras não fortes, nada (ou apenas uma nova linha) para palavras fortes

seguindo o pacote e procurando duas não vogais consecutivas na entrada em minúsculas

teste

$ awk -f strongwork.awk
hate
love
popularize
academy
you
mouse
acorn
n
nut
n
ah
n
strong
n
false
n
parakeet
n

1

Kotlin , 49 bytes

{Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)}

Verdadeiro e falso são trocados

Embelezado

{
    Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)
}

Teste

var s:(String)->Boolean =
{Regex(".*[^aeiouy]([^aeiouy].*|$)").matches(it)}
data class TestData(val input: String, val output: Boolean)

fun main(args: Array<String>) {
    val items = listOf(
            TestData("hate", true),
            TestData("love", true),
            TestData("popularize", true),
            TestData("academy", true),
            TestData("you", true),
            TestData("mouse", true),
            TestData("acorn", false),
            TestData("nut", false),
            TestData("ah", false),
            TestData("strong", false),
            TestData("false", false),
            TestData("parakeet", false)
    )

    items
            .filter { s(it.input) == it.output }
            .forEach { throw AssertionError(it.toString()) }

    println("Test Passed")
}

TryItOnline

Baseado na resposta de @ Arnauld



1

Java 8, 53 42 bytes

s->s.matches(".*[^aeiouy]([^aeiouy].*|$)")

-11 bytes usando o mesmo regex que na resposta Kotlin de @jrtapsell .

Experimente aqui. ( falsese forte; truese não)

Explicação:

s->               // Method with String parameter and boolean return-type
  s.matches(      //  Checks if the String matches the following regex:
    ".*           //   One or more characters
     [^aeiouy]    //   Followed by a consonant
     ([^aeiouy].* //   Followed by another consonant (+ any more characters)
      |$)")       //   Or the end of the String
                  // End of method (implicit / single-line return statement)

Portanto, basicamente verifica se podemos encontrar duas consoantes adjacentes ou se a String termina com uma consoante.


Resposta antiga ( 53 bytes ):

s->s.matches("[aeiouy]*([a-z&&[^aeiouy]][aeiouy]+)*")

Experimente aqui. ( truese forte; falsese não)

Usa regex para verificar se a string de entrada corresponde ao regex 'strong'. Observe que String#matchesem Java é adicionado automaticamente ^...$para verificar se a String corresponde inteiramente ao regex especificado.

Explicação":

 s->                   // Method with String parameter and boolean return-type
  s.matches(           //  Checks if the String matches the following regex:
    "[aeiouy]*         //   0 or more vowels
    ([a-z&&[^aeiouy]]  //     { A consonant,
     [aeiouy]+)        //       plus one or more vowels }
    *")                //    Repeated 0 or more times
                       // End of method (implicit / single-line return statement)

Uma pesquisa em vez de correspondências (como muitas outras respostas usam) é realmente mais longa em Java:
70 bytes :

s->java.util.regex.Pattern.compile("[^aeiouy]{2}").matcher(s+0).find()

Experimente aqui. ( falsese forte; truese não)



0

SOGL V0.12 , 19 18 bytes

æ"[^ŗy]”ŗ(ŗ|$)”øβ=

Experimente aqui!

Explicação:

æ                   push "aeiou"
 "[^ŗy]”            push "[^ŗy]" with ŗ replaced with pop
        ŗ(ŗ|$)”     push `ŗ(ŗ|$)` with ŗ replaced with pop
               øβ   replace in the input that regex with nothing
                 =  check for equality with the original input



0

Lua, 41 bytes

return#(io.read()..0):match"[^aeiouy]+"<2

Lê da entrada padrão

Lua (string de carregamento), 37 bytes

return#((...)..0):match"[^aeiouy]+"<2

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


0

C ++, 195 194 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)

#include<string>
#define C(p)(v.find(e[p])==size_t(-1))
std::string v="AEIOUY";int s(std::string e){for(int i=0;i<e.size()-1;++i)if(e[i]>64&&e[i]<91&&C(i)&&C(i+1))return 0;return!C(e.size()-1);}

Código a testar:

auto t = {
    "HATE",
    "LOVE",
    "POPULARIZE",
    "ACADEMY",
    "YOU",
    "MOUSE",
    "ACORN",
    "NUT",
    "AH",
    "STRONG",
    "FALSE",
    "PARAKEET"
};

for (auto&a : t) {
    std::cout << (s(a) ? "true" : "false") << '\n';
}

1
Você pode remover o espaço entre returne !.
Zacharý 10/09

0

C, 107 bytes

i,v,w,r,t;a(char*s){w=0;for(r=1;*s;s++){v=1;for(i=6;v&&i;)v=*s^" aeiouy"[i--];r=w&&v?0:r;w=v;}return r&~v;}

Retorna 1 para palavra forte e 0 para palavra fraca . Testado com as palavras dadas no post principal.



0

PHP, 69 bytes

preg_match("/([^AEIOUY][^AEIOUY]+|[^AEIOUY]$)/",$_SERVER['argv'][1]);

Retorna 1 é a palavra não é forte.


Bem-vindo ao PPCG! Eu acredito que você pode remover espaços para cortar alguns bytes, especificamente /", str-> /",stre [1]))) return-> [1])))returnmas eu não sei muito bem o PHP, então não tenho certeza.
Stephen Stephen

Sim, boa ideia! Também é possível reduzir bytes assumindo que a entrada esteja sempre em maiúsculas.
Matias Villanueva

Ah, e se o regex é um mecanismo de regex padrão, você não pode fazer [B-Z]?
Stephen Stephen

@Stephen [B-Z]inclui vogais. [^AEIOUY]funciona, no entanto.
precisa saber é o seguinte

Também não conheço PHP, mas você provavelmente poderia salvar mais bytes retornando diretamente o resultado da correspondência de regex, em vez de agrupá-lo em uma ifinstrução.
precisa saber é o seguinte

0

CJam , 57 bytes

q{"aeiouy"#W=}%_,:B{_A={_A_)\B(<{=!X&:X;}{0:X;;;}?}&}fA;X

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.