Czy to mocne słowo?


33

Mówią, że hateto mocne słowo. Chciałem dowiedzieć się, dlaczego, więc dobrze się temu przyjrzałem.

Zauważyłem, że każda spółgłoska ma po sobie samogłoskę. To sprawiło, że wyglądało to dość mocno, więc zdecydowałem, że to właśnie sprawia, że ​​słowo jest mocne.

Chcę znaleźć mocniejsze słowa, więc potrzebuję do tego programu!

Znajdowanie mocnych słów

Silne słowa to słowa, w których po każdej spółgłosce (litery w zestawie BCDFGHJKLMNPQRSTVWXZ) następuje samogłoska (litery w zestawie AEIOUY). to jest to! Nie ma niczego ważniejszego.

Jeśli słowo zaczyna się od samogłoski, nie musisz się martwić o żadną z liter przed pierwszą spółgłoską. Jeśli słowo w ogóle nie ma spółgłosek, automatycznie jest silnym słowem!

Niektóre przykłady są mocnymi słowami agate, hatei you. agatejest wciąż mocnym słowem, ponieważ chociaż zaczyna się od samogłoski, po każdej spółgłosce występuje samogłoska. youto mocne słowo, ponieważ nie ma spółgłosek.

Mocne słowa nie mają ograniczenia długości.

Wyzwanie

Napisz program lub funkcję, która pobiera niepusty ciąg znaków jako dane wejściowe i wyświetla prawdziwą wartość, jeśli jest to mocne słowo lub wartość fałszowania, jeśli tak nie jest.

Wyjaśnienia

  • Możesz zdecydować się na wprowadzenie danych małymi lub dużymi literami. Określ w odpowiedzi.
  • Słowa nie będą zawierać żadnych znaków interpunkcyjnych. Będą zawierać tylko zwykłe litery w zestawie ABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Zamiast wartości prawdy i fałszu możesz wybrać dwie odrębne i spójne wartości, aby zwrócić wartość prawda i fałsz. Jeśli to zrobisz, podaj wartości wybrane w odpowiedzi.
    • Alternatywnie możesz podać wartość fałsz dla silnego słowa i prawdę dla niewystarczającego słowa.

Przypadki testowe

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

Punktacja

Ponieważ jest to , wygrywa odpowiedź z najmniejszą liczbą bajtów!



1
Czy puste słowo ""jest możliwym wejściem?
Silvio Mayolo,

@SilvioMayolo To nie jest.
LyricLy,

@LyricLy Jeśli dane wejściowe to „academy”, dane wyjściowe powinny być fałszywe, tak jak rozumiem problem. Ponieważ „m” jest spółgłoską.
Poszukiwanie prawdy,

1
„banan” jest pełen nienawiści
jstnthms,

Odpowiedzi:


18

JavaScript (ES6), 36 28 27 bajtów

Zapisano 1 bajt, odwracając wynik, jak sugeruje LarsW

Pobiera dane pisane małymi literami. Zwraca falseza mocne słowo i trueza słabe słowo.

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

W jaki sposób?

Dołączamy 0(nie-samogłoskę) na końcu łańcucha wejściowego i szukamy dwóch kolejnych znaków innych niż samogłoska. To pozwala nam objąć oba przypadki, w których słowo nie jest mocne:

  • zawiera dwie kolejne spółgłoski
  • lub kończy się spółgłoską

Przypadki testowe


+0Ale dlaczego ? Wydaje się, że bez niego działa dobrze
Matheus Avellar,

1
@MatheusAvellar Bez tego +0, zwracałby fałszywe alarmy na słowach kończących się na spółgłoskę.
Arnauld

Rozumiem, bez tego nie może znaleźć 2 kolejnych nie-samogłosek, jeśli jest to ostatnia litera słowa. Mądry!
Matheus Avellar

Powinieneś być w stanie pominąć !(dwie odrębne wartości)
LarsW,

@LarsW Dzięki! Nie zauważyłem tej zasady.
Arnauld,

10

Python 2 , 48 bajtów

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

Funkcja bez nazwy, która pobiera (małe) ciągi si zwraca, Falsejeśli jest mocna lub Truenie.

Wypróbuj online! (odwraca wyniki, aby pasowały do ​​PO)

W jaki sposób?

Słabe słowa mają albo spółgłoskę, po której następuje spółgłoska, albo kończą się spółgłoską.

Kod dodaje spółgłoskę do końca ( s+'b'), aby wymagany test był tylko dla dwóch spółgłosek z rzędu.

Sprawdza, czy każda litera w zmienionym słowie jest samogłoską ze zrozumieniem listy [v in'aeiouy'for v in s+'b'].

Musi teraz sprawdzić dwa Falsewyniki z rzędu (sygnalizując niewystarczające słowo), robi to poprzez uzyskanie reprezentacji ciągu (za pomocą `...`) tej listy i szukanie istnienia 'se, F'. Jest to najkrótszy ciąg znaleziony w, 'False, False'ale żaden z 'True, True':; 'False, True'; lub 'True, False'.

Jako przykład rozważ 'nut', lista zrozumieniem ocenia każdą list v, z 'nutb'istnienia w 'aeiouy'wyniku czego otrzymuje listę [False, True, False, False], reprezentacja ciąg tej liście jest '[False, True, False, False]'który zawiera 'e, F'tutaj: '[False, True, Fals>>e, F<<alse]'stąd funkcja zwróci Trueten sposób, że nakrętka nie mocne słowo.


7

Galaretka ,  10  9 bajtów

e€ØY;Ạ11ẇ

Monadyczny link zawierający listę znaków i zwracający:

  • 0 jeśli silny
  • 1 Jeśli nie

Wypróbuj online! lub zobacz zestaw testowy .

W jaki sposób?

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]

Uwaga: Powodem użycia jest po prostu zaoszczędzić bajt za pomocą 1(ponieważ chcemy od 11razu użyć ).


hmm, spójne wartości ...
Erik the Outgolfer,

co masz na myśli?
Jonathan Allan,

hacky w twoim kodzie ... inaczej mógłbyś to zrobić e€ØY;1w11lub coś
Erik the Outgolfer

Dlaczego jedenaście? Wydaje się, że słowa łańcuchowe nie były w żaden sposób powiązane z liczbą jedenastą
hyiltiz

@hyiltiz, gdy diad ma lewy argument, który jest liczbą, zostaje domyślnie przekonwertowany na dziesiętną listę cyfr, więc jedenaście staje się [1,1].
Jonathan Allan

5

05AB1E , 8 bajtów

Kod

žPS¡¦õÊP

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie

ž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

Przykład

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

Może czegoś mi brakuje, ale wydaje się, że zawsze zwraca 1? Zwraca 1 zarówno dla prawdziwych przypadków, które próbowałem, jak i dla testów falsey.
Sundar - Przywróć Monikę

(Och, właśnie zauważyłem, ile lat ma ta odpowiedź (i pytanie). Chyba coś w tym języku zmieniło się w międzyczasie?)
Sundar - Przywróć Monikę

@sundar Yes nice catch! Wygląda na to, że w pewnym momencie złamałem funkcję podziału. Naprawię to jak najszybciej.
Adnan,

5

R , 43 bajty

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

Wypróbuj online!

Port odpowiedzi JavaScript na Arnauld; zwraca 1 dla słabych słów i integer(0)dla mocnych; dołącza (spację) na końcu ciągu.

To jest wektoryzowane; z wektorem ciągów zwraca indeksy (1) słabych słów.


Ten sam komentarz tutaj, nie możesz użyć $ w wyrażeniu regularnym zamiast dodawać spację?
Charlie,

@Charlie Nie jestem pewien, jak zamierzasz używać $, czy chcesz to wyjaśnić dalej?
Giuseppe,

Bardzo podoba mi się to rozwiązanie. Myślę, że logika jest jaśniejsza (i bajty to samo) paste0(s,0), ale to tylko sprzeczka. Myślę, że @Charlie odnosi się do czegoś takiego: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401 10.08.18

3

Dyalog APL, 20 bajtów

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

Wypróbuj online!


3
Nie sądzę, że potrzebujesz ⎕←.
Zacharý

@ Zacharý Zwykłem tego nie mówić, ale później (jak sądzę Dennis) powiedział mi, że program nie powinien zakładać, że będzie działał w REPL.
Oberon,

W jakim języku ci to powiedział? Czy to było dla Dyalog APL? Wiem, że polityka zdecydowanie dotyczy Python / JavaScript / etc.
Zacharý

3

Haskell , 61 54 bajtów

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

Wypróbuj online!

Musiałem dodać zna końcu łańcucha, aby obsłużyć przypadek końcowej spółgłoski.


2

Java (OpenJDK 8) , 93 81 bajtów

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

Wypróbuj online!


Obawiam wartości logiczne nie są odpowiedzią: 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
Możesz to zrobić nawet:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

Dobra odpowiedź, ale przy tym wyzwaniu proste dopasowanie wyrażenia regularnego jest w rzeczywistości nieco krótsze. Mimo to +1 ode mnie.
Kevin Cruijssen

1
@KevinCruijssen Mój regex jest okropny, nie mogłem go uruchomić: D. Udam, że chciałem być oryginalny
Roberto Graham,

@RobertoGraham „ Udam, że chciałem być oryginalny ” Cóż, z pewnością tak jest. :) Byłem też dość zły w wyrażeniach regularnych, ale po kilku innych odpowiedziach na PPCG za pomocą wyrażeń regularnych przyzwyczajam się do tego. I już nauczyłem się, jak dopasowywać spółgłoski, używając [a-z&&[^aeiouy]] poprzedniej mojej odpowiedzi . ;)
Kevin Cruijssen


2

Pyth , 18 bajtów

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

Sprawdź wszystkie przypadki testowe.

„Pożyczono” wyrażenie regularne z odpowiedzi JS . To zwraca Falsemocne słowa, w Trueprzeciwnym razie


@KevinCruijssen W rzeczywistości Pyth używa ISO-8859-1. Dlatego nie jestem przekonany.
Pan Xcoder,

1
Userscript @KevinCruijssen Downgoat opowiada mi, że ma 13 bajtów: 13 ISO-8859-1 bytes, 13 chars. Myślę, że to powinno być w porządku
Pan Xcoder,

@KevinCruijssen Powinien zostać teraz naprawiony.
Pan Xcoder,

@KevinCruijssen Nie widzę żadnej różnicy. Co to jest kod widzisz w mojej odpowiedzi i jaki kod widzisz w moim linku testowym?
Pan Xcoder,


2

Brachylog , 18 11 10 bajtów

,Ḷs₂{¬∈Ẉ}ᵐ

Wypróbuj online!

Schludny i prosty (z wyjątkiem może 2 dodatkowych bajtów początkowych do obsługi końcowego przypadku spółgłoski, takich jak „papuga długoogonowa”).

Jest falsey dla mocnych słów i prawdę dla słabych słów.

,Ḷ               % 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 bajtów

-30 bajtów, wiedząc, że może być tak proste, jak odpowiedź JS Arnaulda .

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

Wypróbuj online!


Zaoszczędź 6 bajtów, robiąc to samo co Arnauld
L3viathan

Nie musisz do czegoś przypisywać lambda? tj.f=lambda s...
OldBunny2800

@ OldBunny2800 nie, chyba że używasz odwołania w kodzie (dopuszczalne jest utworzenie nienazwanej funkcji, do której można uzyskać dostęp w celu ponownego użycia z kodem nagłówka lub stopki - tutaj z f=\nagłówkiem).
Jonathan Allan

Myślę, że możesz zastąpić ciąg wzorca '[^aeiouy]([^aeiouy]|$)'(24 bajty) "[^aeiouy]("*2+")|$)"(21 bajtów), aby zapisać 3 bajty, ponieważ pusta grupa ()nie zmienia zachowania wyszukiwania ( TIO ).
Jonathan Frech,

@JonathanFrech Może być jeszcze lepiej
Mr. Xcoder

1

Perl 5, 31 bajtów (30 + 1)

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

+1 bajt dla -pflagi wiersza poleceń. Drukuje słowo, jeśli jest to mocne słowo, lub pusty ciąg, jeśli nie jest.


„dwie odrębne i spójne wartości”
L3viathan

@ L3viathan Puste łańcuchy są fałszem, a niepuste łańcuchy są zgodne z prawdą. To jest poprawne.
LyricLy,

@ Zasady prawdziwości L3viathana Perla w rzeczywistości bardzo sprzyjają takim wyzwaniom. Nie po raz pierwszy wykorzystałem ten fakt.
Silvio Mayolo,

W przypadku słów zakończonych znakiem nowej linii można to skrócić $_=$/if/[^aeiouy]{2}/.
nwellnhof,

1

Galaretka , 11 bajtów

e€ØY;1a2\¬Ȧ

Wypróbuj 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

Tak, wiem, że zostałem bardzo pobity przez Jonathana Allana, ale i tak chciałem się podzielić moim podejściem: P.

-4 bajty poprzez kradzież odrobiny odpowiedzi Jonathana Allana (zamiast dodawać spółgłoskę w celu sprawdzenia, czy wielkość liter na ostatniej liście jest dołączona, wystarczy dołączyć 1)
-1 bajt dzięki milom


Możesz zapisać bajt, używając jednego a2\lub Ȧ2Ƥzamiastṡ2Ȧ€
mil

@ JonathanAllan facepalm Celowo postanowiłem użyć, ØCaby upewnić Yysię, że zostałem zaliczony do spółgłoski, ponieważ jakoś pamiętałem wstecz. Dzięki!
HyperNeutrino,

1

Awk, 39 bajtów

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

drukuje ndla nie-silnego słowa, nic (lub po prostu nowa linia) dla silnego słowa

śledzenie paczki i poszukiwanie dwóch kolejnych nie-samogłosek na małych literach

testowanie

$ 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 bajtów

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

Prawda i fałsz są zamieniane

Upiększony

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

Test

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

Na podstawie @ Arnauld za Odpowiedź



1

Java 8, 53 42 bajty

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

-11 bajtów przy użyciu tego samego wyrażenia regularnego, co w odpowiedzi Kotlin @jrtapsell .

Wypróbuj tutaj. ( falsejeśli silny; truejeśli nie)

Wyjaśnienie:

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)

Więc w zasadzie sprawdza, czy możemy znaleźć dwie sąsiadujące spółgłoski, czy też Łańcuch kończy się spółgłoską.


Stara odpowiedź ( 53 bajty ):

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

Wypróbuj tutaj. ( truejeśli silny; falsejeśli nie)

Używa wyrażenia regularnego, aby sprawdzić, czy ciąg wejściowy pasuje do wyrażenia regularnego „strong”. Zauważ, że String#matchesw Javie automatycznie dodaje, ^...$aby sprawdzić, czy Łańcuch całkowicie pasuje do podanego wyrażenia regularnego.

Wyjaśnienie":

 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)

Wyszukiwanie zamiast dopasowań (jak w przypadku wielu innych odpowiedzi) jest w rzeczywistości dłuższe w Javie:
70 bajtów :

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

Wypróbuj tutaj. ( falsejeśli silny; truejeśli nie)



0

SOGL V0.12 , 19 18 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

æ                   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 bajtów

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

Odczytuje ze standardowego wejścia

Lua (loadstring'ed), 37 bajtów

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

Odczytuje z parametrów funkcji


Dane są pisane małymi literami

Sprawdza, czy istnieje łańcuch o długości 2 lub większej, składający się tylko z samogłosek (nie spółgłosek) lub łańcuch ten kończy się samogłoską

Zwraca true / false


0

C ++, 195 194 bajtów

-1 bajty dzięki Zacharýowi

Wielkie litery, zwróć true, jeśli dane wejściowe są silnym słowem, false w przeciwnym razie (C ++ mają proste int do boolowania niejawne reguły rzutowania, 0 => false, true w przeciwnym razie)

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

Kod do przetestowania:

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
Możesz usunąć spację między returni !.
Zacharý

0

C, 107 bajtów

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

Zwraca 1 dla silnego słowa i 0 dla słabego słowa. Testowany ze słowami podanymi w głównym poście.



0

PHP, 69 bajtów

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

Zwraca 1 to słowo nie jest mocne.


Witamy w PPCG! Wierzę, że możesz usunąć spacje, aby wyciąć niektóre bajty, w szczególności /", str-> /",stri [1]))) return->, [1])))returnale nie znam zbyt dobrze PHP, więc nie jestem pewien.
Stephen

Tak, dobry pomysł! Możliwe jest również zmniejszenie bajtów, zakładając, że dane wejściowe są zawsze pisane wielkimi literami.
Matias Villanueva

Aha, a jeśli regex jest standardowym silnikiem regex, nie możesz tego zrobić [B-Z]?
Stephen

@Stephen [B-Z]obejmuje samogłoski. [^AEIOUY]działa jednak.
LyricLy

Nie znam też PHP, ale prawdopodobnie możesz zaoszczędzić więcej bajtów, zwracając bezpośrednio wynik dopasowania wyrażenia regularnego, zamiast zawijać go w ifinstrukcji.
LyricLy

0

CJam , 57 bajtów

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

Wypróbuj online!


Odczytuje dane wejściowe, konwertuje na 1s dla spółgłosek, 0s dla samogłosek. Dla każdej spółgłoski ORAZ predefiniowana zmienna X (predefiniowana do 1) z wartością następnego znaku. Wyjście X

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.