从Python学习Ruby编码辅助

时间:2016-09-29 06:44:05

标签: python ruby

我在过去的6个月里一直在学习Python,并且已经完成了100多个问题练习,现在我正在试用Ruby并用Ruby解决这些练习。这是我遇到问题的练习,因为我觉得我已经过度复杂化而且没有以正确的方式做到这一点。这是练习:

机器人正在网格上移动并且具有起始位置(0,0)。可以指示机器人向上,向下,向左或向右移动给定数量的步骤。 编写一个函数,该函数接收指令列表并输出机器人从其起始位置的距离(直线)。距离应四舍五入到最接近的整数。 指令以单个方向阵列的形式给出,然后在该方向上采取若干步骤。

在Python中我会开始类似于:

import math

pos = [0, 0]

while True:

    s = raw_input()
if not s:
    break
movement = s.split(" ")
direction = movement[0]
steps = int(movement[1])
if direction == "UP":
    pos[0] += steps
elif direction == "DOWN":
    pos[0] -= steps
elif direction == "LEFT":
    pos[1] -= steps
elif direction == "RIGHT":
    pos[1] += steps
else :
    pass

我正在创建的ruby函数具有以下内容:

class robot

 DIRECTIONS = [:up, :left, :down, :right]

  def up
   directions[1] += 1
  end

  def right
   directions[0] += 1
  end

  def down
   directions[1] -= 1
  end

  def left
   directions[0] -= 1
  end

end

这项练习最简单的Ruby方式是什么?

1 个答案:

答案 0 :(得分:1)

在毕达哥拉斯和q& a' from this similar question的帮助下,我会做这样的事情:

def robot arr
  ups    = arr.map { |d| d.match(/UP\s(\d+)/);    $1.to_i }.inject(:+)
  downs  = arr.map { |d| d.match(/DOWN\s(\d+)/);  $1.to_i }.inject(:+)
  rights = arr.map { |d| d.match(/RIGHT\s(\d+)/); $1.to_i }.inject(:+)
  lefts  = arr.map { |d| d.match(/LEFT\s(\d+)/);  $1.to_i }.inject(:+)

  Math.hypot(rights - lefts, ups - downs).to_i
end

关键技术和方法:

match使用regex从每个字符串元素中提取数字。 $1产生最近match个对象的第一次捕获。 Math.hypot(感谢@steenslag指出这一点)计算斜边,这比需要更多计算的Math.sqrt更容易使用。

示例:

input = ["UP 5", "DOWN 3", "LEFT 3", "RIGHT 2", "UP 2", "LEFT 1"]
p robot input
#=> 4

input = ["UP 5", "DOWN 1", "LEFT 3", "RIGHT 6"]
p robot input
#=> 5