我试图通过使用while循环来完成5级kata。基本上问题是将每个字母转子[n]转动多次,然后转到下一个转子编号,直到得到输出字。
flap_display(["CAT"],[1,13,27])
应输出["DOG"]
这是我到目前为止所拥有的
def flap_display(lines, rotors)
stuff = "ABCDEFGHIJKLMNOPQRSTUVWXYZ?!@#&()|<>.:=-+*/0123456789"
i = 0
j = 0
new_word = lines
while i < rotors.length
while j < new_word[0].length
new_word[0][j] = stuff[stuff.index(new_word[0][j]) + rotors[i]]
j += 1
end
i += 1
j = 0
end
new_word
end
这在技术上遍历了东西字符串并分配了正确的字母。然而,它失败了两个重要的事情:当它旋转到正确的位置时它不会跳过每个字母(当它击中D时C应该停止旋转,当它击中O时A应该停止A)并且它没有考虑到达到填充列表的末尾并最终返回stuff[stuff.index(new_word[0][j]) + rotors[i]]
的零值。如何使用基本循环和枚举或哈希修复这两个问题?
答案 0 :(得分:1)
here给出了一个更全面的问题陈述。这是一种类似Ruby的方式。
FLAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ?!@#&()|<>.:=-+*/0123456789"
NBR_FLAPS = FLAPS.size
def flap_display(str, rot)
rot_cum = rot.each_with_object([]) { |n,a| a << a.last.to_i + n }
str.gsub(/./) { |c| FLAPS[(c.ord + rot_cum.shift - 65) % NBR_FLAPS] }
end
flap_display("CAT", [1,13,27])
#=> "DOG"
flap_display("DOG", [-1,-13,-27])
#=> "CAT"
flap_display("CAT", [5,37,24])
#=> "H*&"
'A'.ord #=> 65
和rot_cum
包含rot
的累积值:
arr = [1, 13, 27]
rot_cum = arr.each_with_object([]) { |n,a| a << a.last.to_i + n }
#=> [1, 14, 41]
我写了a.last.to_i
而不是a.last
来处理a
为空的情况,所以a.last #=> nil
,意为a.last.to_i => nil.to_i => 0
。见NilClass#to_i。那些反对这种诡计的人可以写道:
rot_cum = arr.drop(1).each_with_object([arr.first]) { |n,a| a << a.last + n }