입력 문자열에서 n 개 이상의 연속 모음 제거


19

나는 모음이 세 개 이상있는 줄을 좋아하지 않습니다. 단어에서 원하지 않는 모음을 모두 제거하는 프로그램을 작성할 수 있습니까?

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.
Zgarb

답변:


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은 피하는 것이 너무 길기 때문에 피했습니다 .

우리는 각 문자를 읽고 모두의 값을 저장 그래서 cpch. 필요한 경우 인쇄 할 수 있도록 수정 cp하고 보관 ch합니다. cpASCII에서 가능한 10 개의 모음 문자 각각인지 확인하기 위해 숫자 65, 4, 4, 6 등을 연속적으로 뺍니다 (마지막 문자는 할당 할 필요가 없습니다).

vs항상 인쇄 할 수있는 모음 수보다 3이 적습니다. 에서 시작하여 03 개의 모음을 인쇄 할 수 있습니다. 에 도달하면 -3모음 인쇄가 중지됩니다.

모음아닌 공간 (공백 포함)이 발생하면 print(ch)다음에 실행 됩니다 vs = 0. 당신이 아마 짐작했듯이, 이것은 모음 카운터를 재설정합니다.

모음 을 만나면 실행 ((--vs)+4) ? print(ch) : (++vs)합니다. 이것을 분해하자 :

  • 감소 vs;
  • 값이 now -4인 경우 너무 멀리 갔으므로 아무 것도 인쇄하지 말고 vs다시 증가 -3시켜 모음 인쇄를 계속 거부합니다.
  • 그렇지 않으면 문자를 인쇄하십시오.

1
이 언어는 그 이름에 충실합니다.
bkul

2
나는 항상이 언어로 궁금합니다 ... "실제로 손으로 쓰 셨나요? 그렇다면, 동정합니다 ..."+1
Addison Crump


6

자바 스크립트 (ES6), 42

익명의 기능으로

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

4

펄, 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

흥미로운, @ MartinBüttner. 나는 정규식이 심각한 스테로이드 다이어트에 적용되었다는 느낌을 받았습니다. 호기심을 위해 재귀 하위 패턴이 있습니까? 결과가 더 길지만 하나의 모음 열거를 절약하는 데 도움이 될 수 있습니다 s/([aeiou]{1,3})(?1)+/$1/gi.
manatwork

불행히도 패턴 재사용도 없습니다. 그것들이 때때로 Perl 또는 PCRE로 전환 하게 만드는 두 가지 입니다 . 간단한 것들을 Retina의 정규 표현식으로 패치 할 때, 나는 그것들을 추가 할 것이라고 생각합니다 (진정한 재귀가 아니라 최소한 패턴 재사용과 유한 한 재귀).
Martin Ender

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

자바, 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 바이트를 저장하십시오 a. String[]a
Poke

print대신 을 사용하여 2 바이트를 절약하십시오 println. 사양에 후행 줄 바꿈이 필요하다고 생각하지 않습니다.
Poke

2

APL, 40 자

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

영어로:

  • 'aeiouAEIOU'∊⍨' ',⍵: 모음을 찾고 회전 할 공간을 두십시오.
  • (1-⍳4)⌽¨⊂: 부울 벡터를 오른쪽으로 밀면서 0, 1, 2, 3 번 (랩 어라운드) 회전;
  • ⊃+/ sum: 회전 및 개봉
  • 1↓4≠: 4가 아닌 다른 것을 찾아서 첫 번째 것을 제거하십시오 (앞에 붙인 공간을 위해)
  • ⍵/⍨: 인수에서 합계가 4와 다른 요소 만 유지하십시오.

1

펄 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

스칼라, 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

자바 스크립트 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 / 옥타브, 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여러 문자 입력을 처리하기 위해 추가 문자를 소비하는 이유 는 gets무엇입니까 (따라서 문자 범위 0x0a 범위를 벗어남) ?
manatwork

@manatwork 정말 좋은 지적입니다, 감사합니다! 그것은 2-3 바이트 : 저장할 수있는 생각
조셉 와이즈맨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.