Javascript — Как мне создать небольшую функцию, которая проверяет, являются ли A = 1 и B = 3 / 4 / 5 и сделать это для 8 значений A?

#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 .

Вот скрипка, с которой можно поиграть.