JSFiddle - React, Tailwind, and code Playground
HTML
<textarea id="cardinfo" rows="31" cols="40">
card 1 - in: 4, 8, 7, 9 out: 11, 5, 6
card 2 - in: out: 7, 9, 1, 5
card 3 - in: 10, 4 out:
card 4 - in: 6, 3, 1, 4 out:
card 5 - in: 9, 1, 10, 2 out:
card 6 - in: 9, 2, 7, 10 out:
card 7 - in: 10, 2 out: 7
card 8 - in: 7 out:
card 9 - in: 2, 3, 1 out:
card 10 - in: 8, 10 out: 6
card 11 - in: 10 out: 9, 7, 3, 11
card 12 - in: 2, 9 out: 1
card 13 - in: out: 9, 3, 7, 6
card 14 - in: 9, 3, 8 out:
card 15 - in: 6 out: 10, 3, 5, 7
card 16 - in: 4, 10, 8 out: 6, 1, 5
card 17 - in: 5, 2, 9 out: 3, 11
card 18 - in: 4, 9, 5 out: 8
card 19 - in: 4, 1, 7 out: 2, 9, 11, 5
card 20 - in: 6 out: 10, 8, 11
card 21 - in: 11, 10, 2 out:
card 22 - in: 3, 8, 7, 9 out: 4
card 23 - in: 11 out: 8, 3, 5, 1
card 24 - in: out: 10, 4, 5, 11
card 25 - in: 3, 2, 4, 7 out:
card 26 - in: 6, 2, 7 out: 4
card 27 - in: 10, 11, 6 out: 2, 9
card 28 - in: 1, 10, 3 out: 6, 7
card 29 - in: 3, 2 out: 7, 6, 9
card 30 - in: 2, 8 out: 3
card 31 - in: 7, 10, 2, 8 out: 3, 4
</textarea>
<textarea id="solution" rows="3" cols="20">
16 20 27 17 19 18
31 28 1 29 22 2
25 15 26 13 6 11
</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);
}