从输入字符串中删除n个以上连续的元音


19

我不喜欢连续三个以上元音的琴弦。您可以编写一个程序从单词中删除所有我不需要的元音吗?

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

输入是仅包含可打印ASCII字符(包括0x20至0x7E)的字符串。

输出是一个字符串,其中最多只能包含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
Zgarb 2015年

Answers:


5

Pyth,21个字节

sfg3=Z&}rT0"aeiou"hZz

在线尝试:演示测试套件

说明:

我遍历所有字符,并跟踪使用计数器传递了多少个元音。每次传递不是元音的字符时,都会将计数器重置为0。只要计数器> 4,我都会删除字符。

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它要写入的时间如此长。

因此,我们读取每个字符并将值存储在cp和中ch。我们将进行修改,cp但请保留ch在周围,以便在必要时可以进行打印。我们依次从中减去数字65、4、4、6等,cp以检查它是否是ASCII中10个可能的元音字符中的每一个(请注意,最后一个不需要是赋值)。

vs总是包含少于仍允许打印的元音数量的3。它始于0,因此可以打印3个元音。到达时-3,我们停止打印元音。

如果我们遇到一个非元音(包括空格),我们执行print(ch)之后vs = 0。您可能已经猜到了,这将重置元音计数器。

如果遇到元音,我们执行((--vs)+4) ? print(ch) : (++vs)。让我们分解一下:

  • 递减vs;
  • 如果现在的值是-4太远了,那么我们就走得太远了,所以不要打印任何东西,而是vs增加到,-3所以我们将继续拒绝打印元音。
  • 否则,打印字符。

1
该语言是其名称的真实名称。
bkul 2015年

2
我一直想知道这些语言...“他们实际上是用手写的吗?如果是的话,我很可惜...” +1
Addison Crump 2015年

9

视网膜,25字节

i`([aeiou]{3})[aeiou]+
$1

在线尝试。

相当简单的正则表达式替换。这也适用于相同的字节数:

Ri`(?<=[aeiou]{3})[aeiou]

3
最后!在线翻译!您应该考虑在github页面上链接到它。
mbomb007

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答案时,我以为“我希望.NET正则表达式具有\K”。:)
Martin Ender 2015年

有趣,@MartinBüttner。我感到那些正则表达式要服用严格的类固醇饮食。出于好奇,他们是否具有递归子模式?尽管结果更长,但可以帮助节省一个元音枚举:s/([aeiou]{1,3})(?1)+/$1/gi
manatwork 2015年

不幸的是,它们也没有模式重用。这是偶尔我切换到Perl或PCRE 的两件事。当我设法将一些简单的东西修补到Retina的正则表达式中时,我想我会添加那些(不是真正的递归,但至少是模式重用和有限递归)。
马丁·恩德

2

严重的是34个字节

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

十六进制转储:

2c3b9730bb604f6b226165696f75224f6b
642d593bbd2b2a3bbb343e604d40b0ee6a

在线尝试

它使用与Pyth答案相同的算法,在字符串上进行映射,同时跟踪寄存器中当前元音行的长度,每当当前字符是元音时就递增它,并检查其是否超过了允许的长度,如果是,则返回0,然后使用此生成的过滤器过滤原始字符串。一旦我们可以在字符串上使用集合减法,它就会短很多。(Ok可以删除,Okd也可以将其替换为just @)。我听说此功能将在下一次更新中...。


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[]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

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字节

从现在到现在,MS-DOS 1都广泛支持.COM文件-我仅使用8086命令以一定的剂量运行。

通过使用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 /八度,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

Ruby,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,包括0x20到0x7E)的字符串。”那么,为什么要花费额外的字符$<.read来处理多行输入(因此包含超出范围的字符0x0a)而不是gets
manatwork

@manatwork真的很不错,谢谢!认为它可以节省2-3个字节:)
Joseph Weissman 2015年
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.