JSFiddle - React, Tailwind, and code Playground
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));
}