С, 113 108 103 96 байт
Спасибо @андреа-биондо для особенно приятной экономии 5 байт.
$ ./vowelc "This is the first test case"
1 1 1 1 1 2
$ ./vowelc "one plus two equals three"
2 1 1 3 2
$ ./vowelc "aeiou AEIOU"
5 5
$ ./vowelc "psst"
0
Это все еще кажется раздутым, так что, надеюсь, сегодня вечером я смогу записать его на несколько байтов.
Самое интересное, пожалуй, в том, что
K
будет Ḳ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]
if Ḳf€ØcL€
является гласной ASCII (в верхнем или нижнем регистре) и "the quick brown fox" | vowels.ps1
for other characters vowels.ps1
. Подвыражение ($input-split'\s'|%{($_-split''-match'a|e|i|o|u').count})-join' '
maps data;infile stdin;file stdout;input c$@@;x=countc(c,'aeiou','i');put x@;
и print' '.join(`sum(y in'aeiouAEIOU'for y in x)`for x in raw_input().split())
к f := [:s|s subStrings collect:[:w|(w count:#isVowel)]].
(f value: Stdin nextLine) print.
, [:s|s subStrings do:[:w|(w count:#isVowel)print.' 'print]]
and Stdin nextLine subStrings do:[:w|(w count:#isVowel)print.' 'print]
to Stdin nextLine subStrings do:[:w|(w count:[:c|c isVowel])print.' 'print]
, etc. When we add q){sum@'lower[" "vs x]in"aeiou"}"This is the first test case"
1 1 1 1 1 2i
гласные соответствуют цифрам " "vs x / split x string by space
lower[ ] / lower case
in"aeiou" / check vowel
sum@' / sum each booleans
{ } / lambda
respectively, all of which are (conveniently) prime. In our range only such numbers will divide {sum@'lower[" "vs x]in"aeiou"}
, т.е. только для гласных будет остаток {+/¨(∊∘'aeiou'⊢)¨' '(≠⊆⊢)⌊⍵}
+/¨ ⍝ sum each word's vowel bit array
(∊∘'aeiou'⊢)¨ ⍝ for each word, check for vowels
' '(≠⊆⊢) ⍝ split string on spaces
⌊⍵ ⍝ convert to lowercase
be zero.
РЕДАКТИРОВАТЬ: Таким образом, можно рассмотреть выражение f=interact$unwords.map(show.length).filter(`elem`"aeiouAEIOU").words
where $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "
как определение того, является ли персонаж *[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).
is a vowel. In the comments @андреа-биондо отметил, что пара *[aeiou]/_
(^| )[^_\s]+ |$/ 0
[^_\s0]/
(_+)/(^^\1)
can also be used in this expression to determine vowelhood. I'll leave the current explanation in terms of primes above, but the reason this shorter pairing works is again because in the range 28--53 the only numbers with prime factors entirely in the set of prime factors of 2016 are 28, 32, 36, 42, 48, which correspond precisely to the vowels.
EDIT2: еще 5 байт сохранено с тех пор. diff(find(regexprep([' ' input('','s') ' '],'[^aeiouAEIOU ]','')==' '))-1
can be shortened to u
.
EDIT3: преобразован в цикл do- while, чтобы наконец получить его ниже 100 байт.
Тестовые случаи:
o
||answer||
Пиф, 17 байт
i
Прямое решение. Попробуйте онлайн: Демонстрация или Тестовый жгут
Объяснение:
e
||answer||
CJam, 21 19 байт
a
Как это работает:
- (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);
}
}
Попробуйте онлайн здесь