ruby测验-使用while循环重新分配数组值
我从一个“简单的”ruby测试中得到了这个例子。如果数组的值等于(=)array1的值,我想将其重新赋值给array2的值。请看一下代码,这样就很明显:ruby测验-使用while循环重新分配数组值,ruby,Ruby,我从一个“简单的”ruby测试中得到了这个例子。如果数组的值等于(=)array1的值,我想将其重新赋值给array2的值。请看一下代码,这样就很明显: 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.upc
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(//)
n = 0
word1.each do
while n < 26
if word1[n] == array1[n]
word1[n] = array2[n]
end
n += 1
end
end
puts word1 # This word should now be "encoded" and not easy to read.
array1=Array.new
数组1=('A'..'Z')。到_A
array2=Array.new
array2=('A'..'Z')。到_A
array2=array2.旋转(2)
输入“输入一个单词:”
word1=get.chomp
word1=word1.upcase.split(//)
n=0
每个人都做
而n<26
如果字1[n]==array1[n]
word1[n]=array2[n]
结束
n+=1
结束
结束
puts word 1#这个单词现在应该是“编码”的,不容易阅读。
我试过这个代码,它会随机地改变我输入的任何单词的1-2个字母(gets.chomp)
因此,我希望word1是一个数组,将每个元素(字母)与array1[0]进行比较,如果它等于,则将重新分配给array2[0]的值。如果word1[0]和array1[0]不相等,则“n”的值更改为+1,并再次运行该块
注意:对于这个问题,我不想有一个简单的公式,我想真正理解这里发生了什么,以及为什么我的每次迭代都不能像我预期的那样工作。所以,如果你能以“我的知识水平”回答这个问题,那就太棒了 我认为问题在于您使用相同的“计数器”
n
检查两个不同的数组,请尝试以下操作:
编辑
根据您的评论,由于您只需要如此混乱,以下是一种可能的方式:
array1 = ('A'..'Z').to_a
array2 = ('A'..'Z').to_a.shuffle
puts "enter a word:"
word1 = gets.chomp
word1 = word1.upcase.split(//)
n = 0
word1.each do
word1[n] = array2[n]
n +=1
end
puts word1
它将始终生成不同的输入,即使您使用同一个单词,因为
数组2中的洗牌我认为问题在于您使用相同的“计数器”n
检查两个不同的数组,请尝试以下操作:
编辑
根据您的评论,由于您只需要如此混乱,以下是一种可能的方式:
array1 = ('A'..'Z').to_a
array2 = ('A'..'Z').to_a.shuffle
puts "enter a word:"
word1 = gets.chomp
word1 = word1.upcase.split(//)
n = 0
word1.each do
word1[n] = array2[n]
n +=1
end
puts word1
它将始终生成不同的输入,即使您使用同一个单词,因为数组2中的洗牌首先,您忘记在连续单词之间重置计数器N。将N设置为零,然后开始迭代单词
因此,在概述中,您的algo的行为如下:
对于第一个单词,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个单词
.. 并将其与阵列1中的第n个字母进行比较
这真的是你想做的吗?完全不是
您很可能希望替换WORD中的每个字母以及由两个数组组成的字母对
因此,你想:
- 阅读单词1中的第n个字母
- 然后在数组1中的哪个索引处检查
- 然后从索引中读取替换字母
- 然后在WORD的第n个位置写下这封信:
letter = word[position]
letterindex = array1.index(letter)
substitution = array2[letterindex]
word[position] = subsitution
您也可以将其压缩为一行:
-- loop
-- loop2
word[position] = array2[array1.index(word[position])]
但是,请注意,我现在说的是位置
,而不是N
。您使用了N
作为范围0..25,这意味着数组中字母的索引
但是,为了检查单词的字母,您需要对单词的字母进行迭代。这个词有多长?当然,不是0..25
还要注意微妙的变化:word
而不是word1
。我说的是“单词”和“单词的字母”,而不是“单词”。最初,您还使用N
读取序列中的第N个单词,让我们保留它。但当我们需要迭代word的leter时,需要一个不同的变量,'比如说位置
:
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
请注意,我是如何将条形图中的“word”添加到每个调用的中的。
以类似的方式,您实际上也可以去掉位置,但这反过来会使代码更短,但更难阅读/理解。首先,您忘了重置连续单词之间的计数器N。将N设置为零,然后开始迭代单词
因此,在概述中,您的algo的行为如下:
对于第一个单词,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个单词
.. 并将其与阵列1中的第n个字母进行比较
这真的是你想做的吗?完全不是
您很可能希望替换WORD中的每个字母以及由两个数组组成的字母对
因此,你想:
- 阅读单词1中的第n个字母
- 然后在数组1中的哪个索引处检查
- 然后从索引中读取替换字母
- 然后在WORD的第n个位置写下这封信:
letter = word[position]
letterindex = array1.index(letter)
substitution = array2[letterindex]
word[position] = subsitution
您也可以将其压缩为一行:
-- loop
-- loop2
word[position] = array2[array1.index(word[position])]
但是,请注意,我现在说的是位置
,而不是N
。您使用了N
作为范围0..25,这意味着数组中字母的索引
但是,为了检查单词的字母,您需要对单词的字母进行迭代。这个词有多长?当然,不是0..25
还要注意微妙的变化:word
而不是word1
。我说的是“单词”和“单词的字母”,而不是“单词”。最初,您还使用N
读取序列中的第N个单词,让我们保留它。但当我们需要迭代word的leter时,需要一个不同的变量,'比如说位置
:
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
请注意,我是如何将条形图中的“word”添加到每个调用的中的。
类似地,你实际上也可以摆脱的位置,但这反过来会使代码更短,但更难阅读/理解。我终于设法回答了我的问题