我在过去的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方式是什么?
答案 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