假设有一个编码的3x3平面:
1 2 3
4 5 6
7 8 9
在顺时针旋转之后,它变成:
7 4 1
8 5 2
9 6 3
要将前者转换为后者,一个明显的方法是这样做:
switch (num) {
case 1: return 7; break;
case 2: return 4; break;
...
}
例如,[1, 5, 6, 9]
给出了[7, 5, 2, 3]
。
不管怎么说,没有硬编码就可以这么做吗?
发布于 2020-12-06 15:13:44
将值转换为新值的函数将到达相同的位置,您可以使用以下定义的函数(在JavaScript中):
function rotated(num) {
num--; // convert to zero-based number
return 1 + (2 - num % 3) * 3 + Math.floor(num / 3);
}
// demo: print original and new value next to each other:
for (let num = 1; num <= 9; num++) {
console.log(num, rotated(num));
}
后续行动
在评论中,你问我是如何想出这个解决方案的。
有几种方法可以达到这个目的,但我认为是这样的:
我想知道:如果我知道给定数字出现的行和列,那么从哪里获得新值的行和列将是什么?
例如,3出现在第0行和第2列(基于零的索引编号中).我需要的值位于第0行和第0列中。通过播放行和列,您会发现第0行中的所有条目都将从列0中获得它们的新值。类似地,第1行中的那些将从第1列中获得它们的新值。
与列号也有一个关系:列0中的所有条目从第2行获得它们的新值,第1列从第1行获得它们,列2中的条目从第0行获得它们。所以这里我们有一个逆关系。
因此,给出一个数字,需要采取的步骤是:
principle)
派生并返回该值。
到目前为止,我一直专注于第二步的细节。第一步应该很容易。给定的num
出现的列索引是(num-1) % 3
(模运算符)。行索引是(num-1)/3
(整数除法)。
步骤3应该做逆运算:将行索引乘以3并添加列索引。这就提供了一个基于零的值,因此应该将1添加到它中。
所有这些都会导致以下代码:
function rotated(num) {
num--; // convert to zero-based number
// Step 1: derive row and column
let col = num % 3;
let row = Math.floor(num / 3);
// Step 2: derive other row and column
let valueCol = row;
let valueRow = 2 - col; // opposite direction
// Step 3: which value sits there?
let value = valueRow * 3 + valueCol + 1;
// Return that
return value;
}
// demo: print original and new value next to each other:
for (let num = 1; num <= 9; num++) {
console.log(num, rotated(num));
}
最后一步是减少程序中使用的变量数.这导致了上面的第一个片段。
https://stackoverflow.com/questions/65169356
复制相似问题