代码大战:使用 while 循环的 Flap Display
Code wars: Flap Display with while loops
我正在尝试使用 while 循环完成 5 级套路。本质上,问题是将每个字母转动 rotors[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
这在技术上遍历了字符串并分配了正确的字母。然而,它失败了两件重要的事情:当它旋转到正确的位置时它不会跳过每个字母(C 应该在它碰到 D 时停止旋转,当它碰到 O 时 A 等)并且它没有考虑到达内容列表的末尾最终 returns 为 stuff[stuff.index(new_word[0][j]) + rotors[i]]
的零值。我如何使用基本循环和枚举或者哈希来解决这两个问题?
给出了更完整的问题陈述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 }
我正在尝试使用 while 循环完成 5 级套路。本质上,问题是将每个字母转动 rotors[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
这在技术上遍历了字符串并分配了正确的字母。然而,它失败了两件重要的事情:当它旋转到正确的位置时它不会跳过每个字母(C 应该在它碰到 D 时停止旋转,当它碰到 O 时 A 等)并且它没有考虑到达内容列表的末尾最终 returns 为 stuff[stuff.index(new_word[0][j]) + rotors[i]]
的零值。我如何使用基本循环和枚举或者哈希来解决这两个问题?
给出了更完整的问题陈述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 }