¿Es una palabra fuerte?


33

Dicen que hatees una palabra fuerte. Quería saber por qué, así que eché un buen vistazo a la palabra.

Noté que cada consonante tenía una vocal después. Eso me hizo parecer bastante fuerte, así que decidí que eso es lo que hace que una palabra sea fuerte.

Quiero encontrar palabras más fuertes, ¡así que necesitaré un programa para ello!

Encontrar palabras fuertes

Las palabras fuertes son palabras donde cada consonante (letras en el conjunto BCDFGHJKLMNPQRSTVWXZ) es seguida por una vocal (letras en el conjunto AEIOUY). Eso es. Nada más importa.

Si la palabra comienza con una vocal, no tiene que preocuparse por ninguna de las letras antes de la primera consonante. Si la palabra no tiene consonantes, ¡es automáticamente una palabra fuerte!

Algunos ejemplos de palabras fuertes son agate, hatey you. agatesigue siendo una palabra fuerte porque, aunque comienza con una vocal, a cada consonante todavía le sigue una vocal. youes una palabra fuerte porque no tiene consonantes.

No hay restricción de longitud para palabras fuertes.

El reto

Escriba un programa o función que tome una cadena no vacía como entrada y genere un valor verdadero si es una palabra fuerte o un valor falso si no lo es.

Aclaraciones

  • Puede decidir tomar la entrada en minúsculas o mayúsculas. Especifique cuál en su respuesta.
  • Las palabras no contendrán signos de puntuación de ningún tipo. Solo contendrán letras simples en el conjunto ABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • En lugar de valores de verdad y falsedad, puede elegir dos valores distintos y consistentes para obtener verdadero y falso. Si hace esto, especifique los valores que ha elegido en su respuesta.
    • Alternativamente, puede generar un valor falso para una palabra fuerte y uno verdadero para una palabra no fuerte.

Casos de prueba

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

Tanteo

Como se trata de , ¡la respuesta con la menor cantidad de bytes gana!



1
¿Es la palabra vacía ""una posible entrada?
Silvio Mayolo

@SilvioMayolo No lo es.
LyricLy

@LyricLy Si la entrada es "academia", la salida debería ser falsa, por lo que entiendo el problema. Porque 'm' es una consonante.
Búsqueda de la verdad

1
un "plátano" está lleno de odio
jstnthms

Respuestas:


18

JavaScript (ES6), 36 28 27 bytes

Se guardó 1 byte invirtiendo el resultado, como lo sugiere LarsW

Toma entrada en minúsculas. Devuelve falsepara una palabra fuerte y truepara una palabra no fuerte.

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

¿Cómo?

Agregamos un 0(sin vocal) al final de la cadena de entrada y buscamos dos caracteres consecutivos sin vocal. Esto nos permite cubrir ambos casos que hacen que una palabra no sea fuerte:

  • contiene dos consonantes consecutivas
  • o termina con una consonante

Casos de prueba


¿Por qué +0, sin embargo? Parece funcionar bien sin él
Matheus Avellar

1
@MatheusAvellar Sin el +0, devolvería falsos positivos en las palabras que terminan con una consonante.
Arnauld

Ya veo, sin eso no puede encontrar 2 no vocales consecutivas si es la última letra de la palabra. ¡Inteligente!
Matheus Avellar

Debería poder omitir los !(dos valores distintos)
LarsW

@LarsW ¡Gracias! No me di cuenta de esta regla.
Arnauld

10

Python 2 , 48 bytes

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

Una función sin nombre que toma una cadena (minúscula), s , y regresa Falsesi es fuerte o Trueno.

Pruébalo en línea! (invierte los resultados para que coincidan con el OP)

¿Cómo?

Las palabras no fuertes tienen una consonante seguida de una consonante o terminan en una consonante.

El código agrega una consonante al final (s+'b' ) para que la prueba requerida sea solo para dos consonantes seguidas.

Descubre si cada letra en la palabra alterada es una vocal con la comprensión de la lista [v in'aeiouy'for v in s+'b'] .

Ahora necesita verificar dos Falseresultados seguidos (indicando una palabra no fuerte), lo hace obteniendo una representación de cadena (usando `...`) de esta lista y buscando la existencia de 'se, F'. Esta es la cadena más corta encontrada 'False, False'pero ninguna de 'True, True':; 'False, True'; o'True, False' .

Como un ejemplo 'nut', considere , la comprensión de la lista evalúa cada letra, vde la 'nutb'existencia en el 'aeiouy'rendimiento de la lista [False, True, False, False], la representación de cadena de esta lista es la '[False, True, False, False]'que contiene 'e, F'aquí: '[False, True, Fals>>e, F<<alse]'por lo tanto, la función devuelve Truelo que significa que nuez no es una palabra fuerte.


7

Jalea ,  10  9 bytes

e€ØY;Ạ11ẇ

Un enlace monádico que toma una lista de caracteres y regresa:

  • 0 si fuerte
  • 1 si no

Pruébalo en línea! o ver el conjunto de pruebas .

¿Cómo?

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: La razón para usar es solo para guardar un byte sobre el uso 1(ya que luego queremos usarlo de 11inmediato).


hmm, valores consistentes ...
Erik the Outgolfer

¿Qué quieres decir?
Jonathan Allan

lo hacky en su código ... de lo contrario podría haber hecho e€ØY;1w11o algo así
Erik the Outgolfer

¿Por qué once? Las palabras de cadena no parecían estar vinculadas al número once de ninguna manera
hyiltiz

@hyiltiz cuando la díada tiene un argumento izquierdo que es un número, se convierte implícitamente en una lista decimal de dígitos, por lo que el once se convierte [1,1].
Jonathan Allan

5

05AB1E , 8 bytes

Código

žPS¡¦õÊP

Utiliza la codificación 05AB1E .Pruébalo en línea!

Explicación

ž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

Ejemplo

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

Tal vez me estoy perdiendo algo, pero esto parece siempre devolver 1? Devuelve 1 tanto para los casos verdaderos que probé como para los casos de prueba de falsey.
Sundar - Restablecer Monica

(Oh, me he dado cuenta de la edad que esta respuesta (y la pregunta) es supongo que algo en el lenguaje ha cambiado desde entonces.?)
Sundar - Restablecer Mónica

@sundar Sí buena captura! Parece que rompí la función de división en algún momento. Arreglaré esto lo antes posible.
Adnan

5

R , 43 bytes

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

Pruébalo en línea!

Un puerto de la respuesta JavaScript de Arnauld; devuelve 1 para palabras débiles yinteger(0) para fuertes; agrega un (espacio) al final de la cadena.

Esto en realidad está vectorizado; con un vector de cadenas, devuelve los índices (basados ​​en 1) de las palabras débiles.


Mismo comentario aquí, ¿no puedes usar $ en la expresión regular en lugar de agregar un espacio?
Charlie

@ Charlie No estoy seguro de cómo piensas usar $, ¿te gustaría explicarlo más?
Giuseppe

Me gusta mucho esta solución. Creo que la lógica es más clara (y los bytes son iguales) paste0(s,0), pero eso es solo una objeción. Creo que @Charlie hace referencia a algo como esto: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL, 20 bytes

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

Pruébalo en línea!


3
No creo que lo necesites ⎕←.
Zacharý

@ Zacharý No solía decirlo, pero luego Dennis me dijo (creo) que un programa no debería ejecutarse en un REPL.
Oberon

¿De qué idioma te dijo eso? ¿Fue por Dyalog APL? Sé que la política definitivamente se aplica a Python / JavaScript / etc.
Zacharý

3

Haskell , 61 54 bytes

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

Pruébalo en línea!

Tuve que agregar un zal final de la cadena para manejar el caso de una consonante final.


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;}

Pruébalo en línea!


Estoy booleanos miedo no son la respuesta: 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
O incluso puedes hacer esto:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

Buena respuesta, pero con este desafío, una simple coincidencia de expresiones regulares es en realidad bastante más corta. Aún así, +1 de mi parte.
Kevin Cruijssen

1
@KevinCruijssen Mi expresión regular es horrible, no pude hacerlo funcionar: D. Fingiré que quería ser original
Roberto Graham

@RobertoGraham "Pretenderé que quería ser original " Bueno, ciertamente lo es. :) Y también solía ser bastante malo en expresiones regulares, pero después de algunas otras respuestas aquí sobre PPCG usando expresiones regulares, me estoy acostumbrando más. Y ya había descubierto cómo combinar consonantes usando [a-z&&[^aeiouy]] una respuesta anterior mía . ;)
Kevin Cruijssen


2

Pyth , 18 bytes

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

Verifique todos los casos de prueba.

"Prestó" la expresión regular de la respuesta de JS . Esto vuelve Falsepara palabras fuertes, de lo Truecontrario


@KevinCruijssen De hecho, Pyth usa ISO-8859-1. Por eso no estoy convencido.
Sr. Xcoder

1
Userscript de @KevinCruijssen Downgoat me dice que es 13 bytes: 13 ISO-8859-1 bytes, 13 chars. Creo que debería estar bien
Sr. Xcoder

@KevinCruijssen Debería arreglarse ahora.
Sr. Xcoder

@KevinCruijssen No veo ninguna diferencia. ¿Qué código ves en mi respuesta y qué código ves en mi enlace de prueba?
Sr. Xcoder


2

Brachylog , 18 11 10 bytes

,Ḷs₂{¬∈Ẉ}ᵐ

Pruébalo en línea!

Limpio y simple (excepto tal vez por los 2 bytes iniciales adicionales para manejar el caso de la consonante final, como "periquito").

Es falsey para palabras fuertes y verdadero para palabras no fuertes.

,Ḷ               % 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 al darse cuenta de que puede ser tan simple como la respuesta JS de Arnauld .

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

Pruébalo en línea!



¿No necesitas asignar la lambda a algo? es decirf=lambda s...
OldBunny2800

@ OldBunny2800 no, a menos que esté utilizando la referencia dentro de su código (es aceptable crear una función sin nombre a la que se pueda acceder para reutilizarla con un código de encabezado o pie de página, aquí con f=\un encabezado).
Jonathan Allan

Creo que puede reemplazar su cadena de patrón '[^aeiouy]([^aeiouy]|$)'(24 bytes) con "[^aeiouy]("*2+")|$)"(21 bytes) para guardar 3 bytes, ya que el grupo vacío ()no cambia el comportamiento de búsqueda ( TIO ).
Jonathan Frech

@JonathanFrech Puede mejorar aún más
Sr. Xcoder

1

Perl 5, 31 bytes (30 + 1)

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

+1 byte for -p command line flag. Prints the word if it's a strong word, or the empty string if it is not.


"two distinct and consistent values"
L3viathan

@L3viathan Empty strings are falsy and non-empty strings are truthy. This is valid.
LyricLy

@L3viathan Perl's truthiness rules are actually very conducive to challenges like this. It's not the first time I've exploited that exact fact.
Silvio Mayolo

Con palabras terminadas en nueva línea, esto se puede acortar a $_=$/if/[^aeiouy]{2}/.
nwellnhof

1

Jalea , 11 bytes

e€ØY;1a2\¬Ȧ

Pruébalo en línea!

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

Sí, sé que Jonathan Allan me ha golpeado mucho, pero de todos modos quería compartir mi enfoque: P

-4 bytes al robar un poco de la respuesta de Jonathan Allan (en lugar de agregar una consonante para verificar el caso del borde de la última letra, solo agregue 1)
-1 byte gracias a millas


Puede guardar un byte usando cualquiera a2\o en Ȧ2Ƥlugar deṡ2Ȧ€
millas

@JonathanAllan facepalm deliberadamente me aseguré de usar ØCpara asegurarme de que Yyse contara como una consonante porque de alguna manera recordaba al revés. ¡Gracias!
HyperNeutrino

1

Awk, 39 bytes

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

imprime npara palabras no seguras, nada (o simplemente una nueva línea) para palabras fuertes

siguiendo el paquete y buscando dos no vocales consecutivas en minúsculas

pruebas

$ 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)}

Verdadero y falso se intercambian

Embellecido

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

Prueba

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

Basado en la respuesta de @ Arnauld


1

Retina, 23 18 bytes

$
$
1`[^aeiouy]{2}

Try it online! Outputs 0 for strong, 1 if not. Add 1 byte to support mixed case. Edit: Saved 5 bytes thanks to @ovs.


18 bytes by appending a consonant to the end.
ovs

1

Java 8, 53 42 bytes

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

-11 bytes by using the same regex as in @jrtapsell's Kotlin answer instead.

Try it here. (false if strong; true if not)

Explanation:

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)

So it basically checks if we can find two adjacent consonants, or if the String ends with a consonant.


Old answer (53 bytes):

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

Try it here. (true if strong; false if not)

Uses regex to see if the input-String matches the 'strong'-regex. Note that String#matches in Java automatically adds ^...$ to check if the String entirely matches the given regex.

Explanation":

 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)

A search instead of matches (like a lot of other answers use) is actually longer in Java:
70 bytes:

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

Try it here. (false if strong; true if not)



0

SOGL V0.12, 19 18 bytes

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

Try it Here!

Explanation:

æ                   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

Reads from standard input

Lua (loadstring'ed), 37 bytes

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

Reads from function parameter(s)


Input is lowercase

Sees if there is a string of length 2 or more, consisting only of not vowels (consonants) or if the string ends with a non-vowel

Returns true/false


0

C++, 195 194 bytes

-1 bytes thanks to Zacharý

Uppercase, return true if input is a strong word, false otherwise ( C++ have simple int to bool implicit cast rules, 0 => false, true otherwise )

#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);}

Code to test :

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
You can remove the space between return and !.
Zacharý

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;}

Returns 1 for strong word and 0 for weak word. Tested with the words given in the main post.



0

PHP, 69 bytes

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

Returns 1 is the word is not strong.


Welcome to PPCG! I believe you can remove spaces to cut some bytes, specifically /", str -> /",str and [1]))) return -> [1])))return but I don't know PHP too well so I can't be sure.
Stephen

Yes, good idea! Also it is possible to reduce bytes by assuming that input is always in uppercase.
Matias Villanueva

Oh, and if the regex is a standard regex engine, can't you do [B-Z]?
Stephen

@Stephen [B-Z] includes vowels. [^AEIOUY] works, though.
LyricLy

I don't know PHP either, but you could probably save more bytes by returning the result from the regex match directly, instead of wrapping it in an if statement.
LyricLy

0

CJam, 57 bytes

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

Try it online!


Reads input, converts to 1s for consonants, 0s for vowels. For every consonant, AND predefined variable X (predefined to 1) with next character's value. Output X

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.