入力文字列からn個以上の連続した母音を削除する


19

母音が3つ以上連続する文字列は好きではありません。言葉から不要な母音をすべて削除するプログラムを作成できますか?

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

入力は、印刷可能なASCII文字(0x20から0x7Eまで)のみを含む文字列です。

出力は、最大3つの連続した母音の実行のみを含む文字列です。入力文字列に連続する3つ以上の母音が連続する場合、プログラムは、その連続した最初の3つの母音を含む出力文字列を生成し、それ以降の連続する母音を破棄します。

Yは、この課題のための母音ではありません。

これはコードゴルフであるため、最短のコード(バイト単位)が優先されます。

テストケース

"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."

2
のように、大文字と小文字が混在するテストをいくつか含める必要がありますaaYYAAaaaAERGH
ズガルブ

回答:


5

Pyth、21バイト

sfg3=Z&}rT0"aeiou"hZz

オンラインで試す:デモンストレーションまたはテストスイート

説明:

すべての文字を繰り返し処理し、カウンターを使用して渡された母音の数を追跡します。母音ではないcharを渡すたびに、カウンターを0にリセットします。カウンターが4を超えるたびにcharを削除します。

sfg3=Z&}rT0"aeiou"hZz   implicit: z = input string
                                  Z = 0
 f                  z   test every char T in z; keep chars, that return true:
        rT0                convert T to lower
       }   "aeiou"         test if T is a vowel
      &           hZ       logical and with Z+1, 
                           gives 0 if ^ is false, otherwise Z+1
    =Z                     update Z with this value
  g3                       test if 3 >= Z
s                       sum up all remaining chars and print

10

読み取り不可、1647バイト

'"" "" "'" "'" "" "" "'" "" '"" "" ""' "" '""' "" "'" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" """ "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" """" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' '" "" "" "" "" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" ""' "" "" "" " "" "" "" "" "" '"" "" "" "" "" "" "" "" "'" "" "" "" "'" "" "" """'" "" "" "" "" "" "" "" "'" "" "" "" "'" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""' "" "" "" "" '"" "" "" ""'"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "'" "" '"" "" "" " "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" """" "" "" "" "" '"" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" '"" "" "" ""' "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" "" "'" "" "" "" "" "" "" "" "" "" "" "" "" '"" """" "" "" "" "" "" '"" "" "" "" "" "'" "" "" "" "'" "" "" "'" "" '"" " "" "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "'" "" "" "" "" "" "" "" "" "" "'" ""' "" "" "" "" '"" """ "" "" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "'" "" "" "" "" '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "'" "" "" "" "" "" "" "" "" ""' "" "'" "" "" "" "" "" "" "" ""'"" "" "" ""' "" "" "" "" "" "" "" "" '"" "" "" "" "" ""' "" "" "" '"" "'" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "" "" "" "" "" "" "' "" "" "" "" "" "" "" "'" ""' "" "" "" "" '"" "" "" ""' "" "" "" ""'" "" "" "" "" "" "" "" "" "" "" "" ""' "" "" "" "'" ""' "" "" "" "" " '"" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" " "" "" "" "" "" "" "" "" "" "" "" "" '"" "'" "" '"" "'" "" '"" "'"" "'" "" "" ""' "" "'" ""' "" "'" "" "" "" "" "" "'" "'" "'" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "'" "'" "" '"'" "" "" "" '"" "" "' "" "" "" "" "'" "'" "" '"" "" "" "" ""' "" '"" "'" "" "'"' "" "" """ '""' "" '"" "'" "" "" "'" "'" "" '"" "" "" "'" ""

説明

このプログラムは、次のような擬似コードと同等です。

while (cp = (ch = read)) + 1 {
    (
        (cp -= 65) ?    // A
            (cp -= 4) ?     // E
                (cp -= 4) ?     // I
                    (cp -= 6) ?     // O
                        (cp -= 6) ?     // U
                            (cp -= 12) ?    // a
                                (cp -= 4) ?     // e
                                    (cp -= 4) ?     // i
                                        (cp -= 6) ?     // o
                                            (cp - 6) ?      // u
                                                0
                                            : 1
                                        : 1
                                    : 1
                                : 1
                            : 1
                        : 1
                    : 1
                : 1
            : 1
        : 1
    ) ? ((--vs)+4) ? print(ch) : (++vs) : {
        print(ch)
        vs = 0
    }
}

次の変数割り当てを使用します。

0   (unused)   (13 bytes)
1   cp         ( 4 bytes; occurs 20× in the code)
2   vs         ( 7 bytes; occurs  5× in the code)
3   ch         (10 bytes; occurs  3× in the code)

ご覧のとおり0、書き込みが非常に長いため、可変スロット0 は避けました。

各文字を読み、両方に値を格納し、私たちはそうcpch。変更しますcpch、必要に応じて印刷できるように維持します。数字65、4、4、6などを連続して減算してcp、ASCIIの10個の母音文字のそれぞれであるかどうかを確認します(最後の文字は割り当てである必要はありません)。

vs常に印刷できる母音の数よりも3少ない数が常に含まれます。で始まる0ため、3つの母音を印刷できます。に達すると-3、母音の印刷を停止します。

母音を含む)非母音に遭遇した場合、を実行print(ch)vs = 0ます。おそらくご想像のとおり、これにより母音カウンターがリセットされます。

母音に出会ったら、実行し((--vs)+4) ? print(ch) : (++vs)ます。これを分解しましょう:

  • デクリメントvs;
  • 値がnowの場合、-4行き過ぎているので、何も出力せずに、母音の出力を拒否し続けるようにvs戻ります。-3
  • それ以外の場合は、文字を印刷します。

1
この言語はその名前に忠実です。
bkul

2
これらの言語の私はいつも不思議... +1「彼らは実際にそうであれば、私の同情それら...手で、このうちを書きましたか?」
アディソンCrumpの


6

JavaScript(ES6)、42

匿名関数として

s=>s.replace(/[aeiou]+/gi,v=>v.slice(0,3))

4

Perl、27文字

(26文字のコード+ 1文字のコマンドラインオプション)

s/[aeiou]{3}\K[aeiou]+//gi

大したことではなく、私が覚えているまれな機会\Kが存在します。

サンプル実行:

bash-4.3$ perl -pe 's/[aeiou]{3}\K[aeiou]+//gi' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

2
Retinaの回答を作成したとき、\K「。NET正規表現があればいいのに」と思いました。:)
マーティンエンダー

興味深い、@MartinBüttner。これらの正規表現が深刻なステロイド食に置かれていると感じました。好奇心のために、彼らは再帰的なサブパターンを持っていますか?結果は長くなりますが、母音の列挙を1つ省くことができますs/([aeiou]{1,3})(?1)+/$1/gi
マナトワーク

残念ながら、どちらにもパターンの再利用はありません。これらは2つのことですたまに作る私に切り替える PerlやPCREに。Retinaの正規表現フレーバーにいくつかの簡単なものをパッチすることに取り掛かるとき、それらを追加すると思います(真の再帰ではなく、少なくともパターンの再利用と有限の再帰)。
マーティンエンダー

2

真剣に、34バイト

,;ù0╗`Ok"aeiou"Okd-Y;╜+*;╗4>`M@░εj

六角ダンプ:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

オンラインで試す

Pyth解答と同じアルゴリズムを使用して、レジスター内の現在の母音の長さを追跡しながら文字列をマッピングし、現在の文字が母音であるたびにそれをインクリメントし、許可された長さを超えているかどうかを確認します。その場合は0を返し、この生成されたフィルターで元の文字列をフィルターします。文字列に対してセット減算を使用できるようになると、はるかに短くなります。(をOk削除Okdでき、だけで置き換えることができます@)。この機能は次のアップデートで提供されると聞きました。


2

C、166バイト

最短の答えではありませんが、うまくゴルフをしていると思います。

#define V v[1][i]!=
#define P printf("%c",v[1][i]),j
j;main(i,v)char**v;{for(i=0;V 0;i++)(V 97&V 'e'&V 'i'&V 'o'&V 'u'&V 65&V 69&V 73&V 79&V 85)?P=0:j>3?j++:P++;}

テストケース:

$ a.exe "We're queueing up for the Hawaiian movie."

We're queung up for the Hawaiin movie.

$ wc -c vowels.c 

166 vowels.c

2

Mathematica、68バイト

a=Characters@"aeiouAEIOU";StringReplace[#,b:a~Repeated~{3}~~a..:>b]&

正規表現の答えは同じ長さになりますが、誰が正規表現を使用しますか?


2

Java、115バイト

class a{public static void main(String[] a){System.out.println(a[0].replaceAll("(?i)([aeiou]{3})[aeiou]*","$1"));}}

プログラムパラメーターとしての入力が必要です。

ユニットテストの出力:

Aei
screeen
We're queung up for the Hawaiin movie.

String[]との間のスペースを削除して1バイト節約しますaString[]a
ポケ

printではなくを使用して2バイト節約しますprintln。仕様に末尾の改行が必要だとは思わない。
ポケ

2

APL、40文字

{⍵/⍨1↓4≠⊃+/(1-⍳4)⌽¨⊂'aeiouAEIOU'∊⍨' ',⍵}

英語で:

  • 'aeiouAEIOU'∊⍨' ',⍵:母音を見つけます(そして回転時に中断するためにスペースを追加します);
  • (1-⍳4)⌽¨⊂:0、1、2、3回(ラップアラウンドで)回転させて、ブールベクトルを右に押します。
  • ⊃+/ sum:回転とボックス解除
  • 1↓4≠:4以外のものを見つけて、最初のものを削除します(先頭に追加したスペースのために)
  • ⍵/⍨:引数には、合計が4以外の要素のみを保持します。

1

Perl 6の 36の  35バイト

{S:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/} # 36 bytes

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' # 34 + 1 = 35 bytes

使用法:

$ perl6 -pe 's:g:i/(<[aeiou]>**3)<[aeiou]>+/$0/' <<< "
> Aeiou
> screeeen
> We're queueing up for the Hawaiian movie.
> Spaces break runs: aei iou."
Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

1

C(205バイト)

#include <stdio.h>
#define T(x)for(i=0;i<10;++i){if(v[i]==x){b=x;m=1;break;}}putchar(c);
main(b,c,i,m){char v[]="aeiouAEIOU";
while((c=getchar())!=EOF){if(!m){T(c);}else{if(b==c)continue;else{m=0;T(c);}}}}

(わかりやすくするために改行を1つ追加しました)


1

Scala、107バイト

readLine.foldLeft("",0)((a,n)=>if(!"aeiou".contains(n|32))a._1+n->0 else if(a._2>2)a else(a._1+n,a._2+1))_1

1

Javascript ES6、43文字

s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")

テスト:

f=s=>s.replace(/([aeiou]{3})[aeiou]*/gi,"$1")
;`"Aeiou" => "Aei"
"screeeen" => "screeen"
"We're queueing up for the Hawaiian movie." => "We're queung up for the Hawaiin movie."
"Spaces break runs: aei iou." => "Spaces break runs: aei iou."`
.replace(/"/g,"").split("\n").every(s=>f((s=s.split(" => "))[0])==s[1])

1

x86 MS-DOS .COMファイル44バイト 36バイト

.COMファイルは、MS-DOS 1から現在まで広くサポートされています--- 8086コマンドのみを使用して、dosemuで実行しています。

母音をテストするために個別のコマンドを使用する代わりに、REPNE SCASBを使用して母音をテストすることにより、44バイトから36バイトに削減されました。

Hex dump, reversible using `xxd -r -seek -256`:
0100: b3 03 43 b4 08 cd 21 88 c2 24 df b1 05 bf 1f 01   ..C...!..$......
0110: f2 ae 74 02 b3 05 4b 74 e9 b4 02 cd 21 eb e4 41   ..t...Kt....!..A
0120: 45 49 4f 55                                       EIOU

Unassembled using debug:
0100 B303    MOV BL,03     ; initialize counter to 3 (will increment by 1 to be 4)
0102 43      INC BX        ; increment counter--runs each time it hits 0 so it never goes <0
0103 B408    MOV AH,08     ; 
0105 CD21    INT 21        ; with AH=8, read 1 char without echo
0107 88C2    MOV DL,AL     ; copy input for potential output
0109 24DF    AND AL,DF     ; make input uppercase for testing
010B B105    MOV CL,05     ; count of 5 vowels to test against
010D BF1F01  MOV DI,011F   ; location of first vowel to test against
0110 F2AE    REPNE SCASB   ; test input against each vowel
0112 7402    JZ 0116       ; if input was not a vowel:
0114 B305    MOV BL,05     ;    reset counter to 5 (will decrement by 1 to be 4)
0116 4B      DEC BX        ; decrement counter regardless
0117 74E9    JZ 0102       ; if hit 0 (fourth or later vowel): goto 102
0119 B402    MOV AH,02     ; 
011B CD21    INT 21        ; with AH=2, print char
011D EBE4    JMP 0103      ; go to 103 for next character

bytes 011f-0123 contain the uppercase vowels AEIOU

1

Matlab / Octave、54バイト

@(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

例:

>> @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')
ans = 
    @(s)regexprep(s,'(?<=[aeiouAEIOU]{3})[aeiouAEIOU]','')

>> ans('We''re queueing up for the Hawaiian movie.')
ans =
We're queung up for the Hawaiin movie.

ideoneで試してみてください


1

V、21バイト(非競合)

ñ[aeiou]ñÍãqû3}úsq*

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

説明:

ñ[aeiou]ñ                     "Assign the string `[aeiou]` to register 'q'
         Íã                   "Search and replace on multiple lines (case insensitive):
           <C-r>q             "Register 'q'
                 û3}          "Repeated 3 times
                    ús        "Mark the following to be removed:
                      <C-r>q* "Register 'q' repeated any number of times

これは、より単純なソリューションよりもほんの少し短いだけです。

Íã[aeiou]û3}ús[aeiou]*

(22バイト)


0

ルビー、44バイト

><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')

例:

% ruby -e "$><<$<.read.gsub(/([aeiou]{3})[aeiou]+/i,'\1')" <<< "
Aeiou
screeeen
We're queueing up for the Hawaiian movie.
Spaces break runs: aei iou."

Aei
screeen
We're queung up for the Hawaiin movie.
Spaces break runs: aei iou.

「入力は、印刷可能なASCII文字(0x20〜0x7E、両端を含む)のみを含む文字列です。」では、なぜ$<.read複数行入力(したがって範囲外文字0x0aを含む)を処理するために余分な文字を費やしgetsますか?
マナトワーク

@manatworkそれは本当に良い点です、ありがとう!2-3バイト節約できると思います:)
ジョセフワイスマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.