Hitung jumlah vokal di setiap kata string

13

Ini adalah tantangan yang agak mudah.

Tantangan

Input akan berisi string (bukan nullatau kosong) dengan panjang maksimum 100. Keluarkan jumlah vokal di setiap kata string, dipisahkan dengan spasi.

Aturan

  • Panjang string tidak akan lebih dari 100 karakter.
  • String hanya akan berisi huruf A-Z, a-zdan juga bisa berisi spasi.
  • Input harus dikonsumsi dari stdinargumen baris perintah atau.
  • Output harus dikeluarkan dalam stdout.
  • Anda dapat menulis program lengkap, atau fungsi yang mengambil input dari stdindan menampilkan hasilnya.
  • Vokal yang perlu dihitung oleh program / fungsi Anda adalah aeioudan AEIOU.

Uji Kasus

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

Mencetak gol

Ini adalah , jadi pengiriman terpendek (dalam byte) menang.

Spikatrix
sumber
6
Apakah ada alasan mengapa Anda bersikeras pada format I / O yang agak terbatas? Tidak semua bahasa dapat (dengan mudah) berinteraksi dengan STDIN dan STDOUT. Kami memiliki default untuk ini (yang tentu saja Anda bebas untuk menimpanya jika Anda mau), yang juga memungkinkan argumen baris perintah, argumen fungsi, nilai pengembalian dll. (Mereka juga dapat ditemukan di tag wiki .)
Martin Ender
@ MartinBüttner, " Apakah ada alasan mengapa Anda bersikeras pada format I / O yang agak membatasi? " - Tidak. Saya hanya suka stdindengan stdout. Saya tidak suka "mendapatkan input" melalui argumen fungsi. argumen baris perintah sepertinya ok. Saya telah menambahkannya ke dalam pos.
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.Apa yang ANDA maksudkan dengan vokal?
edc65
Apakah satu ruang trailing oke?
Alex A.
3
Gunakan Kotak Pasir untuk Tantangan yang Diusulkan.
mbomb007

Jawaban:

8

Pyth, 17 byte

jdml@"aeiou"dcrzZ

Solusi mudah. Cobalah online: Demonstrasi atau Uji harness

Penjelasan:

               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
sumber
Itu selalu menghibur saya ketika orang menulis solusi Pyth dan menyebutnya "Langsung" (Meskipun ini diakui lebih mudah dipahami daripada kebanyakan) +1
Christopher Wirt
10

C, 113 108 103 96 byte

Terima kasih @ andrea-biondo untuk penghematan 5 byte yang sangat bagus.

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

Ini masih terasa agak membengkak jadi mudah-mudahan saya bisa menurunkannya beberapa byte nanti malam.

Bagian yang menarik mungkin itu

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

akan menjadi 1apakah cASCII vokal (huruf besar atau kecil), dan 0untuk karakter lain a-zA-Z. Subekspression c-65&31memetakan 'a'dan 'A'ke 0, 'b'dan 'B'ke 2, dll. Ketika kita menambahkan masing 33-masing vokal sesuai dengan angka 33, 37, 41, 47, 53, semuanya adalah (mudah) prima. Dalam rentang kami hanya angka-angka seperti itu yang akan membelah 124701951 = 33*37*41*47*53, yaitu hanya untuk vokal yang akan 124701951%(...)menjadi nol.

EDIT: Dengan cara ini orang dapat mempertimbangkan ekspresi di !(n%((c-65&31)+s))mana (n,s) = (124701951, 33)sebagai menentukan apakah karakter citu vokal. Dalam komentar @ andrea-biondo menunjukkan bahwa pasangan (n,s) = (2016,28)juga dapat digunakan dalam ungkapan ini untuk menentukan vokal. Saya akan meninggalkan penjelasan saat ini dalam hal bilangan prima di atas, tetapi alasan pemasangan yang lebih pendek ini berfungsi lagi karena di kisaran 28--53 satu-satunya angka dengan faktor prima seluruhnya dalam rangkaian faktor prima 2016 adalah 28, 32, 36, 42, 48, yang bersesuaian dengan vokal.

EDIT2: 5 byte lainnya disimpan karena (c-65&31)+28dapat disingkat menjadi c%32+27.

EDIT3: Dikonversi menjadi do-while untuk akhirnya mendapatkan di bawah 100 byte.

Kasus uji:

$ ./vowelc "Ini adalah ujian pertama"
1 1 1 1 1 2 
$ ./vowelc "satu tambah dua sama dengan tiga"
2 1 1 3 2 
$ ./vowelc "aeiou AEIOU"
5 5 
$ ./vowelc "psst"                     
0
CL-
sumber
OH TUHAN! Ini luar biasa! Anda dapat menyimpan lebih banyak byte dengan menggunakan di a;luar main. Dengan cara ini, Anda mengurangi beberapa byte karena Anda tidak perlu declare adi main(...)dan juga, tidak perlu menginisialisasi adari loop.
Spikatrix
1
@CoolGuy: adiinisialisasi ulang di setiap loop, sehingga Anda tidak dapat menginisialisasi sekali ke nol dengan mendeklarasikan global. Saya menulis bruteforcer kecil untuk menemukan (n, s)pasangan terkecil sehingga n%((c-65&31)+s)nol untuk vokal dan non-nol untuk konsonan (az, AZ). Saya menemukan (2016, 28)dan tampaknya berfungsi dengan baik: !(2016%((c-65&31)+28))5 karakter lebih pendek. Lagi pula, solusi yang sangat bagus :)
Andrea Biondo
7

CJam, 21 19 byte

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

Cara kerjanya :

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

Cobalah online di sini

Pengoptimal
sumber
6

R, 44 43 byte

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

Penjelasan + tidak dikumpulkan:

# 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.
sumber
5

Perl, 35 34 31

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

30karakter +1untuk -n.

Seperti banyak kode Perl, ini berfungsi dari kanan ke kiri. splitakan membagi garis yang dimasukkan pada spasi putih. mapakan menjalankan kode antara {}pada setiap kata yang dipisah. lcmembuat kata huruf kecil. =~y/aeiou//akan memberi kita hitungan vokal. .$"akan menambahkan spasi ke kata. saylalu cetak semua kata!

Jalankan dengan:

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

Python 3, 65 byte

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

Sangat mudah, cukup mudah dibaca. wsingkatan kata, csingkatan karakter.

randomra
sumber
4

Perl: 30 karakter

(Jenis memaksa aturan: angka-angka dalam output dipisahkan dengan spasi sebanyak kata-kata input.)

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

Contoh dijalankan:

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 karakter

(Hanya untuk menunjukkan betapa singkat akan jika saya tidak melupakan y///'s nilai kembali. Sekali lagi. Sekarang pergi dan upvote chilemagic ' s jawaban yang mengingatkan saya tentangy/// 's nilai kembali. Lagi.)

s|\w+|lc($&)=~y/aeiou//|ge
manatwork
sumber
Dang ini mengalahkan jawaban saya. Ini s!\w+!lc($&)=~y/aeiou//!gemembuatnya menjadi 27byte (26 karakter +1 untuk -p.
hmatt1
Ya terima kasih. Saya tidak bisa menghitung dengan jari lagi berapa kali saya lupa y///. :(
manatwork
3

Ruby, 38 byte

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

Pemakaian:

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

JavaScript ( ES6 ), 68

I / O melalui sembulan. Jalankan cuplikan di Firefox untuk menguji.

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

Rebol - 70

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

PowerShell, 35 byte

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

Agak membosankan, tapi sebenarnya berlomba sekali? (PowerShell tidak peka huruf besar-kecil, woo)

Nacht - Pasang kembali Monica
sumber
FYI, Anda perlu menyebutnya seperti ini echo <word> | code, di mana <word> adalah kata atau frasa Anda
Pureferret
3

Bash - 85

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

Penjelasan

  • read l baca satu baris dari input
  • for w in l memisahkan garis menjadi kata-kata menggunakan pemisah spasi putih
  • x=${w//[^aouieAOUIE]/} menghapus semua kecuali vokal dari kata
  • ${#x} adalah panjang string yang dihasilkan === jumlah vokal
xuesheng
sumber
Entah bagaimana rasanya berlebihan. Persyaratan mengatakan input hanya akan berisi huruf dan spasi. Jadi mengapa Anda menyiapkannya untuk memproses beberapa saluran input? Tanpa while.. do.. doneakan lebih pendek. Juga tidak diperlukan yang terakhir /dalam substitusi pola. Dan satu ruang literal lebih pendek dari yang dikutip. read l;for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo
manatwork
Saya setuju tetapi aturannya mengatakan 'Anda dapat menulis program lengkap, atau fungsi yang mengambil input dari stdin dan mengeluarkan hasilnya.' Jadi saya memutuskan untuk membuat program lengkap. Saya akan mengedit solusi untuk menghemat dua byte)) Terima kasih!
xuesheng
3

Julia, 76 72 69 65 byte

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

Penjelasan + tidak dikumpulkan:

# 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

Ini akan mencakup satu ruang tambahan, yang menurut saya sah.

Alex A.
sumber
2

Mathematica, 95 byte

Tidak akan memenangkan kontes apa pun, tapi ...

Print@StringRiffle[ToString[#~StringCount~Characters@"aeiouAEIOU"]&/@StringSplit@InputString[]]
LegionMammal978
sumber
Apakah Anda tahu ada kompiler online di mana saya bisa menguji ini?
Spikatrix
Tidak ada, tetapi Anda bisa mendapatkan uji coba gratis di sini .
LegionMammal978
@CoolGuy Anda dapat menjalankan kode Mathematica (Wolfram Language) online jika Anda mendapatkan akun gratis di sini . (Tidak yakin InputStringada di antarmuka web, ini adalah dialog di Mathematica.)
@ Calle Dalam skrip Mathematica, InputStringmengambil baris input berikutnya.
LegionMammal978
Ok aku paham. Yah masih tidak yakin apakah itu akan berfungsi di notebook cloud tapi setidaknya sekarang saya tahu mengapa ini digunakan untuk stdin.
2

golflua, 55 byte

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

Pencocokan pola dasar vokal setelah huruf kecil paksa. Setara Lua (ungolfed) akan menjadi

line=io.read()
for word in line:lower():gmatch("%w+") do
   _,c=word:gsub("[aeiou]",'')
   io.write(c," ")
end
Kyle Kanos
sumber
Sebagai tambahan, untuk versi Lua, sebenarnya akan lebih pendek 2 karakter untuk digunakan gsub('[aeiouAEIOU]','')dan dilewati lower().
Kyle Kanos
2

R , 139 byte

Baca / tulis stdout () mengerikan

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
sumber
R tidak terlalu buruk . ;) Anda bisa menggunakan cat()daripada write(..., stdout()).
Alex A.
2

Python 3, 72 byte

Terinspirasi oleh @randomra 's jawaban . Panjangnya sama sedikit lebih lama, tetapi menggunakan regex bukannya daftar pemahaman. Ini juga kurang mudah dibaca.

import re
print(*map(len,re.sub("[^aeiou ]","",input(),0,2).split(" ")))
Masyarakat
sumber
Hemat 7 bytes: import re;print(*map(len,re.sub("[^aeiou ]","",input()).split())). (Gunakan baris baru alih-alih ;jika Anda mau.)
mbomb007
@ mbomb007 Perlu case-insensitive ( 2flag case case-insensitive) dan dipisah " "sehingga dapat ada 0 barang panjang
Ah, tes saya tidak cukup luas untuk memperhatikan itu.
mbomb007
2

PHP - 94

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

Versi tidak disatukan

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

Objective-C, 223 byte

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

Bukan bahasa yang paling ringkas, tetapi berhasil.

Versi tidak terkompresi:

- (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
sumber
2

Matlab, 73 byte

Tantangan Anda tidak terlalu jelas (tetapi menarik). Saya berasumsi

  • Dengan "vokal" maksudmu a, e, i, o, u.
  • String tidak mengandung spasi di depan atau di belakang

Kode:

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

rs , 50 byte

Ini tidak masuk hitungan; rs diunggah sekitar 2 minggu setelah ini diposting. Namun, ternyata ini tidak akan memenangkan apa pun, jadi tetap saja keren.

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

Demo langsung.

Implementasinya agak mudah:

*[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
sumber
2

Perl, 60 45

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

Berkat kirbyfan64sos karena telah menyelamatkan saya 15 byte - itu sangat membantu!
Perhatikan ada ruang ekstra di akhir output.

ASCIIThenANSI
sumber
Anda dapat menghapus panggilan ke splitdengan mengatur penambahan $/=" ";, dan Anda dapat mempersingkat awalan loop menjadi while(<>). Dengan dua perubahan itu, kode menjadi $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}, menghemat 14 byte!
kirbyfan64sos
2

Haskell, 76 68 byte

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

Implementasi langsung, tidak yakin apakah ada golf di sini.

ThreeFx
sumber
1

KDB (Q), 30 byte

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

Penjelasan

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

Uji

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

Smalltalk - 66 72

Ini di Smalltalk / X; nama untuk stdin dan stdout mungkin berbeda dalam mencicit / pharo.

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

Dalam Smalltalk / X (dan banyak dialek lainnya), simbol memahami #value :, sehingga dapat disingkat menjadi 66 karakter:

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

Jika dikodekan sebagai fungsi yang mendapatkan string sebagai argumen "s":

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

Tentu saja, dalam kode nyata, seseorang akan menggunakan fungsi utilitas "f", yang mengembalikan vektor hitungan, dan mencetaknya. Namun, format output tidak sesuai dengan tantangan yang diminta:

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

Python 2, 76 byte

Saya membuat ini sebelum saya melihat solusi lain, kemudian memeriksa untuk menemukan dua solusi P3 yang lebih pendek :( Darn keterbatasan P2.

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

PowerShell, 65 byte

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

uji dengan menggunakan pola di bawah ini setelah menyimpan sebagai vowels.ps1

"the quick brown fox" | vowels.ps1

Dengan cara ini, ini adalah skrip aktual dan bukan hanya cuplikan kode yang dengan demikian memuaskan batasan:

"Input harus dikonsumsi dari argumen stdin atau baris perintah."

Bevo
sumber
1

Jelly , 7 byte

Ḳf€ØcL€

Cobalah online!

Ditemukan dengan bantuan dari Mr. Xcoder dalam obrolan

Penjelasan

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

Jika output harus dipisahkan dengan spasi, maka tambahkan a Ksampai akhir

caird coinheringaahing
sumber
0

SAS, 72

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

Format I / O terbatas untuk yang satu ini benar-benar sakit karena ini bertanggung jawab atas 25 byte di sini.

Telor goreng
sumber
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)))));}}
DLeh
sumber
Ini gagal untuk kasus uji ketiga. Program Anda sepertinya tidak masuk hitungan AEIOU.
Spikatrix