JSFiddle - React, Tailwind, and code Playground

by egon

HTML

<table id="result"></table>

CSS

#result * { 
    font-family: monospace;
}

#result, th, td {
    border-collapse: collapse;
    border: 1px solid black;
    padding: 0 4px;
}

JavaScript

function write(vals){
    var t = "<tr><td>" + vals.join("</td><td>") + "</td>";
    result.innerHTML += t;
}

var CS = 8;
var OS = 13;

var targets = [72, 101, 108, 32, 119, 111, 114, 100];

write(["start", "add", "k", "cost", "", "x", ""].concat(targets));

function calculate(start, add){
    var k = 0, s = start;
    for(; (k < 10000) && (s != 0); k += 1){
        s = (s + add + 256) % 256;
    }
    if( s != 0 ) return -1;
    return k;
}

function diff_targets(k, targets){
    var best = targets.slice();
    for(var i = -CS; i <= CS; i += 1){
        var n = (k * i + 256*16) % 256;
        for(var j = 0; j < targets.length; j += 1){
            var df = Math.abs(targets[j] - n);
            if(best[j] > df){
                best[j] = df;
            }
        }
    }
    return best;
}

var elems = [];

for(var start = -OS; start <= OS; start += 1){
    if(start == 0) continue;
    for(var adder = -10; adder <= 10; adder += 1){
        k = calculate(start, adder);
        if(k > 0){
            elems.push({start:start, add:adder, k:k, cost: Math.abs(start) + Math.abs(adder)});
        }
    }
}

elems = elems.sort(function(a,b){return a.cost - b.cost;});
var found = {};
var uniq = [];

for(var i = 0; i < elems.length; i += 1) {
    // we have found a smaller cost item
    el = elems[i];
    if(typeof found[el.k] !== "undefined") continue;
    found[el.k] = true;
    uniq.push(el);
    var diffs = diff_targets(el.k, targets);
    
    var sum = 0;
    for(var i = 0; i < diffs.length; i += 1){
        sum += diffs[i];
    }
    
    el.diffs = diffs;
    el.diffsum = sum;
}
uniq = uniq.sort(function(a,b){return a.diffsum - b.diffsum;});
for(var i = 0; i < uniq.length; i += 1){
    var el = uniq[i];
    write([el.start, el.add, el.k, el.cost, "", el.diffsum, ""].concat(el.diffs));
}