2016-09-26 8 views
1

私はこのプログラムを書いて名前を取り、姓と名を逆にし、文字を1つ上に移動しました。私がそれを走らせると、それはうまくいきますが、最後には各名前の別名を別名で吐き出します。彼らは指数関数的に見えますが、3つのエイリアスがあれば9つの結果が得られます。私を助けてください。ルビーが初めて。私に混合結果を与えるRuby暗号化プログラム

@aliases = [] 
@real = [] 

def alias_machine(name) 
@real << name 
name = name.downcase 
name_array = name.split(' ') 
first_name = name_array[1] 
first_name_split = first_name.split('') 
last_name = name_array[0] 
new_namearray1 = first_name_split.map do |y| 
vowels = ["a", "e", "i", "o", "u"] 
    if y == vowels[0] 
     y = "e" 
    elsif y == vowels[1] 
     y = "i" 
    elsif y == vowels[2] 
     y = "o" 
    elsif y == vowels[3] 
     y = "u" 
    elsif y == vowels[4] 
     y = "a" 
    elsif y.next == "aa" 
     y = "b" 
    elsif y.next == vowels[1] 
     y = y.next.next 
    elsif y.next == vowels[2] 
     y = y.next.next 
    elsif y.next == vowels[3] 
     y = y.next.next 
    elsif y.next == vowels[4] 
     y = y.next.next 
    else 
     y = y.next 
    end 
end 
last_name_split = last_name.split('') 
new_namearray2 = last_name_split.map do |y| 
    vowels = ["a", "e", "i", "o", "u"] 
if y == vowels[0] 
    y = "e" 
elsif y == vowels[1] 
    y = "i" 
elsif y == vowels[2] 
    y = "o" 
elsif y == vowels[3] 
    y = "u" 
elsif y == vowels[4] 
    y = "a" 
elsif y.next == "aa" 
    y = "b" 
elsif y.next == vowels[1] 
    y = y.next.next 
elsif y == vowels[2] 
    y.next.next 
elsif y.next == vowels[3] 
    y = y.next.next 
elsif y.next == vowels[4] 
    y= y.next.next 
else 
y = y.next 
end 
end 


new_namearray1 = new_namearray1.join('') 
new_namearray1 = new_namearray1 + " " 
new_namearray1 = new_namearray1.capitalize 
new_namearray2 = new_namearray2.join 
new_namearray2 = new_namearray2.capitalize 
lastarray = [] 
lastarray[0] = new_namearray1 
lastarray[1] = new_namearray2 
lastarray = lastarray.join 
@aliases << lastarray 
end 

loop do 
p "Give us a name" 
names = gets.chomp 
if names == "Quit" 
    p "Thanks!" 
    @aliases.each do |aliases| 
    @real.each do |real| 
    p "#{aliases} is actually #{real}" 
    end 
    end  
break 
else 
    alias_machine(names) 
end 
end 
+2

あなたが使用する必要があります:あなたは、このコマンドを使用してペア保存することができます:

@aliases << [name, lastarray] 

をして、もう一度それを読んで。 1/String.html#method-i-tr)を使用して文字を置き換えます。 'first_name.tr(' a-z '、' ecdfighjoklmnpuqrstvawxyzb ')' – Stefan

+0

@Stefan 'tr'は*正確に*ここで使用するツールです。このコードは実際には長くて紛らわしく、最終的にはそれを試して再実装するだけです。 – tadman

+0

少なくとも、if文の長い鎖の代わりに、['case']を使ってみてください(https://ruby-doc.org/core-2.3.1/doc/syntax/control_expressions_rdoc.html#ラベルケース+式)、またはハッシュ構造を使用するルックアップテーブル。また、 'n2 = n2.join.capitalize'や' c = [a、b] .join'のようなものを連鎖させることができます。 – tadman

答えて

1

実際の名前とエイリアスをそれぞれの変数に追加します。プログラムが終了すると、両方の組み合わせを反復処理します。したがって、指数関数的な結果が得られます。

@aliases.each do |aliases| 
    @real.each do |real| 
    p "#{aliases} is actually #{real}" 
    end 
end 

おそらく、配列に変数が1つだけ必要です。 [ `tr`](http://ruby-doc.org/core-2.3

@aliases.each do |name, alias_name| 
    p "#{alias_name} is actually #{name}" 
end 
+0

ありがとう!私はそれが最終的にそこにあったと思ったが、それを修正する方法を理解できなかった!それは有り難いです。 – lylesconstant

+0

['alias'](http://ruby-doc.org/core-2.3.1/doc/syntax/miscellaneous_rdoc.html#label-alias)はキーワードであり、変数名として使用することはできません。 – Stefan

関連する問題