JSFiddle - React, Tailwind, and code Playground

HTML

<textarea id="cardinfo">
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">
 12  1 10 15 29  2
 11 19 27 20 28  6
 31 22 17  5 21 26
</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);
}