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}", "")