JSFiddle - React, Tailwind, and code Playground

by nomadev

JavaScript

function* cartesianProductGen(head, ...tail) {
  let remainder = tail.length ? cartesianProductGen(...tail) : [[]];
  for (let r of remainder) for (let h of head) yield [h, ...r];
}


function stones(n, a, b) {
  const combinations = {};
  const valuesToCombine = [];
  for(let k = 0; k < n-1; k++) {
      valuesToCombine.push([a,b]);
  }
  const perm = cartesianProductGen(...valuesToCombine);
  while(true) {
    const next = perm.next();
    if (next.done) break;
    // use object to avoid check on double insertion
    combinations[next.value.reduce((acc, val) => acc + val)] = true;
  }
  return Object.keys(combinations)
}



function cartesianProduct(n, values) {
  n = n -1;
  const blocks2 = [
    [0,0],
    [1,0],
    [0,1],
    [1,1]
  ]
  const blocks3 = [
    [0,0,0],
    [1,0,0],
    [0,1,0],
    [0,0,1],
    [1,1,0],
    [1,0,1],
    [1,0,0],
    [1,1,1]
  ]
  const possibilities = [];
  if(n % 2 === 0) {
  	const times = n / 2
    for(let k = 0; k < times; k++) {
      for(let j = 0; j < blocks2.length; j++) {
      	for(let i = 0; i < blocks2.length; i++) {
        	possibilities.push(blocks2[j].concat(blocks2[i]));
        }
      }
    }
  } else {
    
  }
  console.log(possibilities);
  /*for(let k = 0; k < n * .5; k++) {
    if(block[k] === 0) 
      block[k] = 1;
    else if (block[k + 1] === 0) {
      block[k] = 0;
      block[k + 1] = 1;
    } 
    else if (block)
    const newBlock = Object.assign({}, block, {});
  }*/
  /*
  function cartesianIteration(block, k = 0) {
    if(block[k] === 0) 
      block[k] = 1;
    else if (block[k + 1] === 0) {
      block[k] = 0;
      return cartesianIteration(block, k + 1);
    } else if (block)
    const newBlock = Object.assign({}, block, {});
  }
  */
  // const block = [...Array(n).keys()].map(v => 0);
  
  return possibilities;
}

function stones2(n, a, b) {
  const diffValues = [a,b];
  const combinations = {}
  const diffProducts = cartesianProduct(n, diffValues);
  for(let k = 0; diffProducts;...