Bir dizenin her kelimesindeki sesli harf sayısını sayın


13

Bu oldukça kolay bir mücadeledir.

Meydan okuma

Girdi null, maksimum uzunluk 100 olan bir dize ( boş veya boş) içerecektir. Dizenin her kelimesindeki boşluk sayısını ayırarak sesli harf sayısını çıktılayın.

kurallar

  • Dize, 100 karakterden uzun olmayacaktır.
  • Dize sadece alfabe içerecektir A-Z, a-zhem de boşluk içerebilir.
  • Girdi, stdinveya komut satırı bağımsız değişkenlerinden tüketilmelidir .
  • Çıktı stdout,.
  • Tam bir program veya stdinsonuçtan çıktı alan ve sonuç çıktısı alan bir işlev yazabilirsiniz .
  • Programınızın / fonksiyonunuzun sayması gereken sesli harfler aeiouve AEIOU.

Test Durumları

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

puanlama

Bu , bu yüzden en kısa gönderme (bayt cinsinden) kazanır.


6
Oldukça kısıtlayıcı bir G / Ç biçiminde ısrar etmenizin bir nedeni var mı? Her dil (uygun şekilde) STDIN ve STDOUT ile etkileşime giremez. Bunun için komut satır argümanına, işlev bağımsız değişkenine, dönüş değerine vb. İzin veren varsayılan ayarlarımız var (isterseniz elbette geçersiz kılmak için özgürsünüz). (Bunlar wiki etiketinde de bulunabilir .)
Martin Ender

MartinBüttner @, " Eğer oldukça kısıtlayıcı G / Ç formatında ısrar bir nedeni var mı? " - Hayır ben sadece gibi stdinolan stdout. İşlev bağımsız değişkenleri aracılığıyla "girdi almak" istemiyorum. komut satırı argümanları iyi görünüyor. Gönderiye ekledim.
Spikatrix

4
WIKIPEDIA: Seslilerle 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.ne demek istiyorsun?
edc65

Tek bir boşluk boş mu?
Alex A.

3
Önerilen Zorluklar için Korumalı Alanı kullanın.
mbomb007

Yanıtlar:


8

Pyth, 17 bayt

jdml@"aeiou"dcrzZ

Kolay çözüm. Çevrimiçi deneyin: Gösteri veya Test koşum takımı

Açıklama:

               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

İnsanlar Pyth çözüm yazmak ve (bu bir çoğundan daha kavramak kuşkusuz daha kolay olmasına rağmen) "Kolay" diyoruz zaman zaman 1 beni eğlendiriyor
Christopher WIRT

10

C, 113108109 96 bayt

@ Andrea-biondo özellikle güzel 5 bayt tasarruf için teşekkürler .

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

Bu hala şişkin hissediyor, umarım bu akşam biraz bayt düşebilirim.

İlginç olan belki de

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

olacak 1eğer cbir (büyük veya küçük harf) ASCII sesli harf olduğunu ve 0diğer karakterler için a-zA-Z. Subexpression c-65&31haritalar 'a've 'A'için 0, 'b've 'B'için 2vb biz eklediğinizde 33ünlüler numaralarına karşılık 33, 37, 41, 47, 53asal hepsi vardır (elverişli) sırasıyla. Bizim aramızda sadece bu sayılar bölünecek 124701951 = 33*37*41*47*53, yani sadece sesli harfler için kalanlar 124701951%(...)sıfır olacaktır.

DÜZENLEME: Bu şekilde bir ifade düşünebiliriz karakter olmadığının belirlenmesinde olarak bir sesli harf olduğunu. Yorumlarda @ andrea-biondo , çiftin bu ifadede ünlülüğü belirlemek için de kullanılabileceğine dikkat çekti . Mevcut açıklamayı yukarıdaki asallar açısından bırakacağım, ancak bu daha kısa eşleştirmenin çalışmasının nedeni yine 28-53 aralığında, 2016'nın ana faktörleri kümesinde tamamen asal faktörleri olan tek sayının 28, 32, Tam olarak sesli harflere karşılık gelen 36, 42, 48.!(n%((c-65&31)+s))(n,s) = (124701951, 33)c(n,s) = (2016,28)

EDIT2: O zamandan beri kaydedilen 5 bayt (c-65&31)+28daha kısaltılabilir c%32+27.

EDIT3: Sonunda 100 baytın altına almak için bir do-while döngüsüne dönüştürüldü.

Test senaryoları:

$ ./vowelc "Bu ilk test vakası"
1 1 1 1 1 2 
$ ./vowelc "bir artı iki üç eşittir"
2 1 1 3 2 
$ ./vowelc "aeiou AEIOU"
5 5 
$ ./vowelc "psst"                     
0

AMAN TANRIM! Bu sadece harika! a;Dışarıda kullanarak daha fazla bayt kaydedebilirsiniz main. Bu şekilde, size bir açıklamadan gerekmez gibi bazı bayt azaltmak aiçinde main(...)ve aynı zamanda, başlatmak gerekmez adöngüden.
Spikatrix

1
@CoolGuy: aher döngüde yeniden başlatılır, böylece global bildirerek bir kez sıfıra başlatamazsınız. Ünlüler için sıfır ve ünsüzler için sıfır olmayan en küçük (n, s)çifti bulmak için küçük bir bruteforcer yazdım n%((c-65&31)+s)(az, AZ). Buldum (2016, 28)ve iyi çalışıyor gibi görünüyor: !(2016%((c-65&31)+28))5 karakter daha kısa. Her neyse, çok güzel bir çözüm :)
Andrea Biondo

7

CJam, 21 19 bayt

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

Nasıl çalışır :

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

Buradan çevrimiçi deneyin


6

R, 44 43 bayt

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

Ungolfed + açıklaması:

# 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

Perl, 35 34 31

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

30karakterler +1için -n.

Birçok Perl kodu gibi, bu da sağdan sola çalışır. splitgirilen satırı boşlukta böler. bölünen her sözcük maparasındaki kodu çalıştıracaktır {}. lckelimeyi küçük harfe çevirir. =~y/aeiou//ünlüleri sayar. .$"kelimeye bir boşluk ekler. saysonra tüm kelimeleri basar!

Şununla çalıştır:

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

4

Python 3, 65 bayt

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

Çok basit, oldukça okunabilir. wkelime, ckarakter anlamına gelir.


4

Perl: 30 karakter

(Bir tür kuralları zorlar: Çıktıdaki sayılar, giriş sözcükleri kadar boşlukla ayrılır.)

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

Örnek çalışma:

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

(Tıpkı unutmak olmasaydı kısa olacağını göstermek için y///'nin dönüş değeri. Yine. Şimdi upvote gidip chilemagic ' ın cevabı hakkında hatırlattı y///dönüş değeri s'. Yine.)

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

Dang bu cevabımı atıyor. Bu bayt s!\w+!lc($&)=~y/aeiou//!gealır 27(26 karakter +1 -p.
hmatt1

Evet teşekkürler. Artık kaç kez unuttuğumu parmaklarıma güvenemiyorum y///. :(
manatwork

3

Ruby, 38 bayt

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

Kullanımı:

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

3

JavaScript ( ES6 ), 68

Açılır pencere yoluyla G / Ç. Test etmek için snippet'i Firefox'ta çalıştırın.

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

Asi - 70

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

3

PowerShell, 35 bayt

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

Biraz sıkıcı, ama aslında bir kez yarışıyor musunuz? (PowerShell varsayılan olarak büyük / küçük harfe duyarlı değildir, woo)


Bilginize, bunu şöyle aramanız gerekir echo <word> | code, burada <word> sizin kelimeniz veya
ifadenizdir

3

Baş - 85

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

açıklama

  • read l girişten bir satır oku
  • for w in l boşluğu ayırıcı kullanarak satırı kelimelere böler
  • x=${w//[^aouieAOUIE]/} ünlüler hariç tüm kelimeleri siler
  • ${#x} sonuçta elde edilen dizenin uzunluğu === sesli harf sayısı

Bir şekilde abartılı geliyor. Gereklilik, girdinin yalnızca harf ve boşluk içereceğini söylüyor. Öyleyse neden birden fazla girdi satırını işlemek için hazırladınız? Olmadan while.. do.. donedaha kısa olurdu. Ayrıca /desen değiştirme sonuncusu gerekli değildir . Ve tek bir değişmez alan alıntı yapılandan daha kısadır. read l;for w in $l;do x=${w//[^aouieAOUIE]};echo -n ${#x}\ ;done;echo
manatwork

Kabul ediyorum ama kural 'Tam bir program veya stdin'den girdi alan ve sonucu çıktılayan bir fonksiyon yazabilirsiniz' diyor. Bu yüzden tam programı yapmaya karar verdim. İki bayt kaydetmek için çözümü düzenleyeceğim)) Teşekkürler!
xuesheng

3

Julia, 76 72 69 65 bayt

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

Ungolfed + açıklaması:

# 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

Bu, yasal olduğu söylenen tek bir sondaki alanı içerecektir.


2

Mathematica, 95 bayt

Herhangi bir yarışma kazanmayacak, ama ...

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

Bunu test edebileceğim herhangi bir çevrimiçi derleyici biliyor musunuz?
Spikatrix

Hiç yok, ama burada ücretsiz deneme alabilirsiniz .
LegionMammal978

@CoolGuy Buradan ücretsiz bir hesap alırsanız Mathematica (Wolfram Dili) kodunu çevrimiçi çalıştırabilirsiniz . (Ancak InputStringweb arayüzünde olduğundan emin değil , Mathematica'da bir iletişim kutusu.)

@Calle Mathematica komut dosyalarında bir InputStringsonraki girdi satırını alır.
LegionMammal978

tamam anladım. Peki hala bulut defterde çalışıp çalışmayacağından emin değilim ama en azından şimdi neden stdin için kullanıldığını biliyorum.

2

golflua, 55 bayt

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

Zorla küçük harften sonra sesli harflerin temel örüntü eşleşmesi. Bir (çözülmemiş) Lua eşdeğeri

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

Bir yana, Lua sürümü için, aslında kullanmak gsub('[aeiouAEIOU]','')ve atlamak için 2 karakter daha kısa olurdu lower().
Kyle Kanos

2

R , 139 bayt

Okuma / yazma stdout () korkunç

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 o kadar da kötü değil . ;) Bunun cat()yerine kullanabilirsiniz write(..., stdout()).
Alex A.

2

Python 3, 72 bayt

Esinlenerek @randomra 'ın cevabı . Bu var aynı uzunlukta biraz daha uzun, ama liste anlama yerine regex kullanarak. Ayrıca daha az okunabilir.

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

7 bayt Kaydet: import re;print(*map(len,re.sub("[^aeiou ]","",input()).split())). (İsterseniz newline kullanın ;.)
mbomb007

@ mbomb007 Büyük / küçük harfe duyarsız ( 2büyük / küçük harfe duyarsız bayrak) ve bölmek gerekir, " "böylece 0 uzunluk şeyler olabilir

Ah, testlerim bunu fark edecek kadar geniş değildi.
mbomb007

2

PHP - 94

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

Ungolfed sürümü

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

2

Objective-C, 223 bayt

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

En kompakt dil değil, işe yarıyor.

Sıkıştırılmamış sürüm:

- (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 bayt

Zorluğunuz çok açık değil (ama ilginç). Varsayıyorum

  • "Sesli harfle" yle, demek a, e, i, o, u.
  • Dize, önde gelen veya sondaki boşluk içermiyor

Kod:

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

2

rs , 50 bayt

Bu tam olarak sayılmaz; rs gönderildikten yaklaşık 2 hafta sonra yüklendi. Ancak, açıkçası bu hiçbir şey kazanamaz, bu yüzden hala havalı.

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

Canlı demo.

Uygulama oldukça basittir:

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

Perl, 60 45

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

Bana 15 bayt kurtardığı için kirbyfan64sos sayesinde - bu gerçekten yardımcı oldu!
Çıktının sonunda fazladan bir boşluk olduğunu unutmayın.


Ekleme splitayarını yaparak çağrıyı kaldırabilir $/=" ";ve döngü önekini kısaltabilirsiniz while(<>). Bu iki değişiklikle kod $/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}, 14 bayt tasarruf sağlar!
kirbyfan64sos

2

Haskell, 76 68 bayt

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

Basit uygulama, burada golf için bir şey olup olmadığından emin değilim.


1

KDB (Q), 30 bayt

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

açıklama

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

Ölçek

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

1

Smalltalk - 66 72

Bu Smalltalk / X; stdin ve stdout isimleri gıcırtı / faroda farklı olabilir.

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

Smalltalk / X'te (ve diğer birçok lehçede), semboller #değer: değerini anlar, böylece 66 karakterle kısaltılabilir:

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

Dizeyi "s" bağımsız değişkeni olarak alan bir işlev olarak kodlanırsa:

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

Tabii ki, gerçek kodda, sayımların bir vektörünü döndüren ve bunu yazdıran bir yardımcı program "f" kullanılır. Ancak, çıktı formatı tam olarak zorluğun istediği şey değildir:

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

1

Python 2, 76 bayt

Bunu başka bir çözüm görmeden önce yaptım, sonra daha kısa olan iki P3 çözeltisi bulmak için kontrol ettim :( Lanet P2 sınırlamaları.

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

1

PowerShell, 65 bayt

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

olarak kaydettikten sonra aşağıdaki deseni kullanarak test edin vowels.ps1

"the quick brown fox" | vowels.ps1

Bu şekilde, sadece bir kod snippet'i değil gerçek bir komut dosyasıdır ve böylece kısıtlamayı karşılar:

Msgstr "Giriş stdin veya komut satırı argümanlarından tüketilmelidir."


1

Jöle , 7 bayt

Ḳf€ØcL€

Çevrimiçi deneyin!

Yardımıyla Bulunan Sn Xcoder içinde sohbet

açıklama

Ḳ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ış durumunda gereken alanı ayrılmalıdır ve ardından bir ekleme Kucuna


0

SAS, 72

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

Bunun için kısıtlayıcı G / Ç formatı, buradaki baytların 25'inden sorumlu olduğu için gerçekten acıyor.


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

Bu üçüncü test durumu için başarısız olur. Programınız sayılmaz AEIOU.
Spikatrix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.