2016-06-24 7 views
0

"Mathew"などの単語を使用して、 "Nevjix"に変換します。母音は次の母音に戻り、子音は次の母音に戻る。配列内の次の値に循環する方法特定の値のみ

母音と子音の2つの配列が作成され、「母音」または「子音」のいずれかを表示することで、コードが正しく識別されます。

の文にnext!のようなものを追加する必要があると思いますが、実際はわかりません。

は、ここで私が持っているものです。

p "Input Agent Name" 
name = gets.chomp 

name = "#{name}".chars 

array1 = ['a', 'e', 'i', 'o', 'u'] 
array2 = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'] 

p name 


value = -1 


until value == name.length 
    value = value+1 
    if array1.include? name[value] 
     p "vowel" 
    elsif array2.include? name[value] 
     p "consonant" 
    end 
end 


p name 
+0

[Array#cycle](http://ruby-doc.org/core-2.2.0/Array.html#method-i-cycle)を利用することができます。たとえば、a = ['a'、 'e'、 'i'、 'o'、 'u']の場合サイクル#=>#<列挙子:["a"、 "e"、 "i" 、 "o"、 "u"]:cycle> '、' a.next#=> "a"; a.next#=> "e"; a.next#=> "i"; a.next#=> "o"; a.next#=> "u"; a.next#=> "a"; a.next#=> "e" ' –

答えて

1

あなたが再マッピングされた文字に、元の文字から単一のマップを使用する必要があります。そして、入力文字列を反復するmapを使用します。

lookup = { 'a' => 'e', 'b' => 'c', 'c' => 'd', ..... } 
name.chars.map! {|c| lookup[c]} 
+0

私はかなり理解していないのですか?私は、 "ルックアップ"が1文字を次の文字に再割り当てしているが、どこに行くのか、それが何を置き換えるのか分からない。また、ルビは名前文字列の値を新しい値で置き換えることをどのように知っていますか?それはちょうど私のために働いているようではありません... –

+0

これを実行し、結果を確認することがあります。 –

0

あなたはおそらく「子音」は「ない-母音」...であることを実現することによって、あなたのソリューションを簡素化することができます「そうでない場合、それはでなければならない 『1、』 『その他』」、第二elsifは、不要であるため、(あなたが実際に... 2つの異なるリストを維持する必要はありません)

2

String#trできましたこれを達成するために使用される。ケーシングを保持したいかどうかはわかりません(この場合、2つの文字列を展開したり、ロジックを追加することができます)。

'matthew'.tr('bcdfghjklmnpqrstvwxyzaeiou', 'cdfghjklmnpqrstvwxyzbeioua') 
#=>"nevvjix" 

代わりにあなたは私が/他のではなく、ternary operator(以下)場合は、明確にするための単純なを使用することを選択しました、このような

puts 'Input Agent Name' 
name = gets.chomp.chars 

def transform_character(char) 
    char.tr('bcdfghjklmnpqrstvwxyzaeiou', 'cdfghjklmnpqrstvwxyzbeioua') 
end 

name.map! do |char| 
    if char == char.upcase 
    transform_character(char.downcase).upcase 
    else 
    transform_character(char) 
    end 
end 

puts name.join 

として、それを書くことができケーシング維持します。ここで

name.map! do |char| 
    char == char.upcase ? transform_character(char.downcase).upcase : transform_character(char) 
end 
1

は、私はそれについて移動したい方法は次のとおりです。

VOWELS = %w[a e i o u] 
CONSONANTS = ('a' .. 'z').to_a - VOWELS 
# => ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z"] 

CHAR_MAP = ((VOWELS + CONSONANTS).zip(VOWELS.rotate + CONSONANTS.rotate)).to_h 
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b"} 

CHAR_RE = Regexp.union(CHAR_MAP.keys) 
# => /a|e|i|o|u|b|c|d|f|g|h|j|k|l|m|n|p|q|r|s|t|v|w|x|y|z/ 

'matthew'.gsub(CHAR_RE, CHAR_MAP) # => "nevvjix" 

gsubそれは本当に簡単に使用する正規表現に応じて、単語、ストリング、個々の文字をマッピングすることができます。私はRegexp.unionパターンを構築できますが、それはまた、されている可能性が:

CHAR_RE = /[#{CHAR_MAP.keys.join}]/ 
# => /[aeioubcdfghjklmnpqrstvwxyz]/ 

か:

CHAR_RE = /[#{(VOWELS + CONSONANTS).join}]/ 
# => /[aeioubcdfghjklmnpqrstvwxyz]/ 

または、より良い、この特定の状況で:

返すでしょう
CHAR_RE = /./ 

同じ結果。

アレイ、マップ、正規表現を作成する時間が非常に短いので、それらを定数として作成してから、コード全体で再利用します。、大文字の文字を扱うそれを少し微調整する

LC_VOWELS = %w[a e i o u] 
LC_CONSONANTS = ('a' .. 'z').to_a - LC_VOWELS 

UC_VOWELS, UC_CONSONANTS = [LC_VOWELS, LC_CONSONANTS].map{ |a| a.map(&:upcase) } 

CHAR_MAP = (
    (LC_VOWELS + UC_VOWELS + LC_CONSONANTS + UC_CONSONANTS).zip(
    [ 
     LC_VOWELS, 
     UC_VOWELS, 
     LC_CONSONANTS, 
     UC_CONSONANTS 
    ].map(&:rotate).inject(:+) 
) 
).to_h 
# => {"a"=>"e", "e"=>"i", "i"=>"o", "o"=>"u", "u"=>"a", "A"=>"E", "E"=>"I", "I"=>"O", "O"=>"U", "U"=>"A", "b"=>"c", "c"=>"d", "d"=>"f", "f"=>"g", "g"=>"h", "h"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"v", "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"b", "B"=>"C", "C"=>"D", "D"=>"F", "F"=>"G", "G"=>"H", "H"=>"J", "J"=>"K", "K"=>"L", "L"=>"M", "M"=>"N", "N"=>"P", "P"=>"Q", "Q"=>"R", "R"=>"S", "S"=>"T", "T"=>"V", "V"=>"W", "W"=>"X", "X"=>"Y", "Y"=>"Z", "Z"=>"B"} 

CHAR_RE = /./ 

'Matthew'.gsub(CHAR_RE, CHAR_MAP) # => "Nevvjix" 

この問題trのためにも、それを行うだろうが、個々の文字を変換する/変更するときにのみ適用できます。それは正規表現を使用する能力が欠けているので、高速ですが柔軟性に欠けます。

関連する問題