我试图将整数映射到范围(1..7)
范围内的数字。 1
到7
将映射到自己,8
到1
,14
到7
,依此类推。
这样做的明显候选者是模数方法%
。但是,7 % 7
会提供0
,这是我不想要的。
可以编写以下方法:
def int_map i
(x = i % 7) == 0 ? 7 : x
end
我觉得应该有更好,更简洁的方法来做到这一点。在那儿?怎么样?
答案 0 :(得分:2)
以下是另一种方法:
(1..7).to_a.rotate(i).last
以下示例程序:
def int_map i
[1,2,3,4,5,6,7].rotate(i).last
end
int_map(1)
#=> 1
int_map(7)
#=> 7
int_map(8)
#=> 1
int_map(14)
#=> 7
int_map(15)
#=> 1
PS:随着i
的值变大,可能效率低下,但我的测试并没有表明这一点。可能是Ruby实现很聪明,并且以有效的方式处理多个轮换。
答案 1 :(得分:0)
该方法的结果应为:
(i - 1) % 7 + 1
答案 2 :(得分:0)
这是另一种解决方案,不使用模数。缺点是所有这些数学都会使代码混乱。
i - (i - 1) / 7 * 7
答案 3 :(得分:0)
她是另一种解决方案。很容易理解。
[7,1,2,3,4,5,6][i % 7]
如果没有完整指定数组,您可以执行
(1..7).to_a.rotate(-1)[i % 7]