2017-05-29 7 views
0

2つ以上の単語を翻訳するRuby豚ラテン翻訳者に問題があります。私は、母音、子音、または2つの子音で始まる単語を私の関数で翻訳する方法をうまく理解しました。そして、最初の関数で.mapを使うtranslate_wordsという2番目の関数を作成したいと思っています。Ruby複数の単語豚ラテン

文字列「eat pie」が送信されると、出力は「eat pieay」になります。それは2番目の単語を変更するだけでなく、誤って( "eatay iepay"にする必要があります)。私は運がないので、他の複数のソリューションを見てきました。私はまだ正規表現で非常に新しいので、それらのソリューションは私の頭の上に少しだった。

このプロジェクトはRSpecで動作し、私の下にテストコードを追加しました。ここで

は私のコードです:

def translate(input) 
    pig_string = '' 
    if input[0] =~ /[aeiou]/ 
     return input + 'ay' 
    elsif input[0] =~ /[^aeiou]/ && input[1] =~ /[aeiou]/ 
     return input[1..-1] + input[0] + 'ay' 
    elsif input[0..1] =~ /[^aeiou]/ 
     return input[2..-1] + input[0..1] + 'ay' 
    else 
     return input[0] + input + 'ay' 
    end 
end 

def translate_words(multi_words) 
    word_count = multi_words.split.size 
    if word_count > 1 
     multi_words.map! do |word| 
      translate(word) 
     end 
    end 
end 

RSpecの:bitsapienとセルジオTulentsevにより、上記のコメントを1として

it "translates two words" do 
    s = translate("eat pie") 
    expect(s).to eq("eatay iepay") 
end 
+0

コードに入力、予想出力、実際の出力を含めます。できるだけコピーペーストを実行するのが簡単です。 –

+1

あなたのコードは、小さな変更を加えるだけで問題なく動作します。代わりに 'multi_words.split.map!'を実行してください。 – bitsapien

+1

@bitsapien:「絶対にうまくいく」 - まあ、ほとんど。文字列が1つの単語で構成されているときは、何もしません。 1つの単語の文字列は、複数単語の文字列の特別な場合です:) –

答えて

0

def translate_words(multi_words) 
    multi_words.split.map do |word| 
    translate(word) 
    end.join(' ') 
end 

mapmap!の代わりに十分でしょう。

translate_words('eat plie') #=> "eatay ieplay" 
+0

'map'ではなく' map! 'をいつ使う必要がありますか?それはテストに合格することができたようには見えず、それでもまだ "pieayを食べている"と出力しています。役立つなら、私はOdinプロジェクトのTest-First Rubyプロジェクトの一環としてこれをやっています:https://www.theodinproject.com/courses/web-development-101/lessons/ruby?ref=lc-pb –

+0

@イシアイオ:いいえ、それは "食べるパイ"を出力しません。それを正しくコピーしていないか、何かをコピーしていなければなりません。 –

+0

@IsaiahO:あなたのテストは何を期待していますか?完全に翻訳された文字列、または翻訳された単語の配列?お互いに一致するようにコードやテストを調整します。 –

関連する問題