Policz liczbę samogłosek w każdym słowie łańcucha

13

To dość łatwe wyzwanie.

Wyzwanie

Dane wejściowe będą zawierać ciąg znaków (nie nulllub pusty) o maksymalnej długości 100. Wypisz liczbę samogłosek w każdym słowie łańcucha, oddzielone spacjami.

Zasady

  • Ciąg nie będzie miał więcej niż 100 znaków.
  • Ciąg będzie zawierać tylko alfabetów A-Z, a-za także może zawierać spacji.
  • Dane wejściowe muszą być pobierane z stdinargumentów wiersza polecenia lub.
  • Dane wyjściowe muszą być wyprowadzane w stdout.
  • Możesz napisać pełny program lub funkcję, która pobiera dane wejściowe stdini generuje wynik.
  • Samogłoski, które Twój program / funkcja musi liczyć, to aeioui AEIOU.

Przypadki testowe

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

Punktacja

To jest , więc wygrywa najkrótsze przesłanie (w bajtach).

Spikatrix
źródło
6
Czy istnieje powód, dla którego nalega się na dość restrykcyjny format we / wy? Nie każdy język może (wygodnie) współdziałać ze STDIN i STDOUT. Mamy domyślne ustawienia tego (które oczywiście możesz zastąpić, jeśli chcesz), które pozwalają również na argument wiersza poleceń, argument funkcji, wartość zwracaną itp. (Można je również znaleźć w wiki tagu .)
Martin Ender
@ MartinBüttner, „ Czy istnieje powód, dlaczego upierasz się dość restrykcyjnej I / O formacie? ” - Nie. Po prostu jak stdinz stdout. Nie lubię „uzyskiwać danych wejściowych” za pomocą argumentów funkcji. argumenty wiersza poleceń wydają się być w porządku. Dodałem go do postu.
Spikatrix
4
WIKIPEDIA: 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.Co rozumiesz przez samogłoski?
edc65
Czy pojedyncza spacja jest w porządku?
Alex A.
3
Użyj piaskownicy do proponowanych wyzwań.
mbomb007

Odpowiedzi:

8

Pyth, 17 bajtów

jdml@"aeiou"dcrzZ

Proste rozwiązanie. Wypróbuj online: Demonstracja lub Uprząż testowa

Wyjaśnienie:

               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
Jakube
źródło
Zawsze mnie bawi, gdy ludzie piszą rozwiązanie w języku Pyth i nazywają go „Prostym” (chociaż ten jest łatwiejszy do zrozumienia niż większość) +1
Christopher Wirt
10

C, 113 108 103 96 bajtów

Dzięki @ andrea-biondo za wyjątkowo przyjemną oszczędność 5 bajtów.

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]);}

Nadal czuję się tak, jakby był rozdęty, więc mam nadzieję, że uda mi się dziś wieczorem znieść trochę bajtów.

Ciekawe jest chyba to

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

będzie, 1jeśli cjest samogłoską ASCII (wielkimi lub małymi literami) i 0dla innych znaków a-zA-Z. c-65&31Mapy podwyrażeń 'a'oraz 'A'do 0, 'b'i 'B'do 2itp. Gdy dodamy 33samogłoski odpowiadają 33, 37, 41, 47, 53odpowiednio liczbom , z których wszystkie są (dogodnie) liczbą pierwszą. W naszym przedziale dzielą się tylko takie liczby 124701951 = 33*37*41*47*53, tj. Tylko w przypadku samogłosek reszta 124701951%(...)będzie wynosić zero.

EDYCJA: W ten sposób można rozważyć wyrażenie, w !(n%((c-65&31)+s))którym (n,s) = (124701951, 33)określa się, czy znak cjest samogłoską. W komentarzach @ andrea-biondo wskazał, że pary (n,s) = (2016,28)można również użyć w tym wyrażeniu do określenia samogłoski. Zostawię powyższe wyjaśnienie w odniesieniu do liczb pierwszych powyżej, ale powód tego krótszego parowania jest ponownie, ponieważ w zakresie 28--53 jedyne liczby z czynnikami pierwszymi całkowicie w zestawie czynników pierwszych w 2016 r. Wynoszą 28, 32, 36, 42, 48, które dokładnie odpowiadają samogłosek.

EDYCJA 2: Kolejne 5 bajtów zapisanych, ponieważ (c-65&31)+28można je skrócić c%32+27.

EDYCJA 3: Przekształcony w pętlę „do-while”, aby ostatecznie uzyskać mniej niż 100 bajtów.

Przypadki testowe:

$ ./vowelc „To pierwszy przypadek testowy”
1 1 1 1 1 2 
$ ./vowelc „jeden plus dwa równa się trzy”
2 1 1 3 2 
$ ./vowelc „aeiou AEIOU”
5 5 
$ ./vowelc „psst”                     
0
CL-
źródło
O MÓJ BOŻE! To jest po prostu niesamowite! Możesz zaoszczędzić więcej bajtów, używając na a;zewnątrz main. W ten sposób można zmniejszyć niektóre bajty jak nie trzeba zadeklarować aw main(...), a także, nie trzeba zainicjować az pętli.
Spikatrix
1
@CoolGuy: ajest inicjowany ponownie w każdej pętli, więc nie można zainicjować go raz na zero, deklarując globalny. Napisałem małego bruteforcera, aby znaleźć najmniejszą (n, s)parę, taką jak n%((c-65&31)+s)zero dla samogłosek i niezerowa dla spółgłosek (az, AZ). Znalazłem (2016, 28)i wydaje się, że działa dobrze: !(2016%((c-65&31)+28))jest o 5 znaków krótszy. W każdym razie bardzo fajne rozwiązanie :)
Andrea Biondo
7

CJam, 21 19 bajtów

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

Jak to działa :

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

Wypróbuj online tutaj

Optymalizator
źródło
6

R 44 43 bajtów

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

Niegolfowane + wyjaśnienie:

# 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))
Alex A.
źródło
5

Perl, 35 34 31

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

30znaki +1dla -n.

Podobnie jak wiele kodów Perla, działa to od prawej do lewej. splitpodzieli wprowadzony wiersz na białe znaki. mapuruchomi kod pomiędzy {}każdym podzielonym słowem. lcsprawia, że ​​słowo jest małe. =~y/aeiou//poda nam liczbę samogłosek. .$"doda spację do słowa. saynastępnie drukuje wszystkie słowa!

Biegnij z:

echo 'aeiou AEIOU' | perl -nE'say map{lc=~y/aeiou//.$"}split'
hmatt1
źródło
4

Python 3, 65 bajtów

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

Bardzo prosty, dość czytelny. woznacza słowo, coznacza charakter.

randomra
źródło
4

Perl: 30 znaków

(Rodzaj wymusza reguły: liczby na wyjściu są oddzielone tyloma spacjami, ile były słowa wejściowe.)

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

Przykładowy przebieg:

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

Perl: 27 znaków

(Wystarczy, aby pokazać, jak krótkie byłoby, gdybym nie zapomnieć o y///'s wartości zwracanej. Znowu. A teraz idź i upvote chilemagic jest odpowiedź , która przypomniała mi o y///„s wartości zwracanej. Ponownie).

s|\w+|lc($&)=~y/aeiou//|ge
człowiek w pracy
źródło
Cholera, to bije moją odpowiedź. To s!\w+!lc($&)=~y/aeiou//!gesprowadza się do 27bajtów (26 znaków +1 dla -p.
hmatt1
Tak, dziękuję. Nie mogę już liczyć na palce, ile razy zapomniałem y///. :(
manatwork
3

Rubinowy, 38 bajtów

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

Stosowanie:

mad_gaksha@madlab /tmp/ $ ruby t.rb This is the first test case
1 1 1 1 1 2
blutorange
źródło
3

JavaScript ( ES6 ), 68

I / O przez wyskakujące okienko. Uruchom fragment w przeglądarce Firefox, aby go przetestować.

// 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>

edc65
źródło
3

Rebol - 70

print map-each n split input" "[c: 0 find-all n charset"aeiou"[++ c]c]
draegtun
źródło
3

PowerShell, 35 bajtów

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

Trochę nudne, ale tak naprawdę rywalizujące choć raz? (Program PowerShell domyślnie rozróżnia wielkość liter, woo)

Nacht - Przywróć Monikę
źródło
Do twojej wiadomości, musisz nazwać to tak echo <word> | code, gdzie <słowo> to twoje słowo lub fraza
Pureferret
3

Bash - 85

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

Wyjaśnienie

  • read l odczytać jedną linię z wejścia
  • for w in l dzieli linię na słowa za pomocą separatora białych znaków
  • x=${w//[^aouieAOUIE]/} usuwa wszystkie słowa oprócz samogłosek ze słowa
  • ${#x} to długość wynikowego ciągu === liczba samogłosek
Xuesheng
źródło
Czuje się jakoś przesadzony. Wymaganie mówi, że dane wejściowe będą zawierać tylko litery i spacje. Dlaczego więc przygotowałeś go do przetwarzania wielu linii wejściowych? Bez while.. do.. donebyłby krótszy. Nie potrzebowałem również ostatniego /w podstawieniu wzoru. I jedno dosłowne miejsce jest krótsze niż cytat. read l;for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo
manatwork
Zgadzam się, ale reguła mówi: „Możesz napisać pełny program lub funkcję, która pobiera dane wejściowe ze standardowego wyjścia i wyświetla wynik”. Więc postanowiłem zrobić pełny program. Zmienię rozwiązanie, aby zapisać dwa bajty)) Dzięki!
xuesheng
3

Julia, 76 72 69 65 bajtów

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

Niegolfowane + wyjaśnienie:

# 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

Będzie to obejmowało jedno końcowe miejsce, które, jak mi się wydaje, jest uzasadnione.

Alex A.
źródło
2

Mathematica, 95 bajtów

Nie wygrywam żadnych konkursów, ale ...

Print@StringRiffle[ToString[#~StringCount~Characters@"aeiouAEIOU"]&/@StringSplit@InputString[]]
LegionMammal978
źródło
Czy znasz jakieś kompilatory online, w których mógłbym to przetestować?
Spikatrix
Nie ma żadnych, ale możesz uzyskać bezpłatną wersję próbną tutaj .
LegionMammal978
@CoolGuy można uruchomić Wolfram Mathematica (Język) kod online można dostać darmowe konto tutaj . (Nie jestem pewien InputString, czy istnieje w interfejsie internetowym, jest to okno dialogowe w Mathematica.)
@Calle W skryptach Mathematica InputStringpobiera następny wiersz danych wejściowych.
LegionMammal978
dobra, widzę. Nadal nie jestem pewien, czy zadziała w notatniku w chmurze, ale przynajmniej teraz wiem, dlaczego jest używany do standardowego wejścia.
2

golflua, 55 bajtów

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

Podstawowe dopasowanie wzorców samogłosek po wymuszeniu małych liter. Byłby (nie golfowy) odpowiednik Lua

line=io.read()
for word in line:lower():gmatch("%w+") do
   _,c=word:gsub("[aeiou]",'')
   io.write(c," ")
end
Kyle Kanos
źródło
Nawiasem mówiąc, w przypadku wersji Lua użycie gsub('[aeiouAEIOU]','')i pomijanie byłoby o 2 znaki krótsze lower().
Kyle Kanos
2

R , 139 bajtów

Odczyt / zapis stdout () jest okropny

s=function(x,y)strsplit(x,y)[[1]]
write(unlist(Map(function(x)sum(x%in%s("AIUEOaiueo","")),Map(s,s(readLines("stdin")," "),"")),),stdout())
Vlo
źródło
R nie jest taki zły . ;) Możesz użyć cat()zamiast write(..., stdout()).
Alex A.
2

Python 3, 72 bajty

Zainspirowany @randomra „s odpowiedź . Ma nieco tę samą długość , ale używa wyrażenia regularnego zamiast listowego. Jest również mniej czytelny.

import re
print(*map(len,re.sub("[^aeiou ]","",input(),0,2).split(" ")))
Społeczność
źródło
Zaoszczędzić 7 bajtów: import re;print(*map(len,re.sub("[^aeiou ]","",input()).split())). (Zamiast tego użyj nowej linii ;).
mbomb007
@ mbomb007 Musi być rozróżniana 2wielkość liter ( jest to flaga bez rozróżniania wielkości liter) i dzielona według, " "aby mogły istnieć rzeczy o długości 0
Ach, moje testy nie były wystarczająco obszerne, aby to zauważyć.
mbomb007
2

PHP - 94

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

Wersja bez golfa

$a = explode(' ',$argv[1]);
foreach($a as $d) {
    preg_match_all('/[aeiou]/i', $d, $v);
    echo count($v[0]).' ';
}
kuldeep.kamboj
źródło
2

Cel C, 223 bajty

-(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);}}

Nie jest to najbardziej zwarty język, ale działa.

Wersja nieskompresowana:

- (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);
    }
}
Fennelouski
źródło
2

Matlab, 73 bajty

Twoje wyzwanie nie jest bardzo jasne (ale jest interesujące). jestem zarozumiały

  • Przez „samogłoska” masz na myśli a, e, i, o,u .
  • Ciąg nie zawiera spacji wiodących ani końcowych

Kod:

diff(find(regexprep([' ' input('','s') ' '],'[^aeiouAEIOU ]','')==' '))-1
Luis Mendo
źródło
2

rs , 50 bajtów

To się nie liczy; rs został przesłany około 2 tygodni po opublikowaniu. Jednak najwyraźniej i tak nic by to nie wygrało, więc nadal jest fajnie.

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

Demo na żywo.

Implementacja jest raczej prosta:

*[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).
kirbyfan64sos
źródło
2

Perl, 60 45

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

Dzięki kirbyfan64sos za uratowanie mnie 15 bajtów - to naprawdę pomogło!
Zauważ, że na końcu wyjścia jest dodatkowe miejsce.

ASCIIThenANSI
źródło
Możesz usunąć połączenie split, ustawiając dodawanie $/=" ";, i możesz zewrzeć prefiks pętli do while(<>). Po tych dwóch zmianach kod staje się $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}, oszczędzając 14 bajtów!
kirbyfan64sos
2

Haskell, 76 68 bajtów

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

Prosta implementacja, nie jestem pewien, czy jest tu coś do gry w golfa.

ThreeFx
źródło
1

KDB (Q), 30 bajtów

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

Wyjaśnienie

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

Test

q){sum@'lower[" "vs x]in"aeiou"}"This is the first test case"
1 1 1 1 1 2i
WooiKent Lee
źródło
1

Smalltalk - 66 72

To jest w Smalltalk / X; nazwy stdin i stdout mogą być różne w squeak / pharo.

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

W Smalltalk / X (i wielu innych dialektach) symbole rozumieją #value :, więc można ją skrócić do 66 znaków:

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

Jeśli kodowane jako funkcja, która otrzymuje ciąg jako argument „s”:

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

Oczywiście w prawdziwym kodzie można użyć funkcji narzędzia „f”, która zwraca wektor zliczeń, i wydrukuje go. Jednak format wyjściowy nie jest dokładnie tym, czego wymagało wyzwanie:

f := [:s|s subStrings collect:[:w|(w count:#isVowel)]].
(f value: Stdin nextLine) print.
blabla999
źródło
1

Python 2, 76 bajtów

Zrobiłem to, zanim zobaczyłem inne rozwiązanie, a następnie sprawdziłem, aby znaleźć dwa rozwiązania P3, które są krótsze :( Ograniczenia Darn P2.

print' '.join(`sum(y in'aeiouAEIOU'for y in x)`for x in raw_input().split())
Kade
źródło
1

PowerShell, 65 bajtów

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

przetestuj za pomocą poniższego wzoru po zapisaniu jako vowels.ps1

"the quick brown fox" | vowels.ps1

W ten sposób jest to rzeczywisty skrypt, a nie tylko fragment kodu, spełniając w ten sposób ograniczenie:

„Dane wejściowe muszą być pobierane z argumentów stdin lub wiersza poleceń.”

Bevo
źródło
1

Galaretka , 7 bajtów

Ḳf€ØcL€

Wypróbuj online!

Znaleziono przy pomocy pana Xcodera na czacie

Wyjaśnienie

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

Jeśli dane wyjściowe muszą być rozdzielone spacjami, dołącz a Kna końcu

Cairney Coheringaahing
źródło
0

SAS, 72

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

Ograniczający format we / wy dla tego naprawdę bardzo go boli, ponieważ odpowiada tutaj za 25 bajtów.

Jajko sadzone
źródło
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)))));}}
DL
źródło
Nie udaje się to w trzecim przypadku testowym. Twój program chyba się nie liczy AEIOU.
Spikatrix,