Modulo算法证明是难以捉摸的

时间:2016-05-28 17:10:41

标签: algorithm clock modulo color-wheel

我有一个色轮,可以在24小时制的时间内将颜色映射到每小时。现在给出一天中的小时,我想将这些颜色映射到12小时时钟,以便使用前5小时和当前小时后6小时的颜色。但它有点棘手b / c结果的第0个索引总是必须是24色轮的第0种颜色或第12种颜色。

例如,给定colors24作为24种颜色的数组,小时时间为5,则最终的color12数组将映射到colors24的索引:

{0,1,2,3,4,5,6,7,8,9,10,11}

如果小时是3,那么:

{0,1,2,3,4,5,6,7,8,9,22,23}

如果小时是9,那么:

{12,13,14,15,4,5,6,7,8,9,10,11}

如果算法可以推广到任何两个数组,无论大小如何,只要第一个数据可以被第二个数据整除,就可以获得奖励积分。

4 个答案:

答案 0 :(得分:2)

如果class TestController extends Controller { public function view ($id){ $car = Car::find($id); $car->category; $car->user; $car->tags; dd($car); } } 是总小时数(24),php artisan config:clear一次显示的颜色数(12)和hours是当前小时,那么这是将索引引入颜色数组的通用算法:

length

这是一个Javascript实现(通用,可以与24/12之外的其他范围一起使用):

hour

如问题中所述,小时数(24)必须是要返回的数组长度的倍数。

答案 1 :(得分:1)

这可以通过首先将数字放入临时数组,然后在其中找到0或12的位置,并打印该位置的结果,将索引视为圆形(即模数长度)来完成/ p>

以下是一个示例实现:

int num[12];
// Populate the values that we are going to need
for (int i = 0 ; i != 12 ; i++) {
    // 19 is 24-5
    num[i] = (h+i+19) % 24;
}
int p = 0;
// Find p, the position of 0 or 12
while (num[p] != 0 && num[p] != 12) {
    p++;
}
// Print num[] array with offset of p
for (int i = 0 ; i != 12 ; i++) {
    printf("%d ", num[(p+i) % 12]);
}

Demo.

注意:可以组合第一个和第二个循环。如果您设置的数字为零或12,请添加一项检查,并在找到匹配项时设置p的值。

答案 2 :(得分:0)

你能不能直接得到颜色,即从(C-Y / 2 + X + 1)%X到(C + Y / 2)%X,然后对它们进行排序?

(这与从Z = -Y / 2到Z = Y / 2-1的循环(C + Z + X + 1)%X相同):

for (i = 0, j = c+x+1, z = -y/2; z < y/2; z++) {
    color[i++] = (z+j)%x;
}

对于C = 3,X = 24和Y = 12,您得到:

 (C-12/2+24+1)%24 = 3-6+24+1 = 22, 23, 0, 1 .. 9

排序后,根据要求获得0,1 ... 9,22,23。

如果没有排序,你总会得到一个序列,当前小时位于中间(这可能对某些应用程序有利),而你的3个例子让它向左移动了两个位置。

如果c低于Y / 2(C = 3使你从-2开始变为22),你可以通过移动而不是排序来注意你只需要移动,在这种情况下你会转移负数y / 2-c(这里,2或12 + 2使用另一个模数),或者如果c> (x-y / 2),在这种情况下你会超越x:如果c = 20,c + 6是26,它会回滚到2:

15 16 17 18 19 20 21 22 23 0 1 2

并且通常给出s因子2 + 1 = 3或(c + y / 2)%x + 1:

0 1 2 15 16 17 18 19 20 21 22 23


for (i = 0, j = c+x+1, z = -y/2; z < y/2; z++) {
    color[(s+i++)%y] = (z+j)%x;
}

但是,如果x&gt;我认为你有问题2 * Y;在这种情况下,你得到一些c值,其中0和x / 2都不是c的“触及范围”。也就是说,“均匀可分”必然意味着x必须始终等于到y * 2.

答案 3 :(得分:0)

这是JavaScript中的解决方案:

function f(h) {
  var retval = [];
  for (var i = h - 5; i <= h + 6; ++i)
    retval.push((i+24) % 24);
  return retval.sort(function(a,b){return a-b;}); // This is just a regular sort
}

https://repl.it/CWQf

例如,

f(5) // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
f(3) // [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 22, 23 ]
f(9) // [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ]