代码大战:带有while循环的Flap显示

时间:2017-07-29 05:43:57

标签: ruby loops hash while-loop nested-loops

我试图通过使用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]]的零值。如何使用基本循环和枚举或哈希修复这两个问题?

1 个答案:

答案 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 #=> 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 }