查找包含每个元音的单词


28

您的程序必须在此单词表中找到包含所有元音(a e i o u y)的所有单词。有很简单的方法可以做到这一点,但是我正在寻找最短的答案。我会选择任何语言,但我想看看Bash。

这是一个示例(可能会大大改善):

cat wordlist.txt | grep "a" | grep "e" | grep "i" | grep "o" | grep "u" | grep "y"

您的分数就是代码的长度。

-5分,用于计算单词的所有出现次数。

最低分获胜。


11
这样的个人资料。很多图片。非常总督。哇。
门把手

2
17个答案并还在计数!我想在cg,doc上看到更多类似您的问题。我经常会在这里看到一些有趣的东西,但是却没有几个小时的时间来产生一个体面的解决方案...
Cary Swoveland 2014年

2
是的,但是它不能是用于寻找元音的语言。
TheDoctor 2014年

1
@TheDoctor Shakes fist
Jason C

2
如果它有奖金,那么它不是代码高尔夫。请改用代码挑战。
Tim Seguine 2014年

Answers:


7

GolfScript,20个字符-5 = 15分

n%{'aeiouy'\-!},.,+`

基于Howard的解决方案,但是使用了较短的测试(\-!节省了一个字符&,6=),较短的附加长度(.,+= 3个字符)和较短的输出格式(没有人说输出必须用换行符分隔,因此`节省了一个字符n*)。

给定小写单词列表作为输入,这是输出(为便于阅读,插入了换行符):

["abstemiously" "authoritatively" "behaviourally" "consequentially" "counterrevolutionary"
"disadvantageously" "educationally" "encouragingly" "eukaryotic" "evolutionarily"
"evolutionary" "exclusionary" "facetiously" "gregariously" "heterosexuality" "homosexuality"
"importunately" "inconsequentially" "instantaneously" "insurrectionary" "intravenously"
"manoeuvrability" "neurologically" "neurotically" "ostentatiously" "pertinaciously"
"precariously" "precautionary" "questionably" "revolutionary" "simultaneously"
"supersonically" "tenaciously" "uncomplimentary" "uncontroversially" "unconventionally"
"undemocratically" "unemotionally" "unequivocally" "uninformatively" "unintentionally"
"unquestionably" "unrecognisably" 43]

(诗。从技术上讲,鉴于挑战仅表明代码必须针对此特定输入起作用,所以n%{'aeiouy'\-!},`43将要短一个字符。不过,我认为是作弊。)


说明:

  • n% 将换行符上的输入拆分为一个数组。
  • { }, 是一个“ grep”运算符,在数组的每个元素的花括号之间执行代码,并选择为其返回真值的花括号。
    • 在循环内部,'aeiouy'\-获取文字字符串,aeiouy并从中删除候选单词中找到的每个字符。在!那么在逻辑上否定了得到的字符串,产生1(真)如果字符串是空的0(假),如果它不是。
  • .,+ 复制过滤后的数组,计算其中的单词数,然后将结果附加到原始数组。
  • 最后,`取消对数组的排序,将其转换为其内容的字符串表示形式。(没有它,数组中的单词将简单地在输出中连接起来,产生难以理解的混乱。)

恭喜!!最小的答案!!!
TheDoctor 2014年

轻率而刻薄是唯一按顺序排列所有6个元音的单词。只是想我会和你分享。我觉得很酷。
dberm22

15

GolfScript,19个字符

n%{'aeiouy'&,6=},n*

用法:

golfscript vowels.gs < wordlist.txt

输出:

abstemiously
authoritatively
behaviourally
[...]
uninformatively
unintentionally
unquestionably
unrecognisably

如果您还想在最后输出计数,则可以使用

n%{'aeiouy'&,6=},.n*n@,

再长四个字符。


1
我喜欢!可能
要再

11

Python-46个字符

filter(lambda x:set(x)>=set("AEIOUY"),open(f))

可读的版本:可读性很强:-)


8

APL,21-5 = 16

(,≢)w/⍨∧⌿'aeiouy'∘.∊w

期望找到的单词列表为w。返回包含所有元音及其数量的单词列表。经过ngn apl测试。这是一个例子

说明

         'aeiouy'∘.∊w   # generate a truth table for every vowel ∊ every word
       ∧⌿               # reduce with ∧ along the rows (vowels)
    w/⍨                 # select the words that contain all the vowels
(,≢)                    # hook: append to the list its own tally

8

红宝石38

编辑34:到目前为止最好(来自@OI):

a.split.select{|w|'aeiouy'.count(w)>5} 

编辑1:我只是注意到要求在元音中包含“ y”的问题,因此我已经相应地编辑了我的问题。正如@Nik在对他的回答的评论中所指出的,"aeiouy".chars它比少一个字符%w[a e i o u y],但我将保留后者,以保持多样性,即使我因放弃的机会而面临噩梦。

编辑2:感谢@OI提出改进建议:

s.split.select{|w|'aeiouy'.delete(w)==''}

这比以前节省了11个字符。

编辑3和3a:@OI还提供了其他一些功能:

s.split.select{|w|'aeiouy'.tr(w,'')==''}

然后

s.split.reject{|w|'aeiouy'.tr(w,'')[1]}

并再次(3b):

a.split.select{|w|'aeiouy'.count(w)>5} 

我只是个抄写员!

这是另外两个没有竞争力的解决方案:

s.split.group_by{|w|'aeiouy'.delete(w)}['']       (43)
s.gsub(/(.+)\n/){|w|'aeiouy'.delete(w)==''?w:''} (48)

最初我有:

s.split.select{|w|(w.chars&%w[a e i o u y]).size==6}

s是一个包含单词的字符串,以换行符分隔。s返回包含所有五个元音的单词数组。对于不熟悉Ruby的读者来说,%w[a e i o u y] #=> ["a", "e", "i", "o", "u", "y"]&是数组的交集。

假设

s = "abbreviations\nabduction\n"
s.split #=> ["abbreviations", "abduction"] 

在区块中{...},最初

w             #=> "abbreviations"
w.chars       #=> ["a", "b", "b", "r", "e", "v", "i", "a", "t", "i", "o", "n", "s"]
w.chars & %w[a e i o u y] #=> ["a", "e", "i", "o"]
(w.chars & %w[a e i o u y]).size == 6 #=> (4 == 6) => false,

因此未选择“缩写”。

如果字符串s可能包含重复项,则s.split.select...可以用替换s.split.uniq.select...以删除重复项。

刚刚注意到我可以通过更换节省1个字符size==6size>5


1
...size=5是一个错误-应该是...size==5
Uri Agassi 2014年

谢谢@Uri,指出了我已修正的第一行中的错别字(不是错误-请参见上方的行,因此未选择“缩写”)。
卡里·斯沃夫兰2014年

@CarySwoveland您可以通过执行以下操作为自己保存11个字符:s.split.select{|w|'aeiouy'.delete(w)==''}
OI

太好了,@ OI。我进行了编辑,并在灰色单元格中找到了一个位置。
卡里·斯沃夫兰

@CarySwoveland这将再节省1个字符:s.split.select{|w|'aeiouy'.tr(w,'')==''}。我很确定,如果您使用nil逻辑和“正确的” String方法,则可以将字符数控制在40个字符以内。仍在寻找...
OI 2014年


6

Ruby-28个字符(如果y不包含在元音中,则为27个字符)

("ieaouy".chars-s.chars)==[]

要运行的完整命令是(48个字符):

ruby -nle 'p $_ if ("ieaouy".chars-$_.chars)==[]'

编辑:取代putsp被@CarySwoveland的建议


好人,@ Nik。%w[a e i o u]将节省1吨焦炭,pputs,3个。
卡里·斯沃夫兰

谢谢@CarySwoveland!我忘了p,我很少使用它。对于%w [],如果y包含在元音组中,则带有char的版本仍然更短。
Nik O'Lai 2014年

@ NikO'Lai "aeiouy".delete(s)==''可以为您节省几个字符。
OI 2014年

非常好!将其发布为您自己的解决方案@OI。我会
投票赞成

4

AWK-29

/ a / && / e / && / i / && / o / && / u / && / y /

运行:将小写单词列表保存到wordlist.txt。然后做:

mawk“ / a / && / e / && / i / && / o / && / u / && / y /” wordlist.txt

如果您的系统没有mawkawk也可以使用。

您也可以通过将程序保存到program.awk并执行mawk或从文件运行它awk -f program.awk


选择正确的顺序可以加快工作速度'/y/&&/u/&&/i/&&/o/&&/a/&&/e/'
F. Hauri 2014年


3

k [22-5 = 17个字符]

我已将文件“ corncob_lowercase.txt”重命名为“ w”

数数单词[22个字符]

+/min'"aeiouy"in/:0:`w

输出量

43

查找所有词[25个字符]

x@&min'"aeiouy"in/:x:0:`w

总共43个单词,包含所有元音 (a e i o u y)

输出量

"abstemiously"
"authoritatively"
"behaviourally"
..
..
"unintentionally"
"unquestionably"
"unrecognisably"

3

Javascript / JScript 147(152-5),158(163-5)或184(189-5)字节:

这是我的Javascript和JScript可怕的“ ungolfyfied”版本(164 152 152-5 = 147字节):

function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;}

function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=6;for(z in c)i-=!!s[k].search(c[z]);i&&(r[r.length]=s[k]);}return r;}

谢谢@GaurangTandon的search()功能,它为我节省了一个字节!

RegExp基于HORRIBLE性能,但同时支持大写和小写(163-5 = 158字节):

function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=RegExp(c[z],'i').test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}

基于具有更好性能的RegExp ,BUT需要占用更多的字节(189-5 = 184字节):

function(s,k,z,x,i,c,r,l){l=[];r=[];for(z in c='aeiouy'.split(''))l[z]=RegExp(c[z],'i');for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=l[z].test(s[k]);i==6&&(r[r.length]=s[k]);}return r;}


这个(如果只是为了娱乐)(175-5字节),不会算作答案:

function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;}

它基于第一个答案,但有一个“扭曲”:您可以知道一个单词被发现了多少次。

您只需这样做:

var b=(function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r[r.length]=s[k]]=1+(r[s[k]]||0));}return r;})('youaie youaie youaie youaie a word');

b.youaie //should be 4

由于length没有所有的元音,因此不会删除它,仍然可以作为奖金的答案。


你怎么称呼它?

“简单”:将函数包装在里面(),然后添加('string goes here');到末尾。

像这样: (function(s,k,z,x,i,c,r){c='aeiouy'.split('');r=[];for(k in s=(s+'').split(/\b/)){i=0;for(z in c)i+=s[k].indexOf(c[z])>=0;i==6&&(r[r.length]=s[k]);}return r;})('a sentence youyoy iyiuyoui yoiuae oiue oiuea');

此示例将返回仅包含1个字符串的数组:yoiuae

我知道这是最糟糕的解决方案,但是有效!


为什么我要数-5?

好吧,Javascript / JScript数组在数组中有一个属性(length),用于说明其具有的元素数。

在问题中得到确认后,-5的加分是用于告诉单词数。

由于单词的数量在该属性中,因此我的分数自动为-5。


可能会感兴趣,search()而不是indexOf()节省1个字符。
Gaurang Tandon 2014年

此外,据我所知,在最短的版本中,您不需要.split()on "aeiouy"。JS以相同的方式遍历数组和字符串。(删除它可以节省大约10个字符)
Gaurang Tandon 2014年

2

红宝石39 38

当前计算整个程序(包括输入和输出)时最短的Ruby条目。

使用map代替来保存字符each

$<.map{|w|w*5=~/a.*e.*i.*o.*u/m&&p(w)}

另一个版本,带有漂亮输出的39个字符:

puts$<.select{|w|w*5=~/a.*e.*i.*o.*u/m}

这两个程序都从stdin接受输入,或者将其作为通过命令行参数传递的文件名:
$ ruby wovels.rb wordlist.txt

编织需要花费3个额外的字符y


无论如何使用Enumerable#grep来缩短?例如,s.split.grep /a*e*i*o*u*y/假设s是一串用换行符分隔的单词。
OI 2014年

@OI这是一个有趣的想法,但由于正则表达式具有固定顺序的wovels,因此需要进行一些调整。这就是为什么我在匹配字符串之前在字符串.*之间重复5次。
daniero 2014年

你能澄清一下吗?假设s = "aeiouy\neiouay\nyuaioe\n"。然后给我s.split.grep /a*e*i*o*u*y/回来["aeiouy", "eiouay", "yuaioe"]。在pryRuby 2.0.0中进行测试。顺便说一句,很好的解决方案。
OI

@OI哇,我以为grep使用了=~运算符,但显然使用了===。我怀疑它还会匹配不包含所有wovels的字符串,因为例如/e*a*i*o*u*y/=~"eioy"可以工作。我真的不明白===正则表达式和运算符之间的实际作用。很棒的发现;我建议您自己将其发布为答案。编辑我是对的:例如尝试使用"heya"
daniero 2014年

我认为正则表达式需要进行调整,这是正确的。我发现边缘情况不包含所有漏出的元音。也许太好了,难以置信。
OI

2

Mathematica(65或314)

Belisarius在对我的最初回应的评论中提出了两种截然不同的方法,更好的一种。首先,我的努力工作是通过算法生成与六个元音(包括“ y”)组合在一起的每个可能的正则表达式,然后对照这720个正则表达式中的每一个检查目标单词列表中的每个单词。它可以工作,但是不是很简洁,而且很慢。

b = Permutations[{"a", "e", "i", "o", "u","y"}]; Table[
 Select[StringSplit[
  URLFetch["http://www.mieliestronk.com/corncob_lowercase.txt"]], 
  StringMatchQ[#, (___ ~~ b[[i]][[1]] ~~ ___ ~~ 
      b[[i]][[2]] ~~ ___ ~~ b[[i]][[3]] ~~ ___ ~~ 
      b[[i]][[4]] ~~ ___ ~~ b[[i]][[5]]~~ ___ ~~ b[[i]][[6]] ~~ ___)] &], {i, 1, 
  Length[b]}]

约320个字符。可以通过使用其他表示法来节省一些,而准备字典文件作为字符串列表时,其他字符会丢失(Mathematica中字典的自然格式。其他语言可能不需要此准备,但Mathematica确实需要)。如果我们省略该步骤(假定已为我们处理),则可以用250个字符以内完成相同的方法,如果使用Mathematica的内置词典,则可以节省更多的钱,

Map[DictionaryLookup[(___ ~~ #[[1]] ~~ ___ ~~ #[[2]] ~~ ___ ~~ #[[3]] 
~~ ___ ~~ #[[4]] ~~ ___ ~~ #[[5]]~~ ___ ~~ #[[6]] ~~ ___) .., IgnoreCase -> True] &, 
 Permutations[{"a", "e", "i", "o", "u","y"}]]

少于200个字符。计算找到的单词数只需要将结果传递给Length[Flatten[]],可以将其添加到上面的任一代码块周围,也可以随后使用来完成Length@Flatten@%。为此挑战指定的单词列表给出了43个匹配项,而Mathematica词典给出了64个匹配项(并且速度更快)。每个词典中都没有匹配的单词。例如,Mathematica在共享列表中找不到“非专业”,而在共享列表中找到Mathematica词典中没有的“真核生物”。

贝利撒留提出了一种更好的解决方案。假设已经准备好单词表并将其分配给变量l,他基于Mathematica的StringFreeQ[]功能定义了一个测试 ,然后使用该Pick[]功能将该测试应用于单词表。65个字符,比我的方法快400倍。

f@u_ := And @@ (! StringFreeQ[u, #] & /@ Characters@"aeiouy"); Pick[l,f /@ l]

在65个字符中:单词列表f@u_:=And@@(!StringFreeQ[u,#]&/@Characters@"aeiouy");Pick[l,f/@l]在哪里l
belisarius博士2014年

这是因为您忘记了将其y视为元音(根据OP要求!)
belisarius博士2014年

@belisarius是的,我在发表评论后注意到这一点。我正在检查我的结果是否固定。
Michael Stern

@belisarius确认-您的解决方案比我的解决方案更简洁,更快捷。您为什么不将其发布为自己的解决方案?我会投票。
Michael Stern

谢谢!如果喜欢,请编辑包括它的答案。对我来说,这就是寻找语言的简短解决方案,而不是累积代表:)
belisarius博士2014年

2

Perl 6-35个字符

受到@CarySwoveland的Ruby解决方案的启发:

say grep <a e i o u y>⊆*.comb,lines

这种选择(grepS)各行收益True<a e i o u y> ⊆ *.comb,这是问的只是一个奇特的方式“是集合('a','e','i','o','u','y')的子集(中集)由输入的字母(的*.comb)?”

实际上,两者<a e i o u y>*.comb仅创建Lists :(或者(<=)如果您被困在ASCII中)会Set为您将它们转换为s。

要获得打印的行数,此42个字符-5 = 37点的脚本也将输出:

say +lines.grep(<a e i o u y>⊆*.comb)».say

2

C-96字节

 char*gets(),*i,j[42];main(p){while(p=0,i=gets(j)){while(*i)p|=1<<*i++-96;~p&35684898||puts(j);}}

由于运算符优先级的巧合,我节省了几个字节的括号。


2

Javascript-分数= 124-5 = 119 !!!

编辑:14/02/17

function(l){z=[],l=l.split("\n"),t=0;while(r=l[t++]){o=0;for(i in k="aeiouy")o+=!~r.search(k[i]);if(o==0)z.push(r)}return z}

非常感谢@Ismael Miguel帮助我减少了约12个字符

我删除了粗箭头表示法功能表单,因为尽管我已经看到它开始使用,但是它不起作用。不知道为什么


要使其起作用:

将所有由换行符分隔的单词作为参数传递给函数,如下所示。


测试:

// string is "facetiously\nabstemiously\nhello\nauthoritatively\nbye"

var answer = (function(l){z=[],l=l.split("\n"),t=0;while(r=l[t++]){o=0;for(i in k="aeiouy")o+=!~r.search(k[i]);if(o==0)z.push(r)}return z})("facetiously\nabstemiously\nhello\nauthoritatively\nbye")

console.log(answer);
console.log(answer.length);

/* output ->    
    ["facetiously", "abstemiously", "authoritatively"]
    3 // count
*/


第1行的语法错误:期望的表达式,得到'>'c =(s,j)=> {k =“ aeiouy” .split(“
Ismael Miguel

1
您可以通过移动k="aeiouy".split("")for(i in k)循环内部来减少这种情况。使用;而不是换行可以在Windows中节省一些字节。但是,我看不到它将如何处理单词列表。以及如何使其工作。
Ismael Miguel 2014年

@IsmaelMiguel我知道(胖箭头表示法)不起作用。但是因为我已经看到它在这里被使用了,所以我之所以使用它是因为它节省了字符。但是我删除了它。而且我不理解您的提示,尽管感谢您检查代码。合并了您的字节提示。我的新程序可能会消除您的两个疑问。谢谢阅读。:)
Gaurang Tandon 2014年

相反k="aeiouy";o=0;for(i in k),请尝试o=0;for(i in k='aeiouy')。并使用保存字节,您可以将其更改o+=RegExp(k[i]).test(s)o+=RegExp(k[i],'i').test(s),再占用一个字节,但同时使用大写和小写形式。
Ismael Miguel

更新了更好的算法。尽管我现在理解了您的想法,但是我不明白为什么它在这里起作用而不在这里起作用。请帮忙!谢谢:)
Gaurang Tandon 2014年

2

Bash + coreutils,39岁

eval cat`printf "|grep %s" a e i o u y`

接受来自stdin的输入。


这看起来有资格获得5点奖金。
Glenn Randers-Pehrson 2014年

@ GlennRanders-Pehrson奖金对我来说根本没有意义;-)
Digital Trauma

无论是否有意义,在处理包含单词列表的两个副本的文件时,您都会正确发出86行。据我了解,排序仅报告43的解决方案将不会获得奖金。
Glenn Randers-Pehrson 2014年

2

sed 29个字符

/y/{/u/{/o/{/i/{/a/{/e/p}}}}}

顺序从维基百科上的字母频率中选择上的以进行速度检查。

在我的主机上:

time sed -ne '/a/{/e/{/i/{/o/{/u/{/y/p}}}}}' </usr/share/dict/american-english >/dev/null 
real    0m0.046s

time sed -ne '/y/{/u/{/i/{/o/{/a/{/e/p}}}}}'</usr/share/dict/american-english >/dev/null 
real    0m0.030s

1
不错(+1),但我认为您需要在脚本中包含“ sed -n”,以容纳36个字节。
Glenn Randers-Pehrson 2014年

2

Bash(grep)-36个字节

g=grep;$g y|$g u|$g o|$g i|$g a|$g e

注意测试的元音顺序,最不频繁的顺序。对于测试用例,此命令的运行速度约为测试顺序的3倍。这样,第一个测试将删除大量单词,因此后续测试的工作量将减少。显然,这对代码的长度没有影响。按此顺序进行测试,这里发布的许多其他解决方案也会类似地受益。


为什么wc,我们没有找到,不计算?另外,我们是否将输入代码计入字符数?
Orion 2014年

我真的不明白这种加成,即“ -5分用于计算单词的所有出现次数”。如果它确实意味着“报告单词的所有出现情况”,那就是我的脚本所做的,而没有“ | wc”。我没有使用任何“输入代码”,因为grep会读取标准输入,因此“ grep”就是“输入代码”,因此我计算了一下。我现在将删除“ | wc”。
Glenn Randers-Pehrson 2014年

我已取消奖金。
Glenn Randers-Pehrson 2014年

1

D-196

import std.regex,std.stream;void main(string[]a){auto f=new File(a[1]);while(!f.eof)if(!(a[0]=f.readLine.idup).match("(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*").empty)std.stdio.writeln(a[0]);}

未打高尔夫球

import std.regex, std.stream;

void main( string[] a )
{
    auto f = new File( a[1] );

    while( !f.eof )
        if( !( a[0] = f.readLine.idup ).match( "(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*" ).empty )
            std.stdio.writeln( a[0] );
}

用法C:\>rdmd vowels.d wordlist.txt

wordlist.txt 必须包含小写列表字。


1

Rebol(104个字符)

remove-each w d: read/lines %wordlist.txt[6 != length? collect[foreach n"aeiouy"[if find w n[keep n]]]]

未打高尔夫球:

remove-each w d: read/lines %wordlist.txt [
    6 != length? collect [foreach n "aeiouy" [if find w n [keep n]]]
]

d现在包含找到的单词列表。这是Rebol控制台的示例:

>> ; paste in golf line.  This (REMOVE-EACH) returns the numbers of words removed from list

>> remove-each w d: read/lines %wordlist.txt[6 != length? collect[foreach n"aeiouy"[if find w n[keep n]]]]
== 58067

>> length? d
== 43

1

小话(36/57个字符)

'corncob_lowercase.txt' asFilename contents select:[:w | w includesAll:'aeiouy']

要获取计数,请将#size发送到结果集合。结果集合包含43个单词(“绝对”,“权威”,“毫无疑问”,“无法识别”)

上面的代码有77个字符,但是我可以将单词列表文件重命名为“ w”,因此我将文件名计为1,这得到了57分。

读取文件是否是问题的一部分?如果不是(请参见其他示例),并且单词列表已经在集合c中,那么代码将简化为:

c select:[:w | w includesAll:'aeiouy']

这是36个字符(删除了不可省略的空格)。


1

更新:删除不必要的空格

速度很慢,但以bash表示(81个字符):

while read l;do [ `fold -w1<<<$l|sort -u|tr -dc ieaouy|wc -m` = 6 ]&&echo $l;done

编辑:echo $l|fold -w1替换fold -w1<<<$l为@ nyuszika7h建议


这是代码高尔夫,您可能想进一步减少代码。首先删除不需要的空格。;)
nyuszika7h 2014年

您可以使用fold -w1<<<$l代替进一步缩小代码echo $l|fold -w1注意:当前代码为84个字符,您不应该在末尾加上换行符。
nyuszika7h 2014年

直到今天,我对<<<一无所知。再次谢谢你,@ nyuszika7h。你能告诉我它在哪里解释。
Nik O'Lai 2014年


1

JavaScript-95个字节

这是我的高尔夫球。

function f(s){return[var a=s.match(/^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*/),a.length];}

我还要指出,您的高尔夫似乎并没有发现所有元音的出现。

取消高尔夫:

function countVowels(string) {
  var regex   = /^(?=.*a)(?=.*e)(?=.*i)(?=.*o)(?=.*u)(?=.*y).*/;
  var matches = string.match(regex);
  var length  = matches.length;
  return [matches, length];

1
仔细阅读规格。他正在寻找一个单词-就像刻意地-将所有元音包含在一个单词中。尽管他并不坚持要像在恶作剧中那样将它们包含在内。
dmckee 2014年

1
您的正则表达式有误。所有前瞻功能都在有效检查第一个字符是否为元音。您需要(?=.*a)检查a字符串中是否在某处。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2014年

@dmckee这就是为什么我使用lookaheads的原因。他们不需要任何特定的命令。
Isiah Meadows

@nhahtdh感谢抓捕
Isiah Meadows

1

排序+ uniq + sed

这与单词的重复出现不匹配。如果出现在单词的开头,则它也与字母“ y”不匹配。

sort wordlist.txt | uniq | sed -n '/a/p' | sed -n '/e/p' | sed -n '/i/p' | sed -n '/o/p' | sed -n '/u/p' | sed -nr '/^[^y]+y/p' 

与您的其他答案一样,将“ sort wordlist.txt | uniq”替换为“ sort -u wordlist.txt”以节省4个字节。
格伦·兰德斯·皮尔逊

1

重击

不是OP的短,而是Bash中的一行:

while read p; do if [ $(sed 's/[^aeiouy]//g' <<< $p | fold -w1 | sort | uniq | wc -l) -eq 6 ] ; then echo $p; fi; done < wordlist.txt

您可以将“ sort | uniq”替换为“ sort -u”来节省四个字节
Glenn Randers-Pehrson 2014年

您也可以从“ |”和“;”中删除空格,以节省更多字节
Glenn Randers-Pehrson 2014年

1

C#-170

using System.Linq;class P{static void Main(string[]a){System.Console.Write(string.Join(",",System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)))));}}

格式:

using System.Linq;
class P
{
    static void Main(string[] a) { 
        System.Console.Write(
            string.Join(",", System.IO.File.ReadAllLines(a[0])
                .Where(w => "aeiouy".All(c => w.Contains(c))))); 
    }
}

现在不打算进行计数,puh但应该很容易。 单词列表(小写版本)的路径应作为第一个参数传递给程序:

program.exe D:\foo\bar\corncob_lowercase.txt

输出:

abstemiously,authoritatively,behaviourally,consequentially,counterrevolutionary,
disadvantageously,educationally,encouragingly,eukaryotic,evolutionarily,evolutio
nary,exclusionary,facetiously,gregariously,heterosexuality,homosexuality,importu
nately,inconsequentially,instantaneously,insurrectionary,intravenously,manoeuvra
bility,neurologically,neurotically,ostentatiously,pertinaciously,precariously,pr
ecautionary,questionably,revolutionary,simultaneously,supersonically,tenaciously
,uncomplimentary,uncontroversially,unconventionally,undemocratically,unemotional
ly,unequivocally,uninformatively,unintentionally,unquestionably,unrecognisably

我可以自由使用输出和逗号分隔的单词。规则中均未指定两者(状态“必须找到所有单词”,而不是输出方式(和IF))。

包括计数(+输出):192-5 = 187

using System.Linq;class P{static void Main(string[]a){var r=System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)));System.Console.Write(string.Join(",",r)+" "+r.Count());}}

输出:

abstemiously,authoritatively,behaviourally,consequentially,counterrevolutionary,
disadvantageously,educationally,encouragingly,eukaryotic,evolutionarily,evolutio
nary,exclusionary,facetiously,gregariously,heterosexuality,homosexuality,importu
nately,inconsequentially,instantaneously,insurrectionary,intravenously,manoeuvra
bility,neurologically,neurotically,ostentatiously,pertinaciously,precariously,pr
ecautionary,questionably,revolutionary,simultaneously,supersonically,tenaciously
,uncomplimentary,uncontroversially,unconventionally,undemocratically,unemotional
ly,unequivocally,uninformatively,unintentionally,unquestionably,unrecognisably 4
3

(请注意末尾的计数:43)

无输出(“必须找到所有单词”):137-5 = 132

using System.Linq;class P{static void Main(string[]a){var r=System.IO.File.ReadAllLines(a[0]).Where(w=>"aeiouy".All(c=>w.Contains(c)));}}

(弯曲的规则1位图的处理然后再:不是真的)这出土文物所有单词,并且可以通过执行计数r.Count()


1

锋利的C

我以前从未做过此事,也不确定是什么发布程序。但这是我想出的:

185字节

Action<string>x=(s=>s.Split('\n').ToList().ForEach(w=>{if("aeiouy".All(v=>w.Contains(v)))Console.Write(w);}));using(var s=new StreamReader(@"C:\corncob_lowercase.txt"))x(s.ReadToEnd());

wordList =一个 List<string>所有单词中的a。

如果要显示总计:

219-5 = 214字节

Action<string>x=(s=>{var t=0;s.Split('\n').ToList().ForEach(w=>{if("aeiouy".All(v=>w.Contains(v))){Console.Write(w);t++;}});Console.Write(t);});using(var s=new StreamReader(@"C:\corncob_lowercase.txt"))x(s.ReadToEnd());


展开式

// init
var words = "";
var vowels = "aeiouy";
var total = 0;

using (var stream = new StreamReader(@"C:\corncob_lowercase.txt"))
{
    // read file
    words = stream.ReadToEnd();

    // convert word to List<string>
    var wordList = words.Split('\n').ToList();

    // loop through each word in the list
    foreach (var word in wordList)

        // check if the current word contains all the vowels
        if(vowels.All (w => word.ToCharArray().Contains(w)))
        {
            // Count total
            total += 1;
            // Output word
            Console.Write(word);
        }

    // Display total
    Console.WriteLine(total);
}

通常,如果问题要求“程序”,则应发布完整的程序,包括加载/初始化等。否则,做得很好!
程序员

哦好的。因此,在精简版中,我应该包括所有内容,而不仅仅是满足要求的行?我认为这是由其他答案判断的后者,因为他们缺少加载/读取txt文件的代码。
jzm 2014年

您会看到方法的变化,并且鉴于答案管理的年龄在新答案上可能不那么强,但是一般而言,如果问题要求“程序”,则该问题应可按发布要求进行编译和运行。以问题本身为例-这是一个完整的可执行解决方案,它独立存在。
程序员

嗯,对。好吧,在那种情况下,我已经将2个简化版本更新为独立版本。
jzm 2014年

大!确保更新您的答案文字(您提到“不加载/阅读”)并计算分数。
程序员

1

vb.net(分数91 = 96c-5)* 0

* 0 + 49c分钟

这将创建一个包含所有包含所有元音的单词的枚举。

Dim r=IO.File.ReadLines(a(0)).Where(Function(w)"aeiou".Intersect(w).Count=5)
Dim c=r.Count

Your program must find all the words in this wordlist。这不是a)程序,而是程序的摘录; b)不读取/使用单词表。
RobIII 2014年

@RobIII vb.net的基本控制台程序最低为49c。程序的参数(在本例中为单词列表)是数组a。另外,正如其他一些人指出的那样,它在LinqPad中是有效的程序。
亚当·斯佩特(AdWords Speight)2014年

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.