这是一个很强的词吗?


33

他们说这hate是一个有力的词。我想找出原因,因此很好地了解了这个词。

我注意到每个辅音后面都有一个元音。这使它看起来对我来说很坚强,所以我认为这就是使一个词更坚强的原因。

我想找到更强的词,因此需要一个程序!

寻找强词

强词是每个辅音(集合中的字母BCDFGHJKLMNPQRSTVWXZ)后跟元音(集合中的字母AEIOUY)的单词。而已。别的都无所谓。

如果单词以元音开头,则不必担心第一个辅音之前的任何字母。如果这个词根本没有辅音,那么它就自动成为一个强词!

强话的一些例子是agatehateyouagate仍然是一个很强的词,因为尽管它以元音开头,但每个辅音仍然跟着元音。you这个词很强大,因为它没有辅音。

强词的长度没有限制。

挑战

编写一个程序或函数,该程序或函数将非空字符串作为输入,如果它是一个强词,则输出一个真实值,否则,则输出一个虚假值。

澄清说明

  • 您可以决定采用小写或大写形式输入。指定答案中的哪个。
  • 单词将不包含任何标点符号。它们只包含纯字母ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • 您可以选择两个不同且一致的值来代替true和false,以返回true和false。如果这样做,请指定您在答案中选择的值。
    • 您也可以为强词输出假值,为非强词输出真值。

测试用例

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

计分

由于这是,因此,字节数最少的答案会获胜!



1
空词""可能是输入吗?
西尔维奥·梅奥洛

@SilvioMayolo不是。
LyricLy

@LyricLy如果输入是“ academy”,则输出应该为假,这是我理解问题的方式。因为“ m”是辅音。
寻求真相

1
“香蕉”充满仇恨
jstnthms

Answers:


18

JavaScript(ES6),36 28 27字节

根据LarsW的建议,通过反转结果节省了1个字节

以小写形式输入。返回false一个强词和true一个非强词。

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

怎么样?

我们0在输入字符串的末尾附加一个(非元音),并查找两个连续的非元音字符。这使我们能够涵盖使单词强的两种情况:

  • 它包含两个连续的辅音
  • 以辅音结尾

测试用例


为什么+0呢?如果没有它,它似乎可以很好地工作
Matheus Avellar

1
@MatheusAvellar如果不使用+0,它将返回以辅音结尾的单词的误报。
Arnauld

我知道,没有它,如果它是单词的最后一个字母,将找不到两个连续的非元音。聪明!
Matheus Avellar'9

您应该能够忽略!(两个不同的值)
LarsW

@LarsW谢谢!我没有注意到这条规则。
Arnauld

10

Python 2,48个字节

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

一个未命名的函数,使用(小写)字符串,如果强或不强则s返回。FalseTrue

在线尝试!(反转结果以匹配OP)

怎么样?

非强词有辅音后跟辅音或以辅音结尾。

该代码在结尾(s+'b')处添加了一个辅音,以使所需的测试仅适用于连续两个辅音。

它找出改变的单词中的每个字母是否是具有列表理解的元音[v in'aeiouy'for v in s+'b']

现在,它需要False连续检查两个结果(表示一个非强词),方法是获取(使用`...`)此列表的字符串表示形式并查找是否存在'se, F'。这是在最短的字符串中找到'False, False',但没有的:'True, True'; 'False, True'; 或'True, False'

例如,考虑'nut',列表理解评估每个信v中,'nutb'对存在'aeiouy'产生列表[False, True, False, False],该列表的字符串表示是'[False, True, False, False]'包含'e, F'在这里:'[False, True, Fals>>e, F<<alse]'因此函数返回True意味着螺母是不是一个强字。


7

果冻 10  9 字节

e€ØY;Ạ11ẇ

单字链接,其中包含字符列表并返回:

  • 0 如果强
  • 1 如果不

在线尝试!或查看测试套件

怎么样?

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]

注意:使用的原因只是为了节省使用空间1(因为我们随后要立即使用11)。


嗯,一贯的价值观……
Erik the Outgolfer

你什么意思?
乔纳森·艾伦,

在哈克在你的代码的事情......否则你做了e€ØY;1w11什么
埃里克Outgolfer

为什么是十一?字符串似乎并没有以任何方式与数字11绑定
hyiltiz

@hyiltiz,当dyad 的左参数为数字时,它隐式转换为十进制数字列表,因此11变为[1,1]
乔纳森·艾伦,

5

05AB1E,8个字节

žPS¡¦õÊP

使用05AB1E编码。在线尝试!

说明

ž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

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

也许我缺少了一些东西,但这似乎总是返回1?对于我尝试过的真实案例和虚假测试案例,它都返回1。
sundar-恢复莫妮卡

(哦,我刚刚注意到这个答案(和问题)有多大了。我想与此同时语言已经有所变化?)
sundar-恢复莫妮卡

@sundar是的,不错!看来我在某些时候中断了split功能。我会尽快解决。
阿德南(Adnan)'18

5

R,43个字节

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

在线尝试!

Arnauld的JavaScript答案端口;对于弱词和integer(0)强词返回1 ;它在字符串的末尾附加一个(空格)。

这实际上是矢量化的;使用字符串向量,它返回弱词的索引(从1开始)。


同样的评论,您不能在正则表达式中使用$而不是添加空格吗?
查理

@Charlie我不确定您打算如何使用$,是否愿意进一步说明?
朱塞佩

很喜欢这种解决方案。我认为的逻辑更清晰(且字节相同)paste0(s,0),但这只是令人困惑。我认为@Charlie引用的是这样的内容: grep("[^aeiouy]([^aeiouy]|$)",s)
user5957401

3

Dyalog APL,20个字节

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

在线尝试!


3
我认为您不需要⎕←
扎卡里

@Zacharý我以前不放它,但后来(我相信,Dennis告诉我)一个程序不应假定在REPL中运行。
Oberon

他告诉你什么语言?是Dyalog APL吗?我知道该政策肯定适用于Python / JavaScript / etc。
扎卡里


2

Java(OpenJDK 8)93 81字节

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

在线尝试!


恐怕布尔值不是答案: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;}
雅各布

1
或者,您甚至可以执行以下操作:s->{int w=0,p=w,l;for(char c:s)w|=p&(p=l="aeiouy".indexOf(c)>>31);return w+p>=0;}
Jakob

好的答案,但是面对这个挑战,简单的正则表达式匹配实际上要短得多。不过,我还是+1。
凯文·克鲁伊森

1
@KevinCruijssen我的正则表达式很糟糕,无法正常使用:D。我会假装自己想成为原始人
罗伯托·格雷厄姆

@RobertoGraham“ 我会假装我想成为原创人 ”嗯,当然是。:)而且我过去对正则表达式也很不满意,但是在使用正则表达式对PPCG进行了许多其他回答之后,我已经习惯了。在我[a-z&&[^aeiouy]] 以前的回答中,我已经想出了如何匹配辅音的方法。;)
Kevin Cruijssen


2

Pyth,18个字节

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

验证所有测试用例。

JS答案中 “借用”正则表达式。这将返回False强词,True否则


@KevinCruijssen实际上,Pyth使用ISO-8859-1。这就是为什么我不相信。
Xcoder先生17年

1
@KevinCruijssen Downgoat的用户脚本告诉我,它是13个字节:13 ISO-8859-1 bytes, 13 chars。我认为应该没问题
Xcoder先生,2017年

@KevinCruijssen应该现在修复。
Xcoder先生17年

@KevinCruijssen我看不出任何区别。您在答案中看到的是什么代码,在测试链接中看到的是什么代码?
Xcoder先生17年


2

Brachylog18 11 10字节

,Ḷs₂{¬∈Ẉ}ᵐ

在线尝试!

整洁而简单(可能还有2个额外的初始字节来处理最终的辅音情况,例如“ parakeet”)。

强壮的单词为假,非强壮的单词为真。

,Ḷ               % 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字节

通过意识到它可以达到-30个字节,就像Arnauld的JS answer一样简单。

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

在线尝试!



您是否不需要将lambda分配给其他东西?即f=lambda s...
OldBunny2800'9

@ OldBunny2800除非您在代码中使用引用(否则,可以创建一个可以使用页眉或页脚代码重用的未命名函数是可以接受的,这里是f=\在页眉中包含)。
乔纳森·艾伦

我认为您可以'[^aeiouy]([^aeiouy]|$)'"[^aeiouy]("*2+")|$)"(21个字节)替换模式字符串(24个字节)以节省3个字节,因为空组()不会改变搜索行为(TIO)。
乔纳森·弗雷希

@JonathanFrech 甚至
Xcoder先生17年

1

Perl 5,31字节(30 +1)

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

+1个字节用于-p命令行标志。如果单词是一个强词,则打印该单词;否则,则打印一个空字符串。


“两个不同且一致的值”
L3viathan'Sep

@ L3viathan空字符串是虚假的,非空字符串是真实的。这是有效的。
LyricLy

@ L3viathan Perl的真实性规则实际上非常有助于应对此类挑战。这不是我第一次利用这个确切的事实。
Silvio Mayolo

使用换行符终止的单词,可以将其缩短为$_=$/if/[^aeiouy]{2}/
nwellnhof

1

果冻,11字节

e€ØY;1a2\¬Ȧ

在线尝试!

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

是的,我知道我被乔纳森·艾伦打败了很多,但我还是想分享自己的方法:P

通过窃取乔纳森·艾伦(Jonathan Allan)的一点答案得到-4个字节(而不是附加一个辅音以检查最后一个字母的边沿大小写,仅附加1个)
-1个字节(由于英里)


您可以使用保存一个字节a2\Ȧ2Ƥ代替ṡ2Ȧ€
英里

@JonathanAllan facepalm我故意确保使用它ØC来确保Yy被算作辅音,因为我不知何故还记得。谢谢!
HyperNeutrino

1

Awk,39个字节

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

打印n非强词,不打印(或换行)强词

跟随包并在小写输入上搜索两个连续的非元音

测试

$ 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个字节

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

正确和错误互换

美化

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

测试

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

在线试用

基于@Arnauld的 答案



1

Java 8,53 42字节

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

使用与@jrtapsell的Kotlin答案相同的正则表达式来代替-11个字节。

在这里尝试。false如果强壮,true如果没有)

说明:

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)

因此,它基本上检查我们是否可以找到两个相邻的辅音,或者字符串是否以辅音结尾。


旧答案(53个字节):

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

在这里尝试。true如果强壮,false如果没有)

使用正则表达式查看输入字符串是否与“ strong”正则表达式匹配。注意,String#matches在Java中会自动添加^...$以检查String是否完全匹配给定的正则表达式。

说明”:

 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)

在Java中,搜索而不是匹配(例如使用许多其他答案)实际上更长:
70个字节

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

在这里尝试。false如果强壮,true如果没有)



0

SOGL V0.1219 18 个字节

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

在这里尝试!

说明:

æ                   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个字节

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

从标准输入读取

Lua(loadstring'ed),37个字节

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

从函数参数读取


输入为小写

查看是否存在长度为2或更大的字符串,该字符串仅由非元音(辅音)组成,或者该字符串是否以非元音结尾

返回true / false


0

C ++,195个 194字节

-1个字节,感谢Zacharý

大写,如果输入是一个强词,则返回true,否则返回false(C ++具有简单的int布尔值隐式转换规则,0 => false,否则返回true)

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

测试代码:

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
您可以删除之间的空间return!
扎卡里

0

C,107字节

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

对于词返回1,对于词返回0 。测试了主要帖子中给出的单词。



0

PHP,69字节

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

返回1表示单词不强。


欢迎来到PPCG!我相信您可以删除空格以减少某些字节,特别是/", str-> /",str[1]))) return->,[1])))return但是我不太了解PHP,因此无法确定。
斯蒂芬

是的好主意!也可以通过假定输入始终为大写来减少字节。
Matias Villanueva

哦,如果正则表达式是标准的正则表达式引擎,您不能这样做[B-Z]吗?
斯蒂芬

@Stephen [B-Z]包含元音。[^AEIOUY]虽然有效。
LyricLy

我也不知道PHP,但是您可以通过直接从正则表达式匹配中返回结果而不是将其包装在if语句中来节省更多字节。
LyricLy

0

CJam,57个字节

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

在线尝试!


读取输入,将辅音转换为1,将元音转换为0。对于每个辅音,AND预定义变量X(预定义为1)与下一个字符的值。输出X

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.