代码大战:使用 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 #=> 65rot_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 }