2016-09-27 3 views
2

Я хочу создать массив из всех возможных комбинаций трех переменных, которые могут быть истинными или ложными (т. Е. 8 возможных комбинаций).Создание всех возможных комбинаций true/false

Я пытаюсь создать куб в левом верхнем углу на этом изображении

enter image description here

Так что выход должен быть чем-то вроде

points = [ 
    // first square 
    { 
    id: '000', 
    truths: [false, false, false] 
    position: [0, 0] 
    }, 
    { 
    id: '100', 
    truths: [true, false, false] 
    position: [5, 0] 
    }, 
    { 
    id: '010', 
    truths: [false, true, false] 
    position: [0, 5] 
    }, 
    { 
    id: '110', 
    truths: [true, true, false] 
    position: [5, 5] 
    }, 
    // second square 
    { 
    id: '001', 
    truths: [false, false, true] 
    position: [2.5, 2.5] 
    }, 
    { 
    id: '101', 
    truths: [true, false, true] 
    position: [7.5, 2.5] 
    }, 
    { 
    id: '011', 
    truths: [false, true, true] 
    position: [2.5, 7.5] 
    }, 
    { 
    id: '111', 
    truths: [true, true, true] 
    position: [7.5, 7.5] 
    }, 
]; 

lines = [ 
    { from: '000', to: '100' }, 
    { from: '000', to: '010' }, 
    { from: '000', to: '001' }, 

    { from: '100', to: '101' }, 
    { from: '100', to: '110' }, 

    { from: '001', to: '101' }, 
    { from: '001', to: '011' }, 

    { from: '101', to: '001' }, 
    { from: '101', to: '111' }, 

    ... 
] 

Я не знаю, как идти через все возможные значения истинности и создавать эти точки.

Один из подходов может быть использование для цикла

for (var i=0; i<Math.pow(2, 3); i++) { 
    ... 
} 

, но это не помогает мне назначая возможные значения истинности.

+1

Возможны 2^n возможных значения. Если вы не хотите использовать вложенные для циклов (вы действительно не должны), то извлекайте биты целых чисел «0 ... 2^n». Значения 'n' в' истинах' будут битами целого числа. – plasmacel

+0

Я просто не понимаю, если ваш заказ равен 0,4,2,3,1,5,7,8, как вам поможет двоичный подход. Почему бы вам не использовать только цифры. – Redu

+0

@Redu Я не понимаю, о чем вы говорите. Приказ не имеет значения.Все целые числа от 0 до 8 будут представлять 3 бита, которые соответствуют массиву 'истины' в аналогии OP. 2^n целых чисел = 2^n 'истины'. В двоичном выражении числа можно рассматривать как «массивы» бит: 0 = [0,0,0], 1 = [0,0,1], 2 = [0,1,0], 3 = [0,1 , 1], 4 = [1,0,0], 5 = [1,0,1], 6 = [1,1,0], 7 = [1,1,1]. – plasmacel

ответ

3

Все в компьютере уже двоично. Вам не нужны никакие фантазии Math.pow или подобные.

for (let i = 0; i < 1 << 3; i++) { 
 
    console.log([!!(i & (1<<2)), !!(i & (1<<1)), !!(i & 1)]); 
 
}

Хотя это выглядит красиво и короткие, я на самом деле не поклонник !! или магических чисел. Тем не менее, я всегда нападаю на эти трюки при написании фрагментов. Поэтому будет пытаться дать немного чище версию:

const AMOUNT_OF_VARIABLES = 3; 
 

 
for (let i = 0; i < (1 << AMOUNT_OF_VARIABLES); i++) { 
 
    let boolArr = []; 
 
    
 
    //Increasing or decreasing depending on which direction 
 
    //you want your array to represent the binary number 
 
    for (let j = AMOUNT_OF_VARIABLES - 1; j >= 0; j--) { 
 
    boolArr.push(Boolean(i & (1 << j))); 
 
    } 
 
    
 
    console.log(boolArr); 
 
}

+0

Привет, просто спрашиваю из-за любопытства ... делает это '0' (' for let i = 0; ') равным двоичному' 0'? Это то же самое, что «1 >>> 1»? –

+0

'0' действительно равен нулю. Просто посмотрите на это так, javascript-бинарные операторы работают «как будто» на 32-битных целых числах, мы используем только три бита: 000, 001, 010, 011, 100, 101, 111. Просто опуская первые 29 нулей, Не заботьтесь об этом. – ASDFGerte

+0

Хорошо, спасибо за разъяснение! Я привык к C-подобным вещам (где я обычно использую '\ 0'), поэтому иногда я запутываюсь. –

1

Это легко, просто конвертировать все целое число от 0 до 2**n-1 в двоичную:

var n = 3, 
 
    m = 1 << n; 
 
for (var i = 0; i < m; i++) { 
 
    var s = i.toString(2); // convert to binary 
 
    s = new Array(n + 1 - s.length).join('0') + s; // pad with zeroes 
 
    console.log(s); 
 
}

Вышеприведенный код является общим; вы можете изменить n на число бит, которое вы хотите.

1

Возможны значения pow(2, n).

В двоичной, числа могут быть просто думали, как "массивы" битов: 0 = [0,0,0], 1 = [0,0,1], 2 = [0,1,0], 3 = [0,1,1], 4 = [1,0,0], 5 = [1,0,1], 6 = [1,1,0], 7 = [1,1,1] ,

Следуя этой идее, самый простой способ - извлечь биты целых чисел [0, pow(2, n) - 1]. Вот код, который представляет собой прямую реализацию вышеуказанной идеи:

function test() 
{ 
    var n = 3; 
    var k = (1 << n); // bit trick for pow(2, n) 

    var truths = []; 

    for (var i = 0; i < k; ++i) 
    { 
     truths[i] = []; 

     for (var j = 0; j < n; ++j) 
     { 
     var value = (i >> j) & 1; // extract the j-th bit of i 
     truths[i][j] = value; 
     } 

     console.log(truths[i]); 
    } 
} 
Смежные вопросы