文字列の各単語の母音の数を数える


13

これはかなり簡単な挑戦です。

チャレンジ

入力には、null最大長100の文字列(not またはempty)が含まれます。文字列の各単語の母音の数をスペースで区切って出力します。

ルール

  • 文字列の長さは100文字を超えません。
  • 文字列にはアルファベットのみが含まれA-Za-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形式を主張する理由はありますか?」 -いいえ、私だけのようstdinstdout。関数の引数を介して「入力を取得」するのは好きではありません。コマンドライン引数は問題ないようです。投稿に追加しました。
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

単一の後続スペースは大丈夫ですか?
アレックス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、113108103 96バイト

@ andrea-biondoに5バイトの節約をありがとう。

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場合cASCIIの母音(大文字または小文字)であり、そして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%(...)されます。ゼロなります。

EDIT:この方法では、1つの式を検討することができます文字かどうかを決定するものとして母音です。コメントで@ andrea-biondoはペアが!(n%((c-65&31)+s))(n,s) = (124701951, 33)c(n,s) = (2016,28) biondoはこの表現で母音を決定するためにを使用することもできるとました。現在の説明は上記の素数に関して残しますが、この短いペアリングが機能する理由は、28--53の範囲で2016年の素因数のセットに完全に素数を持つ唯一の数値が28、32であるためです。母音に正確に対応する36、42、48。

EDIT2:(c-65&31)+28に短縮できるため、さらに5バイト節約されc%32+27ます。

EDIT3:do-whileループに変換され、最終的に100バイト未満になりました。

テストケース:

$ ./vowelc「これが最初のテストケースです」
1 1 1 1 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ループごとに再初期化されるため、グローバルを宣言して一度ゼロに初期化することはできません。母音(n, s)n%((c-65&31)+s)はゼロで、子音(az、AZ)でゼロでない最小のペアを見つけるために、小さなブルートフォーサーを作成しました。私は見つけて(2016, 28)、それはうまくいくようです:!(2016%((c-65&31)+28))5文字短いです。とにかく、非常に素晴らしい解決策:)
アンドレアビオンド

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

Ungolfed +説明:

# 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

30文字+1のために-n

多くのPerlコードと同様に、これは右から左に機能します。 split入力された行を空白で分割します。 分割された各単語map{}でコードを実行します。 lc単語を小文字にします。 =~y/aeiou//母音の数がわかります。 .$"単語にスペースを追加します。 sayその後、すべての単語を印刷します!

で実行:

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

4

Python 3、65バイト

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

非常に簡単で、かなり読みやすい。w単語をc表し、文字を表します。


4

Perl:30文字

(Kind of forceルール:出力内の数字は、入力語と同じ数のスペースで区切られます。)

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

Perl:27文字

y///の戻り値を忘れなかった場合にどれだけ短いかを示すために、もう一度。今度は、戻り値について思い出させたchilemagic答えに投票してくださいy///。再び。)

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

これは私の答えを打ちます。これによりs!\w+!lc($&)=~y/aeiou//!ge27バイト数が減ります(-p。の場合は26文字+1
hmatt1

はい、ありがとう。もう何回忘れたのか指では期待できませんy///。:(
マナトワーク

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

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

PowerShell、35バイト

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

ちょっと退屈ですが、実際には一度だけ競争しますか?(PowerShellはデフォルトで大文字と小文字を区別しません、woo)


FYI、あなたのようにこれを呼び出すneedto echo <word> | codeここで、<言葉>、あなたの単語やフレーズです
Pureferret

3

バッシュ-85

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

説明

  • read l 入力から1行読み取ります
  • 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
マナトワーク

私は同意しますが、ルールには「完全なプログラム、または標準入力から入力を取得して結果を出力する関数を作成できます」と書かれています。だから私は完全なプログラムを作ることにしました。ソリューションを編集して2バイトを節約します))ありがとう!
xuesheng

3

ジュリア、76 72 69 65バイト

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

Ungolfed +説明:

# 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ただし、Webインターフェイスに存在するかどうかは

@Calle MathematicaスクリプトでInputStringは、次の入力行を受け取ります。
LegionMammal978

なるほど、分かりました。クラウドノートブックで機能するかどうかはまだわかりませんが、少なくとも今では標準入力に使用されている理由がわかりました。

2

golflua、55バイト

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

強制的に小文字にした後の母音の基本的なパターンマッチング。(変更されていない)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()
カイルカノス

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())
アレックスA.

2

Python 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バイト

あなたの課題はあまり明確ではありません(しかし、興味深いです)。私は仮定しています

  • "母音"とはどういう意味aeiou
  • 文字列に先頭または末尾のスペースが含まれていません

コード:

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

Perl、60 45

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

15バイト節約してくれたkirbyfan64sosに感謝します。
出力の最後に余分なスペースがあることに注意してください。


split追加を設定すること$/=" ";でへの呼び出しを削除でき、ループプレフィックスをに短縮できますwhile(<>)。これら2つの変更により、コードは$/=" ";while(<>){$n=()=/[aeiou]/gi;print"$n "}14バイトになります!
kirbyfan64sos

2

Haskell、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

Smalltalk-66 72

これはSmalltalk / Xにあります。squeak / pharoでは、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

Python 2、76バイト

私は他のソリューションを見る前にこれを作成し、次に短い2つの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)))));}}

3番目のテストケースではこれは失敗します。あなたのプログラムは重要ではないようですAEIOU
Spikatrix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.