문자열의 각 단어에서 모음 수를 센다


13

이것은 다소 쉬운 도전입니다.

도전

입력은 null최대 길이 100 의 문자열 ( 비어 있거나 비어 있지 않음 )을 포함합니다. 문자열의 각 단어에있는 모음 수를 공백으로 구분하여 출력합니다.

규칙

  • 문자열의 길이는 100 자 이하 여야합니다.
  • 문자열은 알파벳이 포함됩니다 A-Z, a-z또한 공간을 포함 할 수 있습니다.
  • stdin또는 명령 줄 인수 에서 입력을 사용해야합니다 .
  • 에 출력이 출력되어야합니다 stdout.
  • 전체 프로그램 또는에서 입력을 stdin받아 결과를 출력 하는 함수를 작성할 수 있습니다 .
  • 프로그램 / 기능이 계산해야하는 모음은 aeiouAEIOU입니다.

테스트 사례

This is the first test case     --> 1 1 1 1 1 2
one plus two equals three       --> 2 1 1 3 2
aeiou AEIOU                     --> 5 5
psst                            --> 0
the quick brown fox jumped over the lazy dog --> 1 2 1 1 2 2 1 1 1

채점

이것은 이므로 가장 짧은 제출 (바이트)이 이깁니다.


6
다소 제한적인 I / O 형식을 요구하는 이유가 있습니까? 모든 언어가 (편리하게) STDIN 및 STDOUT과 상호 작용할 수있는 것은 아닙니다. 명령 행 인수, 함수 인수, 반환 값 등을 허용하는 기본값 (물론 원하는 경우 재정의 할 수도 있음)이 있습니다 . 태그 Wiki 에서도 찾을 수 있습니다 .
Martin Ender

MartinBüttner @, " 당신은 다소 제한적인 I / O 포맷을 고집 이유가 있습니까? "- 아뇨처럼 stdin과 함께 stdout. 함수 인수를 통해 "입력"을 원하지 않습니다. 명령 줄 인수는 괜찮아 보입니다. 게시물에 추가했습니다.
Spikatrix

4
위키피디아 : The name "vowel" is often used for the symbols that represent vowel sounds in a language's writing system, particularly if the language uses an alphabet. In writing systems based on the Latin alphabet, the letters A, E, I, O, U, and sometimes Y are all used to represent vowels. However, not all of these letters represent vowels in all languages.모음이란 무엇입니까?
edc65

단일 후행 공간이 괜찮습니까?
Alex A.

3
제안 된 챌린지에 샌드 박스를 사용하십시오.
mbomb007

답변:


8

Pyth, 17 바이트

jdml@"aeiou"dcrzZ

간단한 솔루션. 온라인으로 사용해보십시오 : 데모 또는 테스트 장치

설명:

               z   input
              r Z  convert to lower-case
             c     split at spaces
  m                map each word d to:
    @"aeiou"d         filter d for chars in "aeiou"
   l                  length
jd                 join by spaces and implicitly print

사람들이 Pyth 솔루션을 작성하고 (이 대부분의보다 이해하기 인정 하듯이 쉽게이지만) "솔직한"를 호출 할 때 항상 +1 나를 즐겁게
크리스토퍼 워트에게

10

C, 11310810396 바이트

특히 멋진 5 바이트 절약을위한 @ andrea-biondo 에게 감사 합니다.

main(a,v,c)char**v;{do{for(a=0;c=*v[1]++%32;2016%(c+27)||a++);printf("%d ",a);}while(v[1][-1]);}

이것은 여전히 ​​부풀어 오른 느낌이므로 나중에 오늘 밤 꽤 많은 바이트를 얻을 수 있기를 바랍니다.

흥미로운 부분은 아마도

!(124701951%((c-65&31)+33))

될 것입니다 1경우 c(대소) ASCII 모음이며, 0다른 문자 a-zA-Z. 서브 표현식은 c-65&31매핑 'a''A'0, 'b'그리고 'B'2등, 우리는 추가 할 때 33모음이 번호에 해당 33, 37, 41, 47, 53프라임 모두의이다 (편리), 각각. 우리의 범위에서 그러한 숫자들만 나뉘어 124701951 = 33*37*41*47*53질 것 124701951%(...)입니다.

편집 : 이런 식으로 하나의 표현 고려할 수 있는 문자가 여부를 결정으로 모음입니다. 의견에서 @ andrea-biondo 는 이 표현에서 모음을 사용하여 모음을 결정할 수 있다고 지적했습니다 . 위의 소수와 관련하여 현재 설명을 남겨 두겠습니다. 그러나이 더 짧은 페어링이 작동하는 이유는 28-53 범위에서 2016의 소수 요인에 모두 소수가있는 유일한 숫자는 28, 32, 모음에 정확하게 해당하는 36, 42, 48.!(n%((c-65&31)+s))(n,s) = (124701951, 33)c(n,s) = (2016,28)

EDIT2 : 이후 5 바이트 (c-65&31)+28를 더 단축 할 수 있습니다 c%32+27.

EDIT3 : do-while 루프로 변환하여 최종적으로 100 바이트 미만으로 만듭니다.

테스트 사례 :

$ ./vowelc "이것은 첫 번째 테스트 사례입니다"
11 11 1 2 
$ ./vowelc "1 더하기 2는 3과 같습니다"
2 1 1 3 2 
$ ./vowelc "aeiou AEIOU"
5 5 
$ ./vowelc "psst"                     
0

세상에! 이것은 굉장하다! a;outside 를 사용하여 더 많은 바이트를 절약 할 수 있습니다 main. 이 방법은, 당신은 당신이 선언에 필요하지 않은 일부 바이트를 줄이기 amain(...)있으며, 초기화 할 필요가 없습니다 a루프에서.
Spikatrix

1
@CoolGuy : a는 모든 루프에서 다시 초기화되므로 global을 선언하여 한 번 0으로 초기화 할 수 없습니다. 나는 모음에 대해서는 0이고 자음에 대해서는 0이 아닌 가장 작은 (n, s)쌍 을 찾기 위해 작은 bruteforcer를 썼습니다 n%((c-65&31)+s)(az, AZ). 나는 그것을 발견 (2016, 28)하고 잘 작동하는 것 같습니다 : !(2016%((c-65&31)+28))5 자 더 짧습니다. 어쨌든, 아주 좋은 해결책 :)
Andrea Biondo

7

CJam, 21 19 바이트

r{el_"aeiou"--,Sr}h

작동 방식 :

r{               }h    e# Read the first word and enter a do-while loop
  el_                  e# Convert the word into lower case and take a copy of it
     "aeiou"           e# All small caps vowels
            -          e# Remove all vowels from the copied word
             -         e# Remove all non-vowels from the original word
              ,        e# At this point, we have a string with all vowels of the word
                       e# Simply take its length
               S       e# Put a space after the number of vowel
                r      e# Read the next word. This serves as the truthy condition for the
                       e# do-while loop for us as if there are no word left, this returns
                       e# null/falsy and the do-while loop is exited

여기에서 온라인으로 사용해보십시오


6

R, 44 43 바이트

cat(nchar(gsub("[^aeiou]","",scan(,""),T)))

언 골프 + 설명 :

# Read a string from STDIN. scan() automatically constructs a vector
# from input that contains spaces. The what= argument specifies that
# a string will be read rather than a numeric value. Since it's the
# second specified argument to scan(), we can simply do scan(,"").

s <- scan(what = "")

# For each word of the input, remove all consonants using gsub(),
# which is vectorized over its input argument.

g <- gsub("[^aeiou]", "", s, ignore.case = TRUE)

# Print the number of remaining characters in each word to STDOUT
# using cat(), which automatically separates vector values with a
# single space.

cat(nchar(g))

5

펄, 35 34 31

say map{lc=~y/aeiou//.$"}split

30문자 +1에 대한 -n.

많은 Perl 코드와 마찬가지로 오른쪽에서 왼쪽으로 작동합니다. split입력 된 줄을 공백으로 분할합니다. 분할 된 각 단어 map사이 {}에 코드를 실행합니다 . lc단어를 소문자로 만듭니다. =~y/aeiou//모음의 수를 알려줄 것입니다. .$"단어에 공백을 추가합니다. say그런 다음 모든 단어를 인쇄합니다!

로 실행 :

echo 'aeiou AEIOU' | perl -nE'say map{lc=~y/aeiou//.$"}split'

4

파이썬 3, 65 바이트

print(*[sum(c in'aeiouAEIOU'for c in w)for w in input().split()])

매우 간단하고 읽기 쉽습니다. w단어, c성격을 나타냅니다.


4

펄 : 30 자

(규칙의 종류 : 출력의 숫자는 입력 단어의 수만큼 공백으로 분리됩니다.)

s|\w+|@{[$&=~/[aeiou]/gi]}|ge

샘플 실행 :

bash-4.3$ while read s; do printf '%-30s --> ' "$s"; perl -pe 's|\w+|@{[$&=~/[aeiou]/gi]}|ge' <<< "$s"; done < test-case.txt
This is the first test case    --> 1 1 1 1 1 2
one plus two equals three      --> 2 1 1 3 2
aeiou AEIOU                    --> 5 5
psst                           --> 0

펄 : 27 자

( y///반환 값을 잊어 버린 경우 얼마나 짧은 지 보여 주십시오. 다시. 이제 돌아가서 chilemagic답변공표하여 ' y///반환 값 에 대해 상기시켜주었습니다 . 다시.)

s|\w+|lc($&)=~y/aeiou//|ge

이건 내 대답보다 낫다. 이 s!\w+!lc($&)=~y/aeiou//!ge그것을 아래로 가져 2726 개 문자 +1 (바이트 -p.
hmatt1

예, 고마워요 더 이상 내가 잊어 버린 손가락을 더 이상 믿을 수 없습니다 y///. :(
manatwork

3

루비, 38 바이트

$><<$*.map{|x|x.count'AIUEOaiueo'}*' '

용법:

mad_gaksha@madlab /tmp/ $ ruby t.rb This is the first test case
1 1 1 1 1 2

3

자바 스크립트 ( ES6 ), 68

팝업을 통한 I / O Firefox에서 스 니펫을 실행하여 테스트하십시오.

// As requested by OP

alert(prompt().replace(/\w+/g,w=>w.replace(/[^aeiou]/ig,'').length))

// Testable
f=s=>s.replace(/\w+/g,w=>w.replace(/[^aeiou]/ig,'').length)

test=[
 ['This is the first test case','1 1 1 1 1 2']
,['one plus two equals three','2 1 1 3 2']
,['aeiou AEIOU', '5 5']
]  

out=x=>O.innerHTML+=x+'\n'

test.forEach(t=>{
  r=f(t[0])
  out('Test '+ ['Fail','OK'][0|r==t[1]]
      +'\nInput:  '+ t[0]
      +'\nOutput: '+r
      +'\nCheck:  '+t[1]+'\n')
})
<pre id=O></pre>


3

리볼-70

print map-each n split input" "[c: 0 find-all n charset"aeiou"[++ c]c]

3

PowerShell, 35 바이트

%{($_-replace"[^aeiou]",'').length}

지루하지만 실제로 한 번 경쟁하고 있습니까? (PowerShell은 기본적으로 대소 문자를 구분하지 않습니다)


참고로, 다음과 같이 호출해야합니다 echo <word> | code. 여기서 <word>는 단어 또는 문구입니다
Pureferret

3

배쉬-85

while read l;do for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo;done

설명

  • read l 입력에서 한 줄을 읽습니다
  • for w in l 공백 구분 기호를 사용하여 줄을 단어로 나눕니다.
  • x=${w//[^aouieAOUIE]/} 단어에서 모음을 제외한 모든 단어를 삭제합니다.
  • ${#x} 결과 문자열의 길이 === 모음 수

어떻게 든 지나친 느낌. 요구 사항에 따르면 입력에 문자와 공백 만 포함되어야합니다. 여러 입력 라인을 처리하기 위해 왜 준비 했습니까? 없이 while.. do.. done짧아 질 것입니다. 또한 /패턴 대체에서 마지막 이 필요하지 않았습니다 . 그리고 단일 리터럴 공간은 인용 된 것보다 짧습니다. read l;for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo
manatwork

동의하지만 규칙은 '전체 프로그램 또는 stdin에서 입력을 받아 결과를 출력하는 함수를 작성할 수 있습니다'라고 말합니다. 그래서 나는 전체 프로그램을 만들기로 결정했습니다. 2 바이트를 절약하기 위해 솔루션을 편집 할 것입니다)) 감사합니다!
xuesheng

3

줄리아, 76 72 69 65 바이트

for w=split(readline()) print(count(i->i"aeiouAEIOU",w)," ")end

언 골프 + 설명 :

# Read a string from STDIN and split it into words
s = split(readline())

# For each word in the string...
for w in s
    # Get the number of vowels of any case in the word
    c = count(i -> i  "aeiouAEIOU", w)

    # Print the number of vowels identified
    print(c, " ")
end

여기에는 단일 후행 공간이 포함되며 합법적이라고 들었습니다.


2

Mathematica, 95 바이트

콘테스트에서 우승하지는 않지만 ...

Print@StringRiffle[ToString[#~StringCount~Characters@"aeiouAEIOU"]&/@StringSplit@InputString[]]

이것을 테스트 할 수있는 온라인 컴파일러를 알고 있습니까?
Spikatrix

아무것도 없지만 여기 에서 무료 평가판을받을 수 있습니다 .
LegionMammal978

@CoolGuy 여기 에서 무료 계정을 얻는다면 Mathematica (Wolfram Language) 코드를 온라인으로 실행할 수 있습니다 . ( InputString웹 인터페이스에는 확실하지 않지만 Mathematica의 대화 상자입니다.)

@Calle Mathematica 스크립트 InputString에서 다음 입력 라인을 사용합니다.
LegionMammal978

알 겠어. 그래도 클라우드 노트북에서 작동하는지 확실하지 않지만 적어도 지금은 stdin에 사용되는 이유를 알고 있습니다.

2

golflua, 55 바이트

~@W I.r():l():gm("%w+")_,c=W:g("[aeiou]",'')I.w(c,' ')$

강제 소문자 이후 모음의 기본 패턴 일치. (ungolfed) Lua에 해당하는 것은

line=io.read()
for word in line:lower():gmatch("%w+") do
   _,c=word:gsub("[aeiou]",'')
   io.write(c," ")
end

따로, Lua 버전의 경우 실제로 사용 gsub('[aeiouAEIOU]','')하고 건너 뛰는 데 2 문자가 짧 습니다 lower().
Kyle Kanos

2

R , 139 바이트

읽기 / 쓰기 stdout ()이 끔찍하다

s=function(x,y)strsplit(x,y)[[1]]
write(unlist(Map(function(x)sum(x%in%s("AIUEOaiueo","")),Map(s,s(readLines("stdin")," "),"")),),stdout())

R은 그렇게 나쁘지 않습니다 . ;) cat()대신 사용할 수 있습니다 write(..., stdout()).
Alex A.

2

파이썬 3, 72 바이트

@randomra답변에서 영감을 얻었습니다 . 그건 같은 길이 약간 더 긴하지만, 지능형리스트 대신 정규식을 사용하여. 또한 읽기 어렵습니다.

import re
print(*map(len,re.sub("[^aeiou ]","",input(),0,2).split(" ")))

7 바이트 저장 : import re;print(*map(len,re.sub("[^aeiou ]","",input()).split())). ( ;원하는 경우에 대신 줄 바꿈을 사용하십시오 .)
mbomb007

@ mbomb007 대소 문자를 구분하지 않아야 2하고 (대소 문자를 구분하지 않는 플래그 임) " "길이가 0이되도록 나누기

아, 내 테스트는 그것을 알기에 충분히 광범위하지 않았습니다.
mbomb007

2

PHP-94

foreach(explode(' ',$argv[1]) as$d){preg_match_all('/[aeiou]/i',$d,$v);echo count($v[0]).' ';}

언 골프 버전

$a = explode(' ',$argv[1]);
foreach($a as $d) {
    preg_match_all('/[aeiou]/i', $d, $v);
    echo count($v[0]).' ';
}

2

Objective-C, 223 바이트

-(void)p:(NSString*)s{NSArray*a=[s componentsSeparatedByString:@" "];for(NSString*w in a){int c=0;for(int i=0;i<w.length;i++){if([@"aeiouAEIOU"containsString:[w substringWithRange:NSMakeRange(i,1)]]){c++;}}NSLog(@"%d",c);}}

가장 간결한 언어는 아니지만 작동합니다.

비 압축 버전 :

- (void)p:(NSString*)s{
    NSArray*a=[s componentsSeparatedByString:@" "];
    for (NSString*w in a) {
        int c=0;
        for (int i=0;i<w.length;i++) {
            if ([@"aeiouAEIOU" containsString:
                 [w substringWithRange:NSMakeRange(i, 1)]]) {
                c++;
            }
        }
        NSLog(@"%d",c);
    }
}

2

Matlab, 73 바이트

당신의 도전은 명확하지 않지만 흥미 롭습니다. 나는 가정하고있다

  • "모음"에 의해 뜻 a, e, i, o, u.
  • 문자열에 선행 또는 후행 공백이 없습니다

암호:

diff(find(regexprep([' ' input('','s') ' '],'[^aeiouAEIOU ]','')==' '))-1

2

rs , 50 바이트

이것은 중요하지 않습니다. rs는 게시 된 지 약 2 주 후에 업로드되었습니다. 그러나 어쨌든 이것은 어쨌든 아무것도 이길 수 없으므로 여전히 시원합니다.

*[aeiou]/_
(^| )[^_\s]+ |$/ 0
[^_\s0]/
(_+)/(^^\1)

라이브 데모.

구현은 다소 간단합니다.

*[aeiou]/_            Replace all vowels with underscores.
(^| )[^_\s]+ |$/ 0    Replace words that have no vowels with a zero.
[^_\s0]/              Remove all other letters.
(_+)/(^^\1)           Convert the underscore sequences into numbers (e.g. '___' to 3).

2

펄, 60 45

$/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "

저를 15 바이트 절약 한 kirbyfan64sos 덕분에 정말 도움이되었습니다!
출력 끝에 여분의 공간이 있습니다.


add split를 설정하여 호출을 제거 $/=" ";할 수 있으며 루프 접두어를로 단축 할 수 있습니다 while(<>). 이 두 가지 변경 사항으로 인해 코드가로 바뀌고 $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}14 바이트 가 절약됩니다!
kirbyfan64sos 2016 년

2

하스켈, 76 68 바이트

f=interact$unwords.map(show.length).filter(`elem`"aeiouAEIOU").words

간단한 구현으로 골프에 대한 것이 있는지 확실하지 않습니다.


1

KDB (Q), 30 바이트

{sum@'lower[" "vs x]in"aeiou"}

설명

            " "vs x              / split x string by space
      lower[       ]             / lower case
                    in"aeiou"    / check vowel
 sum@'                           / sum each booleans
{                            }   / lambda

테스트

q){sum@'lower[" "vs x]in"aeiou"}"This is the first test case"
1 1 1 1 1 2i

1

스몰 토크-66 72

이것은 Smalltalk / X에 있습니다; stdin과 stdout의 이름은 삐걱 거리는 소리와 위상이 다를 수 있습니다.

Stdin nextLine subStrings do:[:w|(w count:[:c|c isVowel])print.' 'print]

Smalltalk / X (및 다른 많은 방언)에서 기호는 #value :를 이해하므로 66 자로 줄여 쓸 수 있습니다.

 Stdin nextLine subStrings do:[:w|(w count:#isVowel)print.' 'print]

문자열을 인수 "s"로 가져 오는 함수로 코딩 된 경우 :

[:s|s subStrings do:[:w|(w count:#isVowel)print.' 'print]]

물론 실제 코드에서는 카운트의 벡터를 반환하는 유틸리티 함수 "f"를 사용하여 인쇄합니다. 그러나 출력 형식은 도전이 요구 한 것과 정확히 일치하지 않습니다.

f := [:s|s subStrings collect:[:w|(w count:#isVowel)]].
(f value: Stdin nextLine) print.

1

파이썬 2, 76 바이트

다른 솔루션을보기 전에이 작업을 수행 한 다음 더 짧은 두 가지 P3 솔루션을 확인했습니다. (Darn P2 제한 사항.

print' '.join(`sum(y in'aeiouAEIOU'for y in x)`for x in raw_input().split())

1

PowerShell, 65 바이트

($input-split'\s'|%{($_-split''-match'a|e|i|o|u').count})-join' '

다음과 같이 저장 한 후 아래 패턴을 사용하여 테스트하십시오. vowels.ps1

"the quick brown fox" | vowels.ps1

이렇게하면 코드 스 니펫이 아니라 실제 스크립트이므로 제약 조건을 충족시킵니다.

"stdin 또는 명령 행 인수에서 입력을 사용해야합니다."


1

젤리 , 7 바이트

Ḳf€ØcL€

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

의 도움으로 찾을 수 씨 Xcoder 에서 채팅

설명

Ḳf€ØcL€ - Main link. Argument: s (a string)  e.g. "aeiou AEIOU"
Ḳ       - Split the input on spaces               ["aeiou", "AEIOU"]
   Øc   - Generate the string "AEIOUaeiou" 
 f€     - Filter out consonants from €ach         ["aeiou", "AEIOU"]
     L€ - Length of €ach                          [5, 5]

출력하는 경우 이 공백으로 분리 되어야K 하는 경우 끝에 끝에 a 를 추가하십시오.


0

SAS, 72

data;infile stdin;file stdout;input c$@@;x=countc(c,'aeiou','i');put x@;

이것에 대한 제한적인 I / O 형식은 여기에서 25 바이트의 바이트를 담당하므로 실제로이 형식을 아프게합니다.


0

C # 186

public class a{public static void Main(string[] a){Console.Write(string.Join(" ",Console.ReadLine().Split(' ').Select(x=>x.ToCharArray().Count(y=>"aeoui".ToCharArray().Contains(y)))));}}

세 번째 테스트 사례에서는 실패합니다. 프로그램이 계산되지 않는 것 같습니다 AEIOU.
Spikatrix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.