私のポリトーンを見つけてください!


19

この課題の目的のために、polyphthongが唯一の母音が含まれていることを、文字列の連続したスライスとして定義され、長さが少なくとも2入力として非空の文字列を与えている、あなたのタスクは、出力することが含まれているすべての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']
abeoic-> ['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'それぞれ1回だけ出力できます(4番目のルールを参照)。

これはであり、すべての言語でバイト単位の最短の提出が勝ちです!


これは元々The Nineteenth ByteCMC(Chat Mini Challenge)として投稿されていましたが、AdámMain適していると言っていたので、結局投稿しました。
ミスターXcoder

3番目のテストケース、'aa'2回表示されます。同じ文字列をさまざまな場所に表示する場合、同じ文字列を複数回出力する必要がありますか、または一意のポリフトンのみを出力できますか?
ジョナサンフレッチ

@JonathanFrechわかりました、ユニークなポリフトンを出力するのは問題ないと思います。編集します。
ミスターXcoder

出力の順序は重要ですか?
OVS

1
@Xophmeister この課題の目的のために、ポリトーンは次のように定義されます -私はそれが正しい言語定義ではないことを知っています:
Mr. Xcoder

回答:


7

パイソン2102の 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'入力として小文字しか使用できないため、必要はないと思います。
ジョナサンフレッチ


@JonathanFrech print([w[a:b]for a in l for b in l[a+2:]if{*w[a:b]}<={*'aeiou'}])は93で働いています。-
リン

@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

テストケース

どうやって?

現在のノードが入力に含まれなくなったらすぐに枝を枝刈りし、少なくとも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!&`..+

オンラインでお試しください!

これは、ポリトーンのすべての出現を印刷します。

説明

Retinaには、重複するすべての一致を取得する方法がありますが、これは実際には、各位置から1つの一致を探すということです。したがって、同じ位置から複数の一致がある場合、これはそのうちの1つだけを返します。重複するすべての一致を実際に取得する唯一の方法は、この機能を2回使用することです。1回は左から右に、もう1回は右から左に一致します(したがって、可能な開始位置から可能な限り長い一致を取得し、可能な終了位置)。

実際のプログラム:

M!&`[aeiou]+

母音の重複するすべての実行を取得します。これが本当に意味することは、すべての母音のすべての接尾辞を取得することです。

r!&`..+

次に、右から左に一致することにより、少なくとも長さ2のすべてのプレフィックスを取得します。これMはプログラムの最終行であるため、ここでは暗黙的です。


コードを説明できますか?
アダム

!&`[aeiou]{2,}ですので、近く正しいと、それはに対して一致するように、それgreedier取得する方法はありますかio
AdmBorkBork

1
@Adám説明を追加しました。
マーティンエンダー

@AdmBorkBork私の説明は、なぜそれがうまくいかないのかをカバーしています。Retinaは実際の正規表現エンジンをいじらないので、最も&できるのは各位置からの一致を試みることです。そのため、同じ位置から異なる長さの複数の一致を持つことはできません。それが私が第二段階を必要とする理由です。
マーティンエンダー

いい説明、ありがとう。
AdmBorkBork

5

QuadS、20 + 1 = 21バイト

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

oフラグ

オンラインでお試しください!

事の発生順に:

[aeiou]+ このPCREの各マッチで

,\⍵M マッチのプレフィックス

1↓ 最初の1つをドロップします(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<=yString#matches暗黙的にチェックできるため、^ 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)

Xcoder氏のおかげで-4バイト


置き換えL>1$$11バイトL’$
ミスターXcoder

実はあなたは置き換えることができるL’$するために9バイト。同等のものはになりますẆṫLḊḟÐḟØc
ミスターXcoder

3

C(gcc)、104バイト(小文字のみまたは大文字のみで99バイト)

ええ、それは漏れます-それで何ですか?

#include<string.h>
a;f(char*s){*s&&f(s+1);for(a=strspn(s=strdup(s),"AEIOUaeiou");a>1;)s[a--]=0,puts(s);}

オンラインでお試しください!


3
なしでも機能するようで#include、大文字と小文字を1つだけ処理する必要があるため、80バイトに短縮できます。
-Steadybox


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

「合理的なI / O形式と方法はすべて使用できます(入力と出力の両方で、文字のリストも使用できます)。」試したことはありませんが、最初から文字リストを使用する場合、これはかなり短くなると思われます。
user2390246

おそらく@ user2390246。私はそれが必ずしも役立つとは確信していませんが、それはおそらく母音の連続を分離するアプローチがかなり異なるからであり、私は今それで頭を包むことができないからです。
ジュゼッペ


2

PowerShell93 88バイト

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

オンラインでお試しください!

小文字または大文字のI / Oを使用します(または混在します!)。

上の私の答えから借用したコード分解図サブストリングのすべてのサブストリングを取得するには、それらのその正規表現を引き出す-matchに対して^[aeiou]{2,}$すなわち、少なくとも二つの長さで母音だけ母音あるもの- 。これらの文字列はパイプラインに残り、出力は暗黙的です。


2

ハスケル148の 137 130 123 118バイト

-11バイトの@Laikoniに感謝し、ゴルフのヒント、さらに-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のチャットルーム。
ライコニ

1
あなたの答えに関するいくつかのメモ:改行はのバイト数と同じ;ですが、コードの可読性を高めます。常にe一緒に使用するvため、e=(elem を直接宣言できます"aeiou")y!!0はより短いhead y。のconcatMap代わりにがありますがconcat.map、より短いものは(=<<)同じモナドのリストからのものです。
ライコニ

1
Data.Lists代わりにインポートできData.Listます。前者には後者のすべての機能がありますが、などの追加機能もありpowerslice、すべての連続したサブシーケンスのリストが表示されます。
-nimi

1
リスト内包表記では、に一致しy@(h:_:_)てドロップしlength y>1、に短縮v(y!!0)できv hます。
ライコニ

1
スリーブにはさらに2つのエース(\x y->v x&&v y)があります:(1)このヒントを使用し手動で、またはpointfree.ioを使用して、ポイントフリーに変換することで短縮できます。(2)リストモナドはdo表記法でも使用できます。これdo x<-l;[...]はと同じl>>=(\x->[...])です。ところで、TIOではmain、ヘッダーまたはフッターフィールドに入力して、実際の送信とバイトカウントを一致させることができます。
ライコニ

2

Perl、45バイト

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

PPCGへようこそ!素敵な最初の投稿!
Rɪᴋᴇʀ

1
ダウン票について疑問がある場合は、投稿が編集されたために、コミュニティボットアカウントによって自動的に配置されました。申し訳ありませんが、それについて私たちが本当にできることは何もありません。うまくいけば、アップ投票が自動ダウン投票の引き込みをトリガーするはずです。
ハイパーニュートリノ

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バイトの素晴らしいアプローチです。ソリューションにコメントを追加して、あなたが私を凌gしていることに注意してください:)
ジュゼッペ

正直なところ、私はあなたの代替ソリューションを思いついたことができて非常にうれしいです:)通常、あなたはすでに私より数年先を進んでいるか、テーブルに残したすべてのコードを理解しています。
マーク


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に

@ 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
トビーSpeight


1

APL(Dyalog)、53バ​​イト

これはDfnd irect f unctio n)です。使用法はp '<argument>'です。公正な警告:これはあまり効率的ではなくinput > 8 characters、TIOでタイムアウトになりますが、十分な時間を与えられれば正常に機能します。

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

オンラインでお試しください!

16バイトの@Adámに感謝します!

使い方:

これは、コードを小さな部分に分割すると理解しやすくなります。

  • パート1- G←⊃,/{(,v∘.,⊢)⍣⍵⊢v←'aeiou'}¨⍳≢1↓⍵:関数のこの部分は、(右の)引数の長さを取り、ベクトルaeiouをそれ自体と何度も混合し、[2, length(right arg)]母音のすべての可能な組み合わせを生成します。
  • パート2- (G∊⊃,/⌽,\∘⌽¨,\⌽⍵)/:このパートは、Gのどの要素が入力のサブストリングのメンバーであるかをチェックします。これは1、入力に存在する母音の組み合わせのインデックスに0'sがあり、そうでない場合は' sであるブールベクトルを返します。結果のベクトルは、次にマップされます(/Gれ、真理値に対応する要素が返されます。

全体がに割り当てられpます。p←必要ではないため、バイトカウントに含まれていません。関数の使用が簡単になります。


さらにゴルフ。また、フィルタリングには使用しないでください。を使用し/ます。
アダム


1

Ruby 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を使用して、入力を順序付けられた個々の文字に分解し、次に2番目の共通テーブル式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.