JSFiddle - React, Tailwind, and code Playground

by Harm Zeinstra

JavaScript

var symbols = {
	cog: 1,
  house: 2,
  bug: 3,
  cat: 4,
  box: 5,
  leaf: 6,
  key: 7,
  dove: 8,
  paw: 9
}

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;

  // While there remain elements to shuffle...
  while (0 !== currentIndex) {

    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;

    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }

  return array;
}

var rows = [
	['cog', 'box', 'house', 'cog', 'paw', 20],
  ['dove', 'box', 'cog', 'cog', 'bug', 20],
  ['leaf', 'cat', 'leaf', 'key', 'leaf', 38],
  ['box', 'dove', 'bug', 'box', 'dove', 12],
  ['cog', 'box', 'dove', 'bug', 'bug', 18],
  [23, 14, 22, 26, 23],
];
var checking = true;
var rowLength = 5;

while(checking) {
	checking = false;
  var columnSum = [0, 0, 0, 0, 0];
	for (var i = 0; i < rows.length - 1; i++) {
  	var rowSum = 0;
  	for (var j = 0; j < rowLength; j++) {
      columnSum[j] += symbols[rows[i][j]];
    	rowSum += symbols[rows[i][j]];
    }
    if (rowSum != rows[i][rowLength]) {
      var randomValues = shuffle(Object.values(symbols));
      var keys = Object.keys(symbols)
      for (var k = 0; k < keys.length; k++) {
        symbols[keys[k]] = randomValues[k];
      }
      checking = true;
      break;
    }
  }
  for (var i = 0; i < columnSum.length; i++) {
  	if (columnSum[i] != rows[rows.length-1][i]) {
      var randomValues = shuffle(Object.values(symbols));
      var keys = Object.keys(symbols)
      for (var k = 0; k < keys.length; k++) {
        symbols[keys[k]] = randomValues[k];
      }
      checking = true;
      break;
    }
  }
}

Object.keys(symbols).forEach(function(key) {
	document.writeln(key + " = " + symbols[key] + "<br>")
});
console.log(symbols);