#javascript #if-statement #math
#javascript #if-statement #математика
Вопрос:
Я создал сайт для школьного проекта, и я подумал, что мне нужна функция для проверки направления ветра, вот к чему я пришел: это определенно не лучший способ сделать это, поэтому мне было интересно, может ли кто-нибудь сжать его до чего-то более короткого. Заранее спасибо!
if (
(A == 1 amp; B == 8) ||
(A == 1 amp; B == 1) ||
(A == 1 amp; B == 2) ||
(A == 2 amp; B == 1) ||
(A == 2 amp; B == 2) ||
(A == 2 amp; B == 3) ||
(A == 3 amp; B == 2) ||
(A == 3 amp; B == 3) ||
(A == 3 amp; B == 4) ||
(A == 4 amp; B == 3) ||
(A == 4 amp; B == 4) ||
(A == 4 amp; B == 5) ||
(A == 5 amp; B == 4) ||
(A == 5 amp; B == 5) ||
(A == 5 amp; B == 6) ||
(A == 6 amp; B == 5) ||
(A == 6 amp; B == 6) ||
(A == 6 amp; B == 7) ||
(A == 7 amp; B == 6) ||
(A == 7 amp; B == 7) ||
(A == 7 amp; B == 8) ||
(A == 8 amp; B == 7) ||
(A == 8 amp; B == 8) ||
(A == 8 amp; B == 1)
){action}
else if (
(A == 1 amp; B == 4) ||
(A == 1 amp; B == 5) ||
(A == 1 amp; B == 6) ||
(A == 2 amp; B == 5) ||
(A == 2 amp; B == 6) ||
(A == 2 amp; B == 7) ||
(A == 3 amp; B == 6) ||
(A == 3 amp; B == 7) ||
(A == 3 amp; B == 8) ||
(A == 4 amp; B == 7) ||
(A == 4 amp; B == 8) ||
(A == 4 amp; B == 1) ||
(A == 5 amp; B == 8) ||
(A == 5 amp; B == 1) ||
(A == 5 amp; B == 2) ||
(A == 6 amp; B == 1) ||
(A == 6 amp; B == 2) ||
(A == 6 amp; B == 3) ||
(A == 7 amp; B == 2) ||
(A == 7 amp; B == 3) ||
(A == 7 amp; B == 4) ||
(A == 8 amp; B == 3) ||
(A == 8 amp; B == 4) ||
(A == 8 amp; B == 5)
) {action}
else {action}
Комментарии:
1.
B
является либоA - 1
,A
либоA 1
вif
случае иA 4 - 1
,A 4
либоA 4 1
вelse if
случае ( некоторое переполнение)2. » материал о направлении ветра » Каковы исходные значения? Или, если эти числа являются исходными значениями (при условии направления ветра), какова фактическая цель всей операции?
3. можете ли вы немного уточнить это?
4. каковы диапазоны переменных? у вас есть только целочисленные значения от одного до восьми?
Ответ №1:
Вы можете уменьшить этот каскад с помощью
if (B == A || B == (A % 8) 1 || B == ((A 6) % 8) 1) {
} else if (B == ((A 2) % 8) 1 || B == ((A 3) % 8) 1 || B == ((A 4) % 8) 1) {
} else {
}
Это еще менее сложно с вспомогательной функцией:
// map input from range [0, 13] into range [1, 8]
const m = v => ((v 7) % 8) 1;
if (B == A || B == m(A 1) || B == m(A - 1)) {
} else if (B == m(A 3) || B == m(A 4) || B == m(A 5)) {
} else {
}
Вы можете протестировать его с помощью:
// map input from range [0, 13] into range [1, 8]
const m = v => ((v 7) % 8) 1;
for (let A = 1; A <= 8; A) {
for (let B = 1; B <= 8; B) {
if (B == A || B == m(A 1) || B == m(A - 1)) {
console.log("A = " A ", B = " B ": Action 1");
} else if (B == m(A 3) || B == m(A 4) || B == m(A 5)) {
console.log("A = " A ", B = " B ": Action 2");
} else {
console.log("A = " A ", B = " B ": Action 3");
}
}
}
Ответ №2:
Я думаю, что это, вероятно, в принципе похоже на ответ @Thomas Sablik, но моему мозгу немного легче понять.
const circle_number_numbers = 8;
function circle_number(n) {
const modded = n % circle_number_numbers;
return modded < 1 ? modded circle_number_numbers : modded;
}
function sameish(a, b) {
return a === circle_number(b) || a === circle_number(b 1) || a === circle_number(b - 1);
}
function oppositeish(a, b) {
return sameish(a, b (circle_number_numbers / 2));
}
function test(a, b) {
if(sameish(a, b)) {
console.log(a, b, 'sameish');
} else if(oppositeish(a, b)) {
console.log(a, b, 'oppositeish');
} else {
console.log(a, b, 'other');
}
}
test(2, 5);
test(2, 3);
test(2, 2);
test(2, 1);
test(2, 8);
test(1, 8);
test(2, 8);
test(1, 5);
test(1, 6);
Ответ №3:
Вы могли бы вычислить расстояние между A
и B
. При вычислении вы должны иметь в виду, что максимальное расстояние между точками равно 6
. Если расстояние увеличивается, то B
оно находится рядом A
слева. Кроме того, при проверке дополнительного сектора A
он не должен расти выше 8
, вместо этого он должен принимать направление из следующего раунда. Вот более или менее простой код:
const A = 1, B = 3; // This is the data
function distance (a, b, R) {
a = (a R > 8) ? a - R : a R; // Put a to the next round if needed
const d = Math.abs(b - a); // True distance
return (d > 6) ? -1 : d; // Return the modified distance
};
if (distance(A, B, 0) < 2) {
console.log('Same sector');
} else if (distance(A, B, 4) < 2) {
console.log('Complement sector');
} else {
console.log('Supplement sector');
}
Код также можно использовать с индексами направления на основе нуля, a
его нужно ограничить только 7
distance
функцией in .