Güçlü bir kelime mi?


33

Bunun hategüçlü bir kelime olduğunu söylüyorlar . Nedenini bulmak istedim, bu yüzden kelimeye iyi baktım.

Her ünsüzün ondan sonra ünlü olduğu dikkatimi çekti. Bu bana oldukça güçlü görünmesini sağladı, ben de bir kelimeyi güçlü yapan şeyin bu olduğuna karar verdim.

Daha güçlü kelimeler bulmak istiyorum, bu yüzden bunun için bir programa ihtiyacım olacak!

Güçlü kelimeler bulmak

Güçlü kelimeler her ünsüzün (setteki harflerin BCDFGHJKLMNPQRSTVWXZ) bir sesli harfle ( setin içindeki harfler) geldiği sözcüklerdir AEIOUY. Bu kadar. Nothing Else Matters.

Sözcük bir sesli harfle başlarsa, ilk ünsüzden önceki harflerden herhangi biri için endişelenmenize gerek yoktur. Kelimede hiç ünsüz yoksa, otomatik olarak güçlü bir kelimedir!

Güçlü kelimelerin bazı örnekler şunlardır agate, hateve you. agatehala güçlü bir kelime çünkü sesli harfle başlasa da, her ünsüz harfini hala sesli harfle takip ediyor. yougüçlü bir kelime çünkü ünsüzleri yok.

Güçlü kelimeler için uzunluk konusunda herhangi bir kısıtlama yoktur.

Meydan okuma

Boş olmayan bir dizeyi giriş olarak alan bir program veya işlev yazın ve eğer güçlü bir kelime ise yanlış bir değer veya eğer değilse sahte bir değer verir.

Açıklamalar

  • Girişi küçük harfli veya büyük harfli almaya karar verebilirsiniz. Cevabınızda hangisini belirtin.
  • Kelimeler hiçbir şekilde noktalama işareti içermez. Sette sadece düz harfler bulunur ABCDEFGHIJKLMNOPQRSTUVWXYZ.
  • Gerçeği ve sahte değerleri yerine, doğru ve yanlış için geri dönmek için iki farklı ve tutarlı değer seçebilirsiniz. Bunu yaparsanız, cevabınızda seçtiğiniz değerleri belirtin.
    • Alternatif olarak, güçlü bir kelime için sahte bir değer ve güçlü olmayan bir kelime için bir gerçeğe uygun değer yazdırabilirsiniz.

Test durumları

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

puanlama

Bu , en az bayt olan cevap kazanır!



1
Boş kelime ""olası bir giriş mi?
Silvio Mayolo

@ SilvioMayolo Öyle değil.
LyricLy

@LyricLy Eğer girdi "akademi" ise, sorunu anlama biçimim yanlış olmalıdır. Çünkü 'm' bir ünsüzdür.
Gerçek

1
bir "muz" nefret dolu
jstnthms 11:17

Yanıtlar:


18

JavaScript (ES6), 36 28 27 bayt

LarsW tarafından önerildiği gibi sonucu ters çevirerek 1 bayt kurtarıldı

Küçük harflerle giriş yapar. İade falsegüçlü kelime için ve trueolmayan güçlü kelime için.

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

Nasıl?

Biz eklemek 0iki ardışık olmayan sesli karakterler için giriş dizesi ve görünüm sonunda (non-sesli harf). Bu, bir kelimeyi güçlü olmayan her iki vakayı da kapatmamızı sağlar:

  • iki ardışık ünsüz içerir
  • veya bir ünsüzle biter

Test durumları


Neden +0olsa? Onsuz iyi çalışıyor gibi görünüyor
Matheus Avellar

1
@MatheusAvellar Olmadan, bir ünsüzle +0biten kelimelerde yanlış pozitifler verirdi.
Arnauld,

Görüyorum ki, bu olmadan kelimenin son harfi ise ardışık 2 sesli harf bulamaz. Akıllı!
Matheus Avellar

!(İki farklı değeri) ihmal edebilmelisiniz
LarsW

@LarsW Teşekkürler! Bu kuralı fark etmedim.
Arnauld

10

Python 2,48 bayt

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

(Küçük harf) bir dize alan sve Falsegüçlü olduğunda veya Truedeğilse döndüren adsız bir işlev .

Çevrimiçi deneyin! (OP ile eşleşecek sonuçları ters çevirir)

Nasıl?

Güçlü olmayan kelimeler, bir ünsüzün ardından bir ünsüz veya sonunun bir ünsüz ile bitmesidir.

Kod s+'b', gerekli testi üst üste iki ünsüz için yapmak için sonuna ( ) bir ünsüz ekler .

Değiştirilen kelimedeki her bir harfin, listeyi anlayan bir sesli harf olup olmadığını tespit eder [v in'aeiouy'for v in s+'b'].

Şimdi False, bir satırdaki (güçlü olmayan bir kelimeyi işaret eden) iki sonucu kontrol etmesi gerekiyor `...`, bu listeyi bir dize temsili alarak (kullanarak ) ve varlığını arayarak yapıyor 'se, F'. Bu, içinde bulunan en kısa dizedir 'False, False'ancak hiçbiri 'True, True':; 'False, True'; veya 'True, False'.

Bir örnek düşünürken 'nut', liste anlama her harfi değerlendirir vait 'nutb'varolma 'aeiouy'listesini veren [False, True, False, False], bu listenin dize temsilidir '[False, True, False, False]'içeren 'e, F'burada: '[False, True, Fals>>e, F<<alse]'dolayısıyla işlevini verir Trueo somunu anlamı olduğunu değil güçlü bir kelime.


7

Jöle ,  10  9 bayt

e€ØY;Ạ11ẇ

Bir karakter listesi alarak ve dönen bir monadik bağlantı:

  • 0 eğer güçlü
  • 1 eğer değilse

Çevrimiçi deneyin! veya test odasına bakın .

Nasıl?

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]

Not: Kullanmanın nedeni sadece kullanmadan önce bir bayt tasarrufu yapmaktır 1(o zamandan beri hemen kullanmak istiyoruz 11).


hmm, tutarlı değerler ...
Outgolfer Erik

ne demek istiyorsun?
Jonathan Allan

hacky Kodunuzdaki şey ... aksi takdirde yapmış olabilir e€ØY;1w11ya da bir şey
Erik Outgolfer

Neden onbir? Dize kelimeler herhangi bir şekilde numaraya onbir bağlı olması görünmüyordu
hyiltiz

@diltiz, dyad , örtülü bir şekilde bir ondalık basamak listesine dönüştürülen bir sayı olan sol argümana sahip olduğunda, on bir olur [1,1].
Jonathan Allan

5

05AB1E , 8 bayt

kod

žPS¡¦õÊP

05AB1E kodlamasını kullanır .Çevrimiçi deneyin!

açıklama

ž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

Örnek

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

Belki bir şey eksik, ama bu her zaman 1 dönüyor gibi görünüyor? Hem denediğim hem de falsey testisleri için 1 döner.
sundar - Monica,

(Ah, az önce bu cevabın (ve sorunun) ne kadar eski olduğunu fark ettim. Sanırım bu arada dilde bir şey değişti mi?)
sundar - Monica

@ sundar Evet güzel yakalayış! Bir noktada split fonksiyonunu kırdım. Bunu mümkün olan en kısa sürede düzelteceğim.
Adnan

5

R , 43 bayt

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

Çevrimiçi deneyin!

Arnauld'un JavaScript cevabının bir limanı; zayıf kelimeler ve integer(0)güçlü kelimeler için 1 döndürür ; dizenin sonuna bir boşluk ekler .

Bu aslında vectorized; dizgelerin bir vektörüyle, zayıf kelimelerin indekslerini (1 tabanlı) döndürür.


Buradaki aynı yorum, boşluk eklemek yerine regex'te $ kullanamazsınız?
Charlie

@Charlie Nasıl kullanmayı düşündüğünüzden emin değilim $, bunu daha fazla açıklamak ister misiniz?
Giuseppe,

Bu çözümü çok beğendim. Bence mantık daha temiz (ve aynı şekilde bayt) paste0(s,0), ama bu sadece titriyor. Sanırım @Charlie şunun gibi bir şeye gönderme yapıyor: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL, 20 bayt

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

Çevrimiçi deneyin!


3
İhtiyacın olduğunu sanmıyorum ⎕←.
Zacharý

@ Zacharý koymak için kullanmam, ancak daha sonra (Dennis tarafından inanıyorum) bir programın bir REPL'de çalıştırıldığını varsaymaması gerektiği söylendi.
Oberon

Sana hangi dili anlattı? Dyalog APL için miydi? Politikanın Python / JavaScript / etc için kesinlikle geçerli olduğunu biliyorum.
Zacharý


2

Java (OpenJDK 8) , 93 81 bayt

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

Çevrimiçi deneyin!


Korkarım mantıksal ifadenin cevap değildir değilim: 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
Veya bunu bile yapabilirsiniz:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

Güzel cevap, ancak bu zorluk ile basit bir regex eşleştirme aslında biraz daha kısa. Yine de benden +1.
Kevin Cruijssen

1
@KevinCruijssen Regex'im berbat, işe yaramadı: D. Orjinal olmak istediğimi iddia edeceğim
Roberto Graham

@RobertoGraham " Orjinal olmak istediğimi iddia edeceğim " peki, kesinlikle öyle. :) Ve regex'te de oldukça kötüydüm, ama burada PPCG'de regex kullanarak çok az başka cevaplar verdikten sonra alıyorum. Ve [a-z&&[^aeiouy]] daha önceki cevabımı kullanarak ünsüzleri nasıl eşleştireceğimi çoktan anladım . ;)
Kevin Cruijssen


2

Pyth , 18 bayt

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

Tüm test durumlarını doğrulayın.

JS cevap regex "Ödünç" . Bu False, güçlü kelimeler için döner , Trueaksi takdirde


@KevinCruijssen Aslında, Pyth ISO-8859-1'i kullanıyor. Bu yüzden ikna olmadım.
Bay Xcoder

1
@KevinCruijssen Downgoat en userscript o 13 bayt olduğunu söylüyor: 13 ISO-8859-1 bytes, 13 chars. Bunun iyi olması gerektiğini düşünüyorum
Bay Xcoder

@KevinCruijssen Şimdi düzeltilmeli.
Bay Xcoder

@KevinCruijssen Farketmiyorum. Cevabımda kod nedir ve test bağlantımda hangi kodu görüyorsunuz?
Bay Xcoder


2

Brachylog , 18 11 10 bayt

,Ḷs₂{¬∈Ẉ}ᵐ

Çevrimiçi deneyin!

Düzgün ve basit (belki de "muhabbet kuşu" gibi son ünsüz olayla başa çıkmak için 2 ekstra ilk bayt hariç).

Güçlü sözler için falsey ve güçlü olmayan sözler için hakikaten.

,Ḷ               % 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 bayt

-30 byte, Arnauld'un JS cevabı kadar basit olabilir .

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

Çevrimiçi deneyin!



Lambda'yı bir şeye atamanıza gerek yok mu? ief=lambda s...
OldBunny2800

@ OldBunny2800, referansı kodunuz içinde kullanmıyorsanız (bir başlıkta ya da alt kodla tekrar kullanmak için erişebileceğiniz adsız bir işlev oluşturmak kabul edilebilir f=\).
Jonathan Allan

Boş grup olarak, arama davranışını ( TIO ) değiştirmeyen 3 bayt'ı kaydetmek için desen dizenizi '[^aeiouy]([^aeiouy]|$)'(24 bayt) "[^aeiouy]("*2+")|$)"(21 bayt) ile ()değiştirebileceğinizi düşünüyorum .
Jonathan Frech

@JonathanFrech Daha da iyi olabilir
Bay Xcoder 10:17

1

Perl 5, 31 bayt (30 + 1)

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

-pKomut satırı bayrağı için +1 bayt . Güçlü bir kelime ise sözcüğü, değilse ise boş dize yazdırır.


"iki farklı ve tutarlı değer"
L3viathan

@ L3viathan Boş dizgiler sahte, boş olmayan dizgiler ise sıra dışıdır. Bu geçerlidir.
LyricLy

@ L3viathan Perl'in doğruluk kuralları aslında bu gibi zorluklara karşı çok elverişli. Bu kesin gerçeği ilk defa kullanmam.
Silvio Mayolo

Newline ile sonlanan kelimelerle, bu kısaltılabilir $_=$/if/[^aeiouy]{2}/.
nwellnhof

1

Jöle , 11 bayt

e€ØY;1a2\¬Ȧ

Çevrimiçi deneyin!

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

Evet, Jonathan Allan tarafından çok dövüldüğümü biliyorum ama yine de yaklaşımımı paylaşmak istedim: P

Küçük bir miktar Jonathan Allan'ın cevabını çalarak -4 bayt (son harf kenar vakasını kontrol etmek için bir ünsüz eklemek yerine, sadece 1 ekleyin)
miller sayesinde -1 bayt


Ya kullanarak bir bayt kaydedebilir a2\veya Ȧ2Ƥyerineṡ2Ȧ€
mil

@JonathanAllan facepalm Kasten bir ünsüz sayıldığından ØCemin olmak için kullanmaya emin Yyoldum çünkü bir şekilde geriye hatırladım. Teşekkürler!
HyperNeutrino

1

Awk, 39 bayt

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

güçlü nolmayan sözcük için yazdırır , güçlü olmayan sözcük için hiçbir şey (veya yalnızca yeni bir satır)

paketi takip etmek ve küçük harfli girişte ardışık iki sesli harf aramak

test yapmak

$ 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 bayt

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

Doğru ve yanlış değiştirildi

Beautified

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

Ölçek

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

Dayanarak Arnauld en @ Yanıt


1

Retina , 23 18 bayt

$
$
1`[^aeiouy]{2}

Çevrimiçi deneyin! Güçlü için 0 çıkış, eğer değilse 1. Karışık durumda desteklemek için 1 bayt ekleyin. Düzenleme: @ovs sayesinde 5 bayt kaydedildi.


18 bayt sonuna kadar bir ünsüz ekleyerek.
ovs

1

Java 8, 53 42 bayt

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

-11 bayt yerine , jgetapsell'in Kotlin cevabındaki gibi aynı regex kullanarak .

Burada dene. ( falseeğer güçlüyse; truedeğilse)

Açıklama:

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)

Bu yüzden temel olarak iki bitişik ünsüz bulup bulamayacağımızı veya String'in bir ünsüzle bitip bitmediğini kontrol eder.


Eski cevap ( 53 bayt ):

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

Burada dene. ( trueeğer güçlüyse; falsedeğilse)

Girdi dizgesinin 'strong'-regex ile eşleşip eşleşmediğini görmek için regex kullanır. String#matchesJava’da ^...$, Dize’nin verilen regex ile tamamen aynı olup olmadığını kontrol etmek için otomatik olarak ekleyeceğini unutmayın .

Açıklama ":

 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)

Eşleşmeler yerine bir arama (diğer pek çok yanıtın kullandığı gibi) aslında Java'da daha uzun:
70 bayt :

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

Burada dene. ( falseeğer güçlüyse; truedeğilse)



0

SOGL V0.12 , 19 18 bayt

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

Burada dene!

Açıklama:

æ                   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 bayt

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

Standart girdiden okur

Lua (yük taşıma), 37 bayt

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

İşlev parametrelerinden okur


Giriş küçük harf

Yalnızca ünlü olmayan harflerden (ünsüzler) oluşan bir dizi 2 veya daha fazla bir dizi varsa veya dize sesli olmayan bir harfle bitiyorsa

Doğru / yanlış döndürür


0

C ++, 195 194 bayt

Zacharý sayesinde -1 bayt

Büyük harf, eğer giriş güçlü bir kelime ise doğru, aksi takdirde false (C ++, örtük döküm kurallarını dışlamak için basit bir int'ye sahiptir, 0 => yanlış, doğru ise)

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

Test edilecek kod:

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
returnVe arasındaki boşluğu kaldırabilirsiniz !.
Zacharý

0

C, 107 Bayt

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

Güçlü kelime için 1, zayıf kelime için 0 döndürür . Ana yazıda verilen kelimelerle test edilmiştir.



0

PHP, 69 bayt

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

1 döndürür kelime güçlü değil.


PPCG'ye Hoşgeldiniz! Bazı baytları kesmek için boşluk kaldıracağınıza inanıyorum, özellikle /", str-> /",strve [1]))) return-> [1])))returnfakat PHP'yi çok iyi tanımıyorum, bu yüzden emin olamıyorum.
Stephen

Evet güzel fikir! Ayrıca, girişin her zaman büyük harf olduğu varsayılarak baytları azaltmak da mümkündür.
Matias Villanueva

Oh, eğer regex standart bir regex motoru ise, yapamaz mısın [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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.