JSFiddle - React, Tailwind, and code Playground
by sperske
JavaScript
function decode(input) {
let data = [""];
let lengths = [""];
let depth = 0;
for (const a of input) {
switch (a) {
case '{':
depth += 1;
data.push("");
lengths.push("");
break;
case ':':
// no-op entering message length
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
lengths[depth] += a;
break;
case '}':
const size = parseInt(lengths[depth], 10);
for (let n = 0; n < size; n++) {
data[depth - 1] += data[depth]
}
data[depth] = "";
depth -= 1;
break;
default:
data[depth] += a;
}
}
return data[0];
}
function test(input, expected) {
const actual = decode(input);
console.log(`'${input}' produced '${actual}' (valid:${expected==actual})`);
}
test("aaa", "aaa")
test("{ab:3}", "ababab")
test("a{bc:2}d", "abcbcd")
test("{a{bc:2}d:2}", "abcbcdabcbcd")
test("{{{a:2}:2}:2}", "aaaaaaaa")
test("{a:10}", "aaaaaaaaaa")
test("{a:0}", "")