首先,您忘记在连续单词之间重置计数器 N。您将 N 设置为零,然后开始迭代单词。
因此,在概述中,您的算法的行为如下:
对于第一个单词,N 迭代超过 0..25
对于第二个单词,N 以 26
开头,并且根本不迭代对于第三个单词,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
现在,您将至少对每个单词保持字母扫描以相同的方式运行。但是,这也不会按预期工作,而是完全不同的原因。
您实际上如何使用N?
if word1[n] == array1[n]
word1[n] = array2[n]
end
因此,您从 SEQUENCE 中读取 Nth WORD
.. 并将其与 array1 中的 Nth LETTER 进行比较。
这真的是你想做的吗?完全没有。
您很可能想要替换 WORD 中的每个字母以及由两个数组形成的字母对。
所以,相反,你想:
您也可以将其压缩为 oneliner:
-- loop
-- loop2
word[position] = array2[array1.index(word[position])]
但是,请注意我现在说position
的不是N
。您使用N
的范围是 0..25,表示 ARRAY 中字母的索引。
但是,为了检查单词的字母,您需要遍历单词的 letters。这个词有多长?当然,不是 0..25!
还要注意细微的变化:word
而不是word1
. 我说“单词”和“单词的字母”,而不是“arrayofwords”。最初,您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
,但这反过来会使代码更短,但更难阅读/理解。