嗯,是hai句吗?


19

因此,您想创建一个句,但是不确定它是否遵循句的音节规则。

我不会像平常那样烦恼编写适当的Blub,因此您必须这样做。让我们陷入困境。

在野外寻找a句

为了这个挑战,我们将检查给定的诗是否满足以下条件:

  • 三行。
  • 第一行有5个音节。
  • 第二行有7个音节。
  • 第三行有5个音节。

每行由一个或多个单词组成,并用空格隔开。这些单词不一定是有效的英语单词。

每个单词被分成多个音节,然后对这些音节进行计数以获得行的总音节数。

一个音节有2到3个部分:开头,结尾,可能还有中间。每个部分或者是一个组的consonsants(也称为一个辅音簇,如sskspl),或一组元音(例如ieaoui)。

如果开头是一组辅音,则中间将是一组元音,而结尾将是一组辅音。如果开始是一组元音,则结束将是一组辅音,而没有中间。

例如,该单词example由三个音节exam和组成pleple没有结尾,因为它被单词的结尾部分缩短了。

作为另一个示例,该单词syllable还具有三个音节syllable,它们也没有结尾。

对于最后一个例子,该单词word有一个音节,word以一组辅音结尾。

挑战

给定一个字符串,一个字符串列表,一个列表列表或任何其他代表至少一行诗的合理格式,请确定其是否满足上述概述的hai句的标准,并返回结果。

您可以采用以下任何一种格式返回结果:

  • 如果这首诗是句而虚假的话,则为真值。
  • 如果这首诗是句,则为假值,否则为真值。
  • 如果诗歌是po句,则来自提交中指定的有限范围内的值,并且提交中也指定来自相互排斥的有限范围内的值。

您可能还假定这首诗不包含任何非字母字符,但是您可能不会假定这首诗完全是大写或小写。

为了这个挑战的目的,Y是一个元音。

测试用例

特鲁西

This is a haiku
Yes it truly is one
See what I did man

I am so tired
of writing this already
when can I stop this

Writing another
Of these horrific things
Come on please

Consonant only
Counts as one syllable
ghjk tgh knmb wrts vbc

虚假

oh boy writing non haiku is so much easier

This is
so good
on my
poor dear brain

The syllables do not match
at least I do not think so
I have not checked

It does not really matter
these test cases will help
At least I think they will

I am done here
This is enough
Goodbye

计分

由于这是
,最短的答案将为您赢得
好运



Answers:


4

果冻 25  23 字节

-2多亏了Outgolfer的Erik(使用行列表作为输入)

e€Øy0;ŒgP€
ḲLÐfÇ€ḣ8µ€ḣ4

单字链接,获取一个字符列表(行)列表并返回一个零和一列表列表。有效的haiku的长度为3,一旦将最深的列表(单个零)替换为单个一个,则扁平化列表的总和将分别为5、7和5。的形成(是否运行的字母是辅音和仅考虑每个最多的第一8个字只有4行)确保仅存在有限的每个有效和无效范围的。

在线尝试!或查看(甚至更令人困惑!)测试套件


这是使用 32  30字节的版本要容易得多,只需输出1或0:

e€Øy0;ŒgP€SȯL$
ḲLÐfÇ€Sµ€⁼5,7,5

试试这个或看看它的测试套件


我认为非Haiku可能性的“范围”不是有限的,您可以在其中包含无限数量的单词/行。
与Orjan约翰森

哦,该死,当做出更改时,我认为只有it句范围才需要有限。那使它回到我认为的32位。
乔纳森·艾伦

通过将每行的字数限制为八个,并将行数限制为四个,可以寻址四个字节的OK。
乔纳森·艾伦

我认为您可以删除Ỵµ,因为您可以列出行。
暴民埃里克(Erik the Outgolfer)'18年

3

JavaScript(ES6),84 75字节

将输入作为单词列表的列表。返回truehaiku false或非haiku。

a=>a.map(s=>(s.map(w=>w.match(/[aeiouy]+/gi))+'').split`,`.length)=='5,7,5'

测试用例



2

Python 2中126个 125 120 121字节

lambda s:[len(split('\s+',sub('[aeiouy][^aeiouy ]+','X ',t,0,I).strip()))for t in s.split('\n')]==[5,7,5]
from re import*

在线尝试!


您的上一次编辑违反了仅辅音词算为1个音节的要求。
与Orjan约翰森

@ØrjanJohansen:固定;谢谢!
Chas Brown


1
您可以打高尔夫球,只需一些简单的字节断,采取输入作为行的列表,并更换s.split()s
Rɪᴋᴇʀ


1

干净162 ... 115字节

import StdEnv,StdLib
@t=[sum[max(sum(map hd(group[sum[1\\v<-:"AaEeIiOoUuYy"|c==v]\\c<-w])))1\\w<-l]\\l<-t]==[5,7,5]

定义函数@,接受[[[Char]]](单词列表)和给出Bool。当输入是a句时
返回TrueFalse否则返回。

在线尝试!


似乎在仅辅音单词的情况下失败。
与Orjan约翰森

@ØrjanJohansen固定
很有可能

1

Mathematica 119字节

这是一个符合给定音节规则的版本:

Tr/@Map[Length@StringCases[#,("a"|"e"|"i"|"o"|"u"|"y")..]/. 0->1&,(s=StringSplit)/@s[ToLowerCase@#,"\n"],{2}]=={5,7,5}&

这是一个实际计算音节的83字节版本:

Tr/@Map[Length@WordData[#,"Hyphenation"]&,(s=StringSplit)/@s[#,"\n"],{2}]=={5,7,5}&

例如

%@"This is a haiku
Yes it truly is one
See what I did man"

返回,False因为第二行有六个音节,而不是必需的七个。


之所以失败,是因为质询明确定义了自己的音节计数,该计数不使用普通的英语规则。
与Orjan约翰森

好吧,谢谢您不要投票。我看到了一个音节定义的尝试,但是还不清楚。我猜按这个定义,“一个”有两个音节。看起来人们只是在计算连续的元音。
凯莉·劳德

几乎,但是没有元音的单词算作一个音节。请参阅问题注释。我想这只是对辅音组的处理感到困惑,但这实际上并不会影响最终的计数。
与Orjan约翰森

“一个”有两个元音,它们不是连续的。
凯利·洛德

对,所以它们算作两个音节。
与Orjan约翰森
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.