找到我的多鞭!


19

出于此挑战的目的,将polyphthong定义为String的连续切片,该切片仅包含元音,并且长度至少为2。给定非空String作为输入,您的任务是输出其包含的所有polyphthongs 。

例如,"abeoic"具有以下连续切片(以空格分隔):

a b e o i c ab be eo oi ic abe beo eoi oic abeo beoi eoic abeoi beoic abeoic

除去那些不包含元音或长度小于2的元音,我们将得到所需的多音节:

eo oi eoi

您的提交必须遵守以下规则:

  • 您可以为I / O选择小写或大写,但输出大小写必须与输入大小写匹配。

  • 元音为aeiou(小写)和AEIOU(大写)。y/ Y不被视为元音。

  • 输入将仅包含可打印的ASCII。

  • 如果一个多重声部出现多次,则可以选择仅输出一次或输出所有出现的情况。

  • 允许使用任何合理的I / O格式和方法(对于输入和输出,也可以使用字符列表)。

测试用例

输入->输出(小写)

r67 ^^()* 6536782!87-> []
编程难题和代码高尔夫球-> []
aaand ...我赢了!-> ['aa','aa','aaa']
阿拉伯语-> ['eo','oi','eoi']
yah eioo ala-> ['ei','io','oo','eio','ioo','eioo']
@yabeeeayio__e-> ['ee','ee','ea','io','eee','eea','eeea']
0ioen0aaiosnjksd-> ['io','oe','aa','ai','io','ioe','aai','aio','aaio']

请注意,为测试案例3和6,您可以输出'aa''ee'分别只有一次(见第四条规则)。

这是,每种语言中以字节为单位的最短提交胜出!


请注意,这最初是作为第十九字节中CMC(聊天迷你挑战)发布的,但是Adám说它适合于Main,所以我最终发布了它。
Xcoder先生17年

在您的第三个测试用例中,'aa'出现两次。如果一个字符串出现在不同的位置,是否必须多次输出同一字符串?或者一个字符串只能输出唯一的多形体吗?
乔纳森·弗雷希

@JonathanFrech好吧,我想输出唯一的polyphtongs很好。将进行编辑。
Xcoder先生17年

输出顺序重要吗?
ovs '17

1
@Xophmeister 对于此挑战,将polyphthong定义为 -我知道这不是正确的语言定义:-)
Xcoder先生,2017年

Answers:


7

Python 2中102个 97字节

感谢@JonathanFrech -5个字节

w=input();l=range(len(w)+1)
print{w[a:b]for a in l for b in l if b-a>1<set(w[a:b])<=set('aeiou')}

在线尝试!

小写I / O


1
我认为您不需要...AEIOU',因为只允许使用小写字母作为输入。
乔纳森·


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])为93工作。–
Lynn

@Lynn并且您的解决方案产生96个Python 2字节
乔纳森·弗雷奇

6

JavaScript(ES6),77 75字节

要求输入小写。输出唯一的多声群,而不重复。

w=>(r=[],g=s=>w.match(s)&&[...'aeiou'].map(c=>g(s+c),s[1]&&r.push(s)))``&&r

测试用例

怎么样?

我们以递归方式构建所有可能的polyphthongs的树,一旦输入中不再包含当前节点,就修剪分支,并保存至少两个字符的所有匹配节点。

w => (                      // given the input w
  r = [],                   // r = array of results
  g = s =>                  // g = recursive function taking s
    w.match(s) &&           // if w contains s:
    [...'aeiou'].map(c =>   //   for each vowel c:
      g(s + c),             //     do a recursive call with s + c
      s[1] &&               //     if s is at least 2-character long:
      r.push(s)             //       push it into r
    )                       //   end of map()
)``                         // initial call to g() with s = ''
&& r                        // return r

6

视网膜23 20字节

M!&`[aeiou]+
r!&`..+

在线尝试!

这将打印所有出现的polyphthong。

说明

视网膜确实有一种方法来获取所有重叠的匹配项,但这实际上意味着它将从每个位置寻找一个匹配项。因此,如果同一位置有多个匹配项,则只会返回其中之一。真正获得所有重叠匹配项的唯一方法是使用此功能两次,一次从左至右匹配,一次从右至左匹配(以便我们首先从每个可能的起始位置获得最长的匹配项,然后我们还针对可能的结束位置)。

所以实际的程序是:

M!&`[aeiou]+

获取所有重叠的元音运行。这实际上意味着获得所有元音运行的所有后缀。

r!&`..+

现在,通过从右到左匹配,获取至少长度为2的所有前缀。这里M是隐式的,因为它是程序的最后一行。


你能解释一下代码吗?
亚当

!&`[aeiou]{2,}如此接近正确,有没有一种方法可以使它更加匹配io呢?
AdmBorkBork

1
@Adám添加了说明。
Martin Ender

@AdmBorkBork我的解释涵盖了为什么该方法不起作用。视网膜并没有摆弄真正的正则表达式引擎,因此,最&能做的就是尝试从每个位置进行匹配,因此您不能从同一位置进行多个不同长度的匹配。这就是为什么我需要第二阶段。
Martin Ender

很好的解释,谢谢。
AdmBorkBork

5

QuadS,20 +1 = 21字节

⊃,/⍵
[aeiou]+
1↓,\⍵M

带有o标志

在线尝试!

按照发生的顺序:

[aeiou]+ 在此PCRE的每次比赛中

,\⍵M 匹配的前缀

1↓ 删除第一个(具有一个元音)

,/⍵ 连接所有前缀列表

 披露(因为/附有减免)


这等效于Dyalog APL的默认功能:

{⊃,/⍵}'[aeiou]+'S{1↓,\⍵.Match}⍠'OM'1

在线尝试!



4

的Java(OpenJDK的8) 138个 135 134字节

s->{String e,x="";for(int i=0,j,y=s.length();i<=y;i++)for(j=y;j>i;x+=e.matches("[aeiou]{2,}")?e+" ":"")e=s.substring(i,j--);return x;}

在线尝试!


i<y-1可以是i<=yand String#matches隐式检查整个String,因此您不需要^ and $。+1击败了我。正要发布我自己的138字节答案(但是我建议您将这些更改缩短一些)。:)
凯文·克鲁伊森


3

果冻,9字节

ẆḟÐḟØcḊÐf

在线尝试!

说明

ẆḟÐḟØcḊÐf  Main Link
Ẇ          Get all (contiguous) sublists
  Ðḟ       Filter; remove all elements where the result is truthy:
 ḟ  Øc     Filter; remove all vowels; if it's truthy, then it contains non-vowels
       Ðf  Filter; keep elements where the result is truthy:
      Ḋ    Dequeue; return all but the first element (truthy if the length was at least 2)

-4个字节感谢Xcoder先生


11字节通过更换L>1$$L’$
Xcoder先生17年

其实你可以替换L’$使用9个字节。等效为ẆṫLḊḟÐḟØc
Xcoder先生17年


3

R,137字节

马克超越了!

function(S)(x=unlist(sapply((s=el(strsplit(S,"[^aeiou]")))[nchar(s)>1],function(x)substring(x,1:(n=nchar(x)),rep(n:1,e=n)))))[nchar(x)>1]

在线尝试!

function(S){
 s <- el(strsplit(S,"[^aeiou]"))            # split on non-vowels
 s <- s[nchar(s)>1]                         # vowel groups of length at least 2
 p <- function(x){                          # generates all substrings of inputs
  n <- nchar(x)
  start <- 1:n
  stop <- rep(n:1, n)                       # this will generate dups
  substring(x, start, stop)
} q <- unlist(sapply(s, p)) # all substrings q <- q[nchar(q)>1] # all length-2 or more substrings }


您不需要unique
Xcoder先生17年

“允许使用任何合理的I / O格式和方法(对于输入和输出,字符列表也可以)。” 我还没有尝试过,但是我怀疑如果从一开始就使用字符列表,这可能会短很多。
user2390246 '11

@ user2390246。我不相信这一定会有所帮助,但这可能只是因为隔离元音运行的方法会大不相同,我现在无法全神贯注。
朱塞佩


2

PowerShell93 88字节

param($a)0..($b=$a.count-1)|%{($i=$_)..$b|%{-join$a[$i..$_]}}|?{$_-match'^[aeiou]{2,}$'}

在线尝试!

使用小写或大写I / O(或混合使用!)。

从我在Exploded Substrings上的答案中借用代码以获取所有子字符串,然后拉出那些正则表达式所-match针对的子字符串,^[aeiou]{2,}$即长度至少为两个元音且仅包含元音的那些。这些字符串留在管道上,输出是隐式的。


2

Haskell中148 137 130 123 118字节

感谢@Laikoni提供-11个字节,将-7个字节指向高尔夫球技巧,再加上-7个字节,再加上-5个字节,进一步增加了-7个字节,总共有-30个字节。

对于Haskell来说,这看起来很合适,但结果似乎并不相同。我想Haskell毕竟是一个可以接受的选择。我仍然对subsequences工作方式感到恼火。

import Data.List
v=(`elem`"aeiou")
p s=nub$do x<-groupBy((.v).(&&).v)s;[y|y@(c:_:_)<-subsequences x,v c,y`isInfixOf`x]

在线尝试!


1
欢迎参加Haskell打高尔夫球!你可能会感兴趣我们在收集高尔夫提示,该指南高尔夫规则作者单子和人,我们的Haskell的聊天室。
Laikoni '17

1
您的答案有几点需要注意:换行符与的字节数相同;,但是增加了代码的可读性。您始终e与一起使用v,因此可以直接声明e=(elem "aeiou")y!!0比短head y。有concatMap代替concat.map,但从(=<<)列表中更短的是monad wich具有相同的效果。
Laikoni '17

1
您可以导入Data.Lists而不是Data.List。前者具有后者的所有功能,但还具有诸如的其他功能powerslice,它提供了所有连续子序列的列表。
nimi

1
在列表理解中,您可以匹配y@(h:_:_)以拖放到length y>1并缩短v(y!!0)v h
Laikoni '17

1
我袖子上还有两个ace:(1)(\x y->v x&&v y)可以通过转换为无点数来缩短,方法是使用此技巧手动或使用pointfree.io。(2)列表单子也可以与使用do的符号,也就是do x<-l;[...]相同l>>=(\x->[...])。顺便说一句,在TIO上,您可以将其main放入页眉或页脚字段,以使字节数与实际提交的内容相匹配。
Laikoni '17

2

Perl,45个字节

local $,=" ";print $_=~/(?=([AEIOU]{2,}))/ig;

欢迎来到PPCG!不错的第一篇文章!
Rɪᴋᴇʀ

1
以防万一,您可能会对社区投票帐户自动置位,因为您的帖子已被编辑。抱歉,我们对此无能为力,这是愚蠢的行为。希望upvotes应该触发自动downvote撤回。
HyperNeutrino

2

R120字节 110字节

function(x){k=nchar(x);i=k:1;e=expand.grid(i,i[-1]);grep("^[aeiou]+$",mapply(substr,x,e[,2],e[,2]+e[,1]),v=T)}

在线尝试!

怎么运行的

function(x){                  #initalize the anonymous function where input is stored in x
  k=nchar(x)                  #set k to the number of characters in x
  i=k:1                       #create vector of integers from k to 1
  e=expand.grid(i,i[-1])      #create matrix of full outer join on i 
                              #except in the second column, limit i to being less than k
  grep("^[aeiou]+$",          #search for strings made of only vowels
       mapply(substr,         #map the substring function
              x,              #with x as the string to subset
              e[,2],          #start at the second column of the outer join
              e[,2]+e[,1]     #end at the sum of the sum of the first and second columns
       ),
       v=T                    #if a match is found, return it's value
  )
}                             #by default, R returns the last line of a function

105字节的好方法,我将在解决方案中添加一条注释,指出您已经超越了我:)
Giuseppe

老实说,我很高兴能够为您提供一个替代解决方案:)通常,您比我早​​了几年,或者已经弄清了我桌上剩下的所有代码。
标记

1

C,119字节

f(char*s){*s&&f(s+1);char*t,*b=calloc(strlen(s),1);for(t=b;*s==65|*s==69|*s==73|*s==79|*s==85;b[1]&&puts(b))*t++=*s++;}

在线尝试!


1

JavaScript(ES6),105个字节

s=>eval('a=[];l=i=s.length;while(i--){j=l;while(j--)if(/^[aeiou]{2,}$/.test(t=s.slice(i,j)))a.push(t)}a')

大概还有很多高尔夫球要做。

let f=
s=>eval('a=[];l=i=s.length;while(i--){j=l;while(j--)if(/^[aeiou]{2,}$/.test(t=s.slice(i,j)))a.push(t)}a')
console.log(JSON.stringify(f('r67^^()*6536782!87')))
console.log(JSON.stringify(f('programming puzzles and code golf')))
console.log(JSON.stringify(f('aaand... i won!')))
console.log(JSON.stringify(f('abeoic')))
console.log(JSON.stringify(f('yah eioo ala')))
console.log(JSON.stringify(f('@yabeeeayio__e')))
console.log(JSON.stringify(f('0ioen0aaiosnjksd')))



1

05AB1E,10个字节

Œʒg≠}ʒžMм_

在线尝试!

说明:

Œʒg≠}ʒžMм_  
Œ            Push all substrings (abeoic => a, b, e, ..., eoi, eoc, ... abeioc)
 ʒ  }        Filter elements for which result is 1
  g≠            Push 1 if length is != 1, 0 otherwise
     ʒ       Filter elements for which result is 1
      žMм       Remove all occurences of 'aeiou' from element
         _      Negative bool: push 1 if length == 0, 0 otherwise

好答案!我有ŒʒžMм_}ʒg≠
Xcoder先生,2017年

@ Mr.Xcoder谢谢。我也有ŒD1ùKʒžMм_10个字节。我正在尝试找到一种
消遣

1

C,105 75字节

该函数接受指向小写输入的指针,并在标准输出上生成以空格分隔的字符串:

i;f(char*p){for(i=strspn(p,"aeiou");i>1;)printf("%.*s ",i--,p);*p&&f(p+1);}

测试程序

#include <stdio.h>

int main(int argc, char **argv)
{
    for (int i = 1;  i < argc;  ++i) {
        char *in = argv[i];
        printf("'%s' -> [ ", in);
        f(in);
        puts("]");
    }
}

演示版

'r67^^()*6536782!87' -> [ ]
'programming puzzles and code golf' -> [ ]
'aaand... i won!' -> [ aaa aa aa ]
'abeoic' -> [ eoi eo oi ]
'yah eioo ala' -> [ eioo eio ei ioo io oo ]
'@yabeeeayio__e' -> [ eeea eee ee eea ee ea io ]
'0ioen0aaiosnjksd' -> [ ioe io oe aaio aai aa aio ai io ]

说明

#include <string.h>
#include <stdio.h>

void find_polyphthongs(char *p)
{
    /* from longest polyphthong substring down to 2 */
    for (int i = strspn(p,"aeiou");  i >= 2;  --i) {
        /* print exactly [p .. p+i] */
        printf("%.*s ", i, p);
    }

    /* tail-recurse to next char */
    if (*p) {
        find_polyphthongs(p+1);
    }
}

在Debian Linux上使用GCC,我似乎逃脱的不兼容的隐式声明的strchr()printf()。其他平台可能需要<stdio.h><string.h>被包括在内。

在线尝试(需要Javascript)。


f(p)char*p;不能f(char*p)
乔纳森·弗雷希

完全正确-我本来可以输出到呼叫者分配的存储:f(s,d)char*s,*d
Toby Speight


1

APL(Dyalog),53字节

这是一个Dfnd I整流器˚F unctio Ñ)。用法是p '<argument>'。合理的警告:这不是很有效,并且input > 8 characters在TIO上超时,但是在有足够的时间时可以正常工作。

p←{(G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/G←⊃,/{(,v∘.,⊢)⍣⍵⊢v'aeiou'}¨⍳≢1↓⍵}

在线尝试!

感谢@Adám提供16个字节!

怎么运行的:

如果我们将代码分成较小的部分,则更容易理解:

  • Part 1 - G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: This part of the function takes the length of the (right) argument and mixes the vector aeiou to itself that many times, yielding every possible combination of [2, length(right arg)] vowels.
  • Part 2 - (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/: This part checks which element(s) of G are members of the substrings of the input. This returns a boolean vector, with 1's at the indices of the vowel combinations that are present in the input and 0's where they're not. The resulting vector is then mapped (/) over G, returning the elements corresponding to the truthy values.

The whole thing is then assigned to p. p← is not included in the byte count because it's not necessary, it just makes using the function easier.


Golfed further. Also, you shouldn't use to filter. Use /.
Adám


1

Ruby 2.4, 100 bytes

(2..(b=(a=gets).size-1)).to_a.flat_map{|i|(0..(b-i)).to_a.map{|j|a[j,i]}}.select{|k|k=~/^[aeiou]+$/}

This is my first attempt at golfing, and I'm sure there are lots of ways to shorten this code.




0

T-SQL (SQL Server 2014), 281 bytes

;with s as(select substring(@,1,1)C,stuff(@,1,1,'')D,1 R union all select substring(D,1,1),stuff(D,1,1,''),R+1from s where len(D)>0),c as(select R i,C w from s where C LIKE'[aeiou]'union all select R,w+C from c join s ON i+1=R where s.C LIKE'[aeiou]')select w from c where len(w)>1

Input give by

declare @ varchar(max) = 'abeoic'

Uses a common table expression s to blow the input apart into ordered individual letters, and then a second common table expression c to generate all ordered combinations, throwing out non vowels.

SQL Fiddle


0

PHP, 139 bytes

function y($s){$p=[];$l=strlen($s);for($i=2;$i<=$l;$i++)for($j=0;$j<=$l-$i;$j++)strspn($a=substr($s,$j,$i),'aeiou')==$i&&$p[]=$a;return$p;}

Online demo

function yreadable($s)
{
    $p = [];
    $l = strlen($s);
    for($i=2; $i<=$l; $i++)
        for($j=0; $j<=$l-$i; $j++)
            strspn($a=substr($s,$j,$i),'aeiou')==$i
            && $p[] = $a;
    return $p;
}

How it works

Select sub-strings (beginning with the length of 2) consisting of adjacent characters and move along string. Collect any sub-strings that only contain vowels. Repeat with longer sub-strings.

For string 'abcdef' these are the substrings generated and checked:

'ab','bc','cd','de','ef'
'abc','bcd','cde','def'
'abcd','bcde','cdef'
'abcde','bcdef',
'abcdef'
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.