- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从事一个个人项目,我发现自己重复了很多代码:
// this code is in a function with params k & dir
// where i equals a number from 0-2 inclusive
// j = (i + 1) % 2
// k = (j + 1) % 2
// The objective is to change a.x, a.y, b.x, & b.y
1. if(k === 0 && dir === -1) { a.x = dir * array[k].x; a.y = dir * array[k].y; b.x = dir * -array[i].x; b.y = dir * -array[i].y; }
2. if(k === 0 && dir === 1) { a.x = dir * array[i].x; a.y = dir * array[i].y; b.x = dir * -array[k].x; b.y = dir * -array[k].y; }
3.
4. if(k === 1 && dir === -1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; b.x = dir * -array[i].x; b.y = dir * -array[i].y; }
5. if(k === 1 && dir === 1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; b.x = dir * -array[i].x; b.y = dir * -array[i].y; }
6.
7. if(k === 2 && dir === -1) { a.x = dir * -array[j].x; a.y = dir * array[j].y; b.x = dir * array[i].x; b.y = dir * -array[i].y; }
8. if(k === 2 && dir === 1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; b.x = dir * array[j].x; b.y = dir * -array[j].y; }
我两天来一直在尝试减少代码,但没有成功,坦率地说,我相信一定有办法不使用所有这些 if 语句。
我只是想在正确的方向上引起轰动,尽管非常欢迎完整的解决方案。
到目前为止,我尝试再次使用模运算符之类的操作,但问题出在第 7
和 8
行等部分,因为数组索引不同,具体取决于判断您的对象是 a
还是 b
。所以我相信必须至少有两个 if 语句,但我只是迷失了。
再说一遍,这最重要的是成为一个谜题,所以我希望它至少对编码专家来说是有趣的:)
代码已经可以工作,只是重复,我希望找到一个更简洁的解决方案。所有值都是数字,a
和 b
都是包含 { x: undefined, y: undefined }
的对象。
为了清楚起见,分为两个对象:
// for a
if(k === 0 && dir === -1) { a.x = dir * array[k].x; a.y = dir * array[k].y; } // (0, -1) => (0)
if(k === 0 && dir === 1) { a.x = dir * array[i].x; a.y = dir * array[i].y; } // (0, 1) => (1)
if(k === 1 && dir === -1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; } // (1, -1) => (2)
if(k === 1 && dir === 1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; } // (1, 1) => (2)
if(k === 2 && dir === -1) { a.x = dir * -array[j].x; a.y = dir * array[j].y; } // (2, -1) => (1)
if(k === 2 && dir === 1) { a.x = dir * -array[i].x; a.y = dir * array[i].y; } // (2, 1) => (0)
// for b
if(k === 0 && dir === -1) { b.x = dir * -array[i].x; b.y = dir * -array[i].y; } // (0, -1) => (1)
if(k === 0 && dir === 1) { b.x = dir * -array[k].x; b.y = dir * -array[k].y; } // (0, 1) => (0)
if(k === 1 && dir === -1) { b.x = dir * -array[i].x; b.y = dir * -array[i].y; } // (1, -1) => (2)
if(k === 1 && dir === 1) { b.x = dir * -array[i].x; b.y = dir * -array[i].y; } // (1, 1) => (2)
if(k === 2 && dir === -1) { b.x = dir * array[i].x; b.y = dir * -array[i].y; } // (2, -1) => (0)
if(k === 2 && dir === 1) { b.x = dir * array[j].x; b.y = dir * -array[j].y; } // (2, 1) => (1)
每行末尾的注释显示输入 => 输出,其中 (k, dir) => 输出
,输出值是赋予 array
的索引>.
array
是函数范围之外的数组。
for(let i = 0; i < 3; i++) {
// list has arrays inside containing coordinates in a 2d plane, following a triangular grid. Each value looks like this [0, 2, -1]
// j = next modulus value in base 3 given i
// k = next modulus value in base 3 given j
let j = (i + 1) % 3;
let k = (i + 2) % 3;
list[i] = [...old_list].sort((a, b) => { // sort list
// This provides 3 sorted lists which are sorted by xy, yz, and zx
if(a[i] === b[i]) {
if( a[j] === b[j] && Math.abs(a[k] - b[k]) ) {
my_function(a, b, i, j, k);
}
return a[j] - b[j];
}
return a[i] - b[i];
});
}
my_function(a, b, i, j, k) {
let modules = universe.modules;
let dir = b[k] - a[k];
a = {x: undefined, y: undefined};
b = {x: undefined, y: undefined};
if(k === 0 && dir === -1) { a.x = dir * module.constraints[k].x; a.y = dir * module.constraints[k].y; } // (0, -1) => (0)
if(k === 0 && dir === 1) { a.x = dir * module.constraints[i].x; a.y = dir * module.constraints[i].y; } // (0, 1) => (1)
if(k === 1 && dir === -1) { a.x = dir * -module.constraints[i].x; a.y = dir * module.constraints[i].y; } // (1, -1) => (2)
if(k === 1 && dir === 1) { a.x = dir * -module.constraints[i].x; a.y = dir * module.constraints[i].y; } // (1, 1) => (2)
if(k === 2 && dir === -1) { a.x = dir * -module.constraints[j].x; a.y = dir * module.constraints[j].y; } // (2, -1) => (1)
if(k === 2 && dir === 1) { a.x = dir * -module.constraints[i].x; a.y = dir * module.constraints[i].y; } // (2, 1) => (0)
if(k === 0 && dir === -1) { b.x = dir * -module.constraints[i].x; b.y = dir * -module.constraints[i].y; } // (0, -1) => (1)
if(k === 0 && dir === 1) { b.x = dir * -module.constraints[k].x; b.y = dir * -module.constraints[k].y; } // (0, 1) => (0)
if(k === 1 && dir === -1) { b.x = dir * -module.constraints[i].x; b.y = dir * -module.constraints[i].y; } // (1, -1) => (2)
if(k === 1 && dir === 1) { b.x = dir * -module.constraints[i].x; b.y = dir * -module.constraints[i].y; } // (1, 1) => (2)
if(k === 2 && dir === -1) { b.x = dir * module.constraints[i].x; b.y = dir * -module.constraints[i].y; } // (2, -1) => (0)
if(k === 2 && dir === 1) { b.x = dir * module.constraints[j].x; b.y = dir * -module.constraints[j].y; } // (2, 1) => (1)
// doing some stuff with Matter.js(physics library) to decide where to add constraints between two bodies
}
最佳答案
这段代码可能有问题。自从我开始写这个问题以来,这个问题已经改变了,而且我可能没有跟上。但我认为这至少可以展示一种避免重复的技术:
const rules = [[0, -1, 'k', 'k', 'i', 'i'], [0, 1, 'i', 'i', 'k', 'k'], /* ... */]
const foo = (i, j, k, dir, array) => {
const idxs = {i, j, k}
const a = {}, b = {}
const [,, ax, ay, bx, by] = rules.find(([rk, rd, ..._]) => rk === k && rd === dir)
a.x = dir * array[idxs[ax]].x
a.y = dir * array[idxs[ay]].y
b.x = dir * -array[idxs[bx]].x
b.y = dir * -array[idxs[by]].y
return {a, b}
}
console.log(foo(0, 1, 0, -1, [{x: 1, y: 2}]))
重要的部分是规则列表,它实际上捕获您的逻辑,以及 idxs 对象,它允许将这些规则转换为实际值。可能有一种方法可以更进一步,对 a、b、x 和 y 进行类似的操作。但我认为这达到了可读性的平衡。
关于javascript - 帮助查找包含模运算符的 if 语句中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712145/
是否有更快的算法来计算 (n! modulo m)。在每个乘法步骤都比减少更快。并且有没有比左右二元法更快的算法来计算 (a^p modulo m)。 这是我的代码:n!模数m ans=1 for(i
我有非常简单的代码循环遍历数组中的元素并检查是否index % 2 == 0。如果是这样,它应该改变颜色。 var e = document.getElementById("list").childN
让我简短一点。我正在计算 alert((Math.pow(7,35))%71) 但它给了我 61,而结果必须是 70。怎么了? 最佳答案 正如其他人之前提到的关于使用 Math.pow(7,35) 的
我试图弄清楚如何在汇编中计算模 10,所以我在 gcc 中编译了以下 c 代码,看看它想出了什么。 unsigned int i=999; unsigned int j=i%10; 令我惊讶的是我得到
例如使用以下输入: int num = -100 int divisor = 10 => -100 mod 10 = 0 (Edge-case: negative numbers as inpu
这个问题在这里已经有了答案: Random float number generation (14 个答案) 关闭 9 年前。 在 C++ 中,我希望得到一个随机 float 。据我所知,典型的随机
我试图找到潜在阶乘素数的除数(n!+-1 形式的数),因为我最近购买了 Skylake-X 工作站,我认为我可以使用 AVX512 指令提高一些速度。 算法简单,主要步骤是对同一个除数重复取模。主要是
我有一个保存角度(以度为单位)的变量,该角度可以是正值也可以是负值。我现在需要确保该数字仅在 0 到 360 之间。该数字是 double 。 执行此操作的好算法是什么?简单地执行角度 % 360 是
我有一个 UInt8 数组,我想计算 CheckSum8 模 256。如果字节总和小于 255,checkSum 函数返回正确的值。 例如 let bytes1 : [UInt8] = [1, 0xa
使用海湾合作委员会: printf("%i \n", -1 % (int)4); printf("%u \n", -1 % (unsigned int)4); 输出: -1 3 我可以跨平台依赖这种行
我无法理解代码中几行的含义。我最近开始学习 C++,并阅读了 Bjarne Stroustrup 的“编程:使用 C++ 的原理和实践”。第四章有个问题让我很困惑,所以我在网上搜索了一个解决方案以供引
我试图解决一个涉及大阶乘模质数的问题,并在另一个人的解决方案中发现了以下算法: long long factMod (long long n, long long p) { long long
我正在尝试计算 𝐹𝑛 模 𝑚,其中 𝑛 可能非常大:高达 10^18,𝐹𝑛 是第 n 个斐波那契数这是我的代码,它适用于小数字,但对于大数字,它会抛出 OutOfMemoryError 或
我有两个以 16 为模的循环整数,因此它们的值介于 0 和 15 之间。 我需要比较两个数字以确定 n_1 是否大于 n_0 n_1 > n_0 很明显,这个没有准确定义,所以我定义n_1如果小于前面
我一直在尝试使用 Java 处理一些更大的值,但遇到了一些我不理解的问题。出于某种原因,Java 似乎喜欢给我垃圾数据(尽管,我更可能告诉它给我垃圾数据) 这是一个片段,为清楚起见进行了编辑:
好吧,我今天做了一个小函数,它应该会生成一个随机字符串。 std::string randString(size_t length) { std::string randStr; fo
Ruby 的负数取模规则不明确。在 IRB 中: -7 % 3 == 2 应该是1!为什么? 最佳答案 因为 -7/3 在 Ruby 的整数除法语义下是 -3。 3*-3 是 -9,所以会留下 2
这个问题在这里已经有了答案: Calculating pow(a,b) mod n (14 个答案) 关闭 6 年前。 在 Javascript 中是否有获取大数模数的技巧。我用 modulo(7,
此代码使用公式 (a^x) % 101 检查值 a 是否唯一映射到值 1 到 100 local function f(a) found = {} bijective = true
在《Core Java Volume1》一书中有一条警告: CAUTION: The right-hand side argument of the shift operators is reduce
我是一名优秀的程序员,十分优秀!