有没有更好的方法将整数映射到一系列数字?

时间:2016-02-24 14:25:35

标签: ruby

我试图将整数映射到范围(1..7)范围内的数字。 17将映射到自己,81147,依此类推。

这样做的明显候选者是模数方法%。但是,7 % 7会提供0,这是我不想要的。

可以编写以下方法:

def int_map i
  (x = i % 7) == 0 ? 7 : x
end

我觉得应该有更好,更简洁的方法来做到这一点。在那儿?怎么样?

4 个答案:

答案 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]