JSFiddle - React, Tailwind, and code Playground
HTML
<textarea id="cardinfo">
card 1 - in: 1, 2, 3, 4 out: 5, 6, 7, 8
card 2 - in: 5, 6, 7, 8 out: 1, 2, 3, 4
</textarea>
<textarea id="solution">
1 2 1 2 1 2
2 1 2 1 2 1
1 2 1 2 1 2
</textarea>
<a href="javascript:CalculateScore()">score</a>
JavaScript
function NumberOfSetBits(i)
{
// see http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}
function BitsSetStringToInt(str) {
if (str == "") return 0;
str = str.split(/, /);
var result = 0;
for (var i in str)
result |= 1 << str[i];
return result;
}
function ScoreForCard(i, j, solution, inResources, outResources) {
var score = 0;
var inres = inResources[solution[i][j]];
for(var y = i - 1; y <= i + 1; y++)
for (var x = j - 1; x <= j + 1; x++)
if (solution[y] != undefined && solution[y][x] != undefined)
score += NumberOfSetBits(inres & outResources[solution[y][x]]);
return score;
}
window.CalculateScore = function() {
var cardLines = document.getElementById("cardinfo").value.match(/[^\r\n]+/g);
var solutionLines = document.getElementById("solution").value.match(/[^\r\n]+/g);
var inResources = Array(), outResources = Array();
for (var i = 0; i < cardLines.length; i++) {
var line = cardLines[i].match(/in: (.*) out: (.*)/);
inResources[i] = BitsSetStringToInt(line[1]);
outResources[i] = BitsSetStringToInt(line[2]);
}
var solution = Array();
for (var i = 0; i < solutionLines.length; i++) {
solution[i] = solutionLines[i].match(/[0-9]+/g);
for (var j = 0; j < solution[i].length; j++)
solution[i][j] -= 1;
}
var score = 0;
for (var i = 0; i < solution.length; i++)
for(var j = 0; j < solution[i].length; j++)
score += ScoreForCard(i, j, solution, inResources, outResources)
alert(score);
}