내 polyphthongs를 찾아라!


19

이 문제를 해결하기 위해 polyphthong 은 모음 만 포함하고 길이는 2 이상인 문자열의 연속 슬라이스로 정의됩니다. 비어 있지 않은 문자열을 입력으로 지정하면 포함 된 모든 polyphthong을 출력해야합니다. .

예를 들어 "abeoic"다음과 같은 연속 슬라이스 (공백으로 구분)가 있습니다.

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

모음 이외의 것을 포함하거나 길이가 2보다 작은 것을 제거하면 원하는 polyphthong이 나타납니다.

eo oi eoi

제출물은 다음 규칙을 준수해야합니다.

  • I / O에 대해 소문자 또는 대문자를 선택할 수 있지만 출력 케이스는 입력 케이스와 일치해야합니다.

  • 모음은 aeiou(소문자) 및 AEIOU(대문자)입니다. y/ Y는 모음으로 간주되지 않습니다.

  • 입력은 인쇄 가능한 ASCII 만 포함합니다.

  • polyphthong이 여러 번 나타나는 경우 한 번만 출력하거나 모든 발생을 출력하도록 선택할 수 있습니다.

  • 합리적인 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'각각 한 번만 (네 번째 규칙을 참조하십시오).

이것은 이며 모든 언어에서 가장 짧은 바이트 제출입니다.


이것은 원래 The Nineteenth Byte 에서 CMC (Chat Mini Challenge) 로 게시 되었지만 AdámMain에 적합 하다고 말 했으므로 결국 게시했습니다.
Mr. Xcoder

세 번째 테스트 사례 'aa'는 두 번 나타납니다. 다양한 위치에 동일한 문자열을 여러 번 출력해야합니까 아니면 고유 한 폴리 프통 만 출력 할 수 있습니까?
Jonathan Frech

@JonathanFrech Ok, 고유 한 polyphtong을 출력하는 것이 좋습니다. 편집합니다.
Mr. Xcoder

출력 순서가 중요합니까?
ovs

1
@Xophmeister 이 도전의 목적은 같은 polyphthong 정의되어 내가 그 올바른 언어 적 정의 :-)하지 알고 -
씨 Xcoder

답변:


7

파이썬 2 , 102 97 바이트

-5 바이트에 대한 @JonathanFrech 덕분에

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'소문자 만 입력 할 수 있기 때문에 필요하지 않습니다 .
Jonathan Frech


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])는 93 명을 위해 일합니다.
Lynn

@Lynn 그리고 당신의 솔루션은 96 파이썬 2 바이트를 생성 합니다 .
Jonathan Frech

6

자바 스크립트 (ES6), 77 75 바이트

소문자로 입력해야합니다. 반복하지 않고 독특한 polyphthong을 출력합니다.

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

테스트 사례

어떻게?

우리는 가능한 모든 polyphthong의 트리를 재귀 적으로 빌드하고, 현재 노드가 더 이상 입력에 포함되지 않는 즉시 가지를 잘라 내고 일치하는 모든 노드를 2 자 이상 저장합니다.

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이 인쇄됩니다.

설명

Retina는 모든 겹치는 일치 항목 을 가져 오는 방법 이 있지만 이것이 의미하는 바는 각 위치에서 하나의 일치 항목을 찾는 것입니다. 따라서 동일한 위치에서 여러 개의 일치 항목이있는 경우이 중 하나만 반환합니다. 겹치는 모든 일치 항목을 실제로 얻는 유일한 방법은이 기능을 두 번 사용하는 것입니다. 한 번 왼쪽에서 오른쪽으로, 한 번 오른쪽에서 왼쪽으로 일치하는 것입니다 (먼저 가능한 각 시작 위치에서 가장 긴 일치 항목을 찾은 다음 가능한 결말 위치).

실제 프로그램은 다음과 같습니다.

M!&`[aeiou]+

겹치는 모음을 모두 가져옵니다. 이것이 실제로 의미하는 것은 모든 모음 실행의 모든 ​​접미사를 얻는 것입니다.

r!&`..+

이제 오른쪽에서 왼쪽으로 일치시켜 길이가 2 이상인 모든 접두사를 가져옵니다. 는 M이 프로그램의 마지막 줄 때문에, 여기에 암시 적이다.


코드를 설명 할 수 있습니까?
Adám

!&`[aeiou]{2,}이다 너무 가까이 해결하려면 , 그것은에 일치하도록 그것을 탐욕 얻을 수있는 방법이 있나요 io?
AdmBorkBork

1
@ Adám 설명을 추가했습니다.
마틴 엔더 17

@AdmBorkBork 내 설명은 왜 작동하지 않는지 설명합니다. Retina는 실제 정규식 엔진을 사용하지 않으므로 &각 위치에서 일치하는 것을 시도하는 것이 가장 가능하므로 동일한 위치에서 길이가 다른 여러 개의 일치를 가질 수 없습니다. 그래서 두 번째 단계가 필요합니다.
마틴 엔더

좋은 설명 감사합니다.
AdmBorkBork

5

QuadS , 20 + 1 = 21 바이트

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

o플래그

온라인으로 사용해보십시오!

발생하는 순서대로 :

[aeiou]+ 이 PCRE의 각 경기에서

,\⍵M 경기의 접두사

1↓ 첫 번째 모음을 삭제하십시오 (하나의 모음이 있음)

,/⍵ 모든 접두사 목록을 연결

 공개 (감소가 /동봉 되기 때문에 )


이것은 Dyalog APL 암묵 함수와 동일합니다.

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

온라인으로 사용해보십시오!



4

자바 (오픈 JDK 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<=yString#matches당신이 필요가 없습니다, 암시 적 검사 전체 문자열 ^$. 그래도 나를 때려 +1. 내 자신의 138 바이트 답변을 게시하려고했습니다 (그러나 이러한 변경 사항으로 귀하의 제안이 더 짧습니다). :)
Kevin Cruijssen


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)

Mr. Xcoder 덕분에 -4 바이트


로 교체 L>1$$하여 11 바이트L’$ .
Mr. Xcoder

사실 당신은 대체 할 수있는 L’$에 대한 9 바이트 . 동등한 것입니다 ẆṫLḊḟÐḟØc.
Mr. Xcoder


3

R 137 바이트

마크에 의해 outgolfed !

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.
Mr. Xcoder

"합리적인 I / O 형식과 방법이 허용됩니다 (입력 및 출력 모두에 대한 문자 목록도 좋습니다)" 나는 그것을 시도하지는 않았지만 처음부터 문자 목록을 사용하면 이것이 훨씬 짧을 수 있다고 생각합니다.
user2390246

아마 @ user2390246. 나는 그것이 반드시 도움이 될 것이라고 확신하지는 않지만 아마도 모음을 분리하는 접근법이 상당히 다르기 때문에 지금 머리를 감쌀 수 없기 때문일 것입니다.
주세페


2

PowerShell , 93 88 바이트

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

온라인으로 사용해보십시오!

소문자 또는 대문자 I / O (또는 혼합!)를 사용합니다.

Exploded Substrings 에 대한 내 답변에서 코드를 빌려 모든 하위 문자열 을 얻은 다음 정규 표현식 -match에 해당하는 문자열을 가져옵니다 ^[aeiou]{2,}$. 이러한 문자열은 파이프 라인에 남아 있으며 출력은 암시 적입니다.


2

하스켈 , 148 137 130 123 118 바이트

-11 바이트에 대한 @Laikoni 덕분에 골프 팁, 또 다른 -7 바이트 및 또 다른 -5 바이트를 가리켜 총 -30 바이트에 대해 -7 바이트를 더 얻었습니다.

이것은 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
하스켈 골프에 오신 것을 환영합니다! 당신은 우리에 관심이있을 수있는 골프 팁 컬렉션골프 규칙에 가이드를 하고 모나드와 남자의 , 우리의 하스켈 대화방.
Laikoni

1
답변에 대한 참고 사항 : 줄 바꿈은와 동일한 바이트 수를 ;갖지만 코드의 가독성을 높입니다. 항상와 e함께 사용 v하므로 e=(elem을 직접 선언 할 수 있습니다 "aeiou"). y!!0보다 짧습니다 head y. 이 concatMap대신 concat.map하지만, 심지어 짧은은 (=<<)같은 효과를가집니다 느릅 나무 목록 모나드에서.
Laikoni

1
Data.Lists대신 가져올 수 있습니다 Data.List. 전자는 후자의 모든 기능을 가지고 있지만 powerslice, 과 같은 추가 기능을 가지고있어 모든 연속 서브 시퀀스의 목록을 제공합니다.
nimi

1
목록 이해, 당신은에 일치시킬 수 있습니다 y@(h:_:_)드롭 length y>1하고 단축 v(y!!0)v h.
Laikoni

1
소매에 2 개의 에이스가 더 (\x y->v x&&v y)있습니다 : (1) 이 팁 을 사용하거나 pointfree.io 를 사용 하여 포인트 프리로 전환하여 단축 할 수 있습니다 . (2)리스트 모나드도 함께 사용할 수있는 do, 즉, 표기 do x<-l;[...]와 동일하다 l>>=(\x->[...]). Btw에서는 TIO main에서 헤더 또는 바닥 글 필드에 바이트 수를 실제 제출과 일치시킬 수 있습니다.
Laikoni

2

펄, 45 바이트

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

PPCG에 오신 것을 환영합니다! 좋은 첫 포스트!
Rɪᴋᴇʀ

1
다운 보트에 대해 궁금한 경우 게시물이 편집되어 커뮤니티 봇 계정에 의해 자동으로 배치되었습니다. 죄송합니다. 우리가 할 수있는 일은 아무것도 없습니다. 멍청한 행동입니다. 바라건대 upvotes가 자동 downvote 후퇴를 트리거해야합니다.
HyperNeutrino

2

R , 120 바이트 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

솔직히 말해서, 나는 당신의 대안 솔루션을 생각해 낼 수있어서 매우 기뻤습니다 :) 일반적으로 당신은 이미 몇 년 전에 나보다 앞서 있거나 테이블에 남은 모든 코드를 알아냅니다.
Mark


1

자바 스크립트 (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에게

@ Mr.Xcoder 감사합니다. 나는 또한 ŒD1ùKʒžMм_10 바이트를 가지고 있었다 . 나는 그것을 골프 다운하는 방법을 찾으려고 노력하고있다
scottinet

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

데비안 리눅스에 GCC를 사용하여, 나는 호환되지 않는 암시 적 선언과 함께 도망하는 것 strchr()하고 printf(). 다른 플랫폼이 필요할 수 있습니다 <stdio.h><string.h> 포함되어야한다.

온라인으로 사용해보십시오 (Javascript 필요).


f(p)char*p;f(char*p)없습니까?
Jonathan Frech

아주 그렇습니다-원래 발신자 할당 스토리지로 출력했습니다 f(s,d)char*s,*d.
Toby Speight


1

APL (Dyalog) , 53 바이트

이것은 인 Dfn( D에 irect F unctio N ). 사용법은 p '<argument>'입니다. 공정한 경고 : 이것은 input > 8 charactersTIO에서 매우 효율적이지 않고 시간 초과 되지만 충분한 시간이 주어지면 정상적으로 작동합니다.

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

온라인으로 사용해보십시오!

16 바이트의 @ Adám에 감사합니다!

작동 방식 :

코드를 작은 부분으로 나누면 이해하기 쉽습니다.

  • Part 1- G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵: 함수의이 부분은 (오른쪽) 인수의 길이를 사용하여 벡터 aeiou를 여러 번 혼합하여 가능한 모든 조합을 생성합니다.[2, length(right arg)] 모음의 합니다.
  • Part 2- (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/:이 부분은 입력의 하위 문자열에 속하는 G의 요소를 확인합니다. 1입력에 존재하는 모음 조합의 색인에 0's'가 있고 그렇지 않은 곳에 's'를 포함 하여 부울 벡터를 반환합니다 . 그런 다음 결과 벡터가 ( /) 위에 매핑 G되어 정확한 값에 해당하는 요소가 반환됩니다.

그러면 모든 것이에 할당됩니다 p. 필요p← 하지 않기 때문에 바이트 수에 포함되지 않으므로 함수를 더 쉽게 사용할 수 있습니다.


더 골프를 쳤다. 또한 필터링 하는 데 사용해서는 안됩니다 . 사용하십시오 /.
Adám


1

루비 2.4, 100 바이트

(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]+$/}

이것이 골프를위한 첫 번째 시도이며이 코드를 단축 할 수있는 방법이 많이 있다고 확신합니다.




0

T-SQL (SQL Server 2014), 281 바이트

;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

에 의해 입력

declare @ varchar(max) = 'abeoic'

공통 테이블 표현식 s을 사용 하여 입력을 정렬 된 개별 문자로 분리 한 다음 두 번째 공통 테이블 표현식 c을 사용하여 모든 정렬 된 조합을 생성하고 모음이 아닌 것을 버립니다.

SQL 바이올린


0

PHP, 139 바이트

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

온라인 데모

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

작동 원리

인접한 문자로 구성된 하위 문자열 (길이 2로 시작)을 선택하고 문자열을 따라 이동하십시오. 모음 만 포함 된 하위 문자열을 수집합니다. 더 긴 하위 문자열로 반복하십시오.

문자열 'abcdef'의 경우 다음과 같은 하위 문자열이 생성되고 확인됩니다.

'ab','bc','cd','de','ef'
'abc','bcd','cde','def'
'abcd','bcde','cdef'
'abcde','bcdef',
'abcdef'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.