まず、連続する単語の間にカウンター N をリセットするのを忘れました。N をゼロに設定してから、単語の反復処理を開始します。
したがって、概要では、アルゴリズムは次のように動作します。
最初の単語では、N は 0..25 を繰り返します。2
番目の単語では、N は 26 で始まり、まったく繰り返されません
。3 番目の単語では、N は 26 で始まり、繰り返されません
。
したがって、完全な初心者のために、次のようにします。
array1 = Array.new
array1 = ('A'..'Z').to_a
array2 = Array.new
array2 = ('A'..'Z').to_a
array2 = array2.rotate(2)
puts "enter a word:"
word1 = gets.chomp
word1 = word1.upcase.split(//) # <-- note that you REPLACE the input string
# with an sequence of STRINGS produced by SPLIT
word1.each do # for each STRING in the SEQUENCE
n = 0
while n < 26 # scan all 26 letters from ARRAY
if word1[n] == array1[n] # ... WTF
word1[n] = array2[n]
end
n += 1
end
end
ここで、文字のスキャンを少なくとも 1 単語ごとに同じ方法で実行し続けます。ただし、これも期待どおりには機能しませんが、まったく別の理由です。
Nを実際にどのように使用しますか?
if word1[n] == array1[n]
word1[n] = array2[n]
end
したがって、SEQUENCE から N 番目の WORD を読み取り、
それを array1 の N 番目の LETTER と比較します。
それは本当にあなたがやりたかったことですか?そうではありません。
おそらく、WORD のすべての文字を、2 つの配列によって形成された文字のペアに置き換えたいと思うでしょう。
そのため、代わりに次のことを行います。
それをワンライナーに圧縮することもできます:
-- loop
-- loop2
word[position] = array2[array1.index(word[position])]
position
ただし、ではなく、今言っていることに注意してくださいN
。N
ARRAY の文字のインデックスを意味する範囲 0..25 として使用しました。
ただし、単語の文字を検査するには、単語の文字を反復処理する必要があります。単語はどれくらいですか?確かに、0..25 ではありません!
微妙な変更にも注意してください:word
の代わりにword1
. 「単語の配列」ではなく、「単語」と「単語の文字」と言います。もともと、N
シーケンスから N 番目の単語を読み取るためにも使用していましたが、そのままにしておきましょう。しかし、単語の文字を繰り返し処理する必要があるため、別の変数が必要ですposition
。
n = 0
arrayOfWords.each do
word = arrayOfWords[n]
position = 0
while position < word.length
letter = word[position]
letterindex = array1.index(letter)
substitution = array2[letterindex]
word[position] = subsitution
position += 1
end
n += 1
end
現在の単語の実際の長さを反復するために、N
が各単語にとどまり、増加するだけであり、が毎回ゼロにリセットされることに注意してください。position
Ruby では、これは非常に手の込んだ方法です。Ruby には、コードを短縮できるすばらしいトリックがたくさんあります。たとえば、each
メソッドはループだけではありません。それは実際に各単語* を提供します。N はまったく必要ありません。
arrayOfWords.each do |word|
position = 0
while position < word.length
word[position] = array2[array1.index(word[position])]
position += 1
end
end
バーに「単語」を追加した方法に注意してください || each
呼び出しに。同様の方法で も実際に取り除くことができますposition
が、その場合はコードが短くなりますが、読みにくく、理解しにくくなります。