この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
173. 文字列を解凍する

解法:

再帰的に解凍することができます。まず、文字列を最初から最後までスキャンし、数字、開き括弧、閉じ括弧、および文字符号の各種類の文字を識別して、それらをキューに格納します。すべての文字が処理されたら、次のように再帰的に解凍します

  • キューが空になるまで次のステップを繰り返します
  • キューの先頭の文字が文字符号の場合は、出力に追加し、キューからポップします
  • キューの先頭が数字の場合は、その数だけ数字を読み込み、開き括弧を読み込みます。その後、再帰的に解凍して、キューから読み込んだ分の要素を除去します。
  • キューの先頭が開き括弧である場合、閉じ括弧が見つかるまで再帰的に解凍します。閉じ括弧以降の部分を再度処理し、キューから読み込んだ分の要素を除外します。

最後に、得られた出力を返します。以下が完全なコードです:

function uncompress(str) {
  let queue = [];
  for (let i = 0; i < str.length; i++) {
    const char = str.charAt(i);
    if (!isNaN(char)) {
      let num = char;
      while (!isNaN(str.charAt(i + 1))) {
        num += str.charAt(i + 1);
        i++;
      }
      queue.push(parseInt(num));
    } else {
      queue.push(char);
    }
  }

  function recurse(queue) {
    let result = "";
    while (queue.length > 0) {
      const current = queue.shift();
      if (typeof current === "string") {
        result += current;
      } else if (typeof current === "number") {
        const subQueue = [];
        const openParenCount = 1;
        while (openParenCount > 0) {
          const next = queue.shift();
          if (next === "(") {
            openParenCount++;
          } else if (next === ")") {
            openParenCount--;
          } else {
            subQueue.push(next);
          }
        }
        result += recurse(subQueue).repeat(current)
      }
    }
    return result;
  }

  return recurse(queue);
}

例えば、

uncompress('3(ab2(c))') // 'abccabccabcc'

この場合、最初にキューに次の要素が格納されます。

[3, "(", "a", "b", 2, "(", "c", ")", ")"]

その後、再帰的に解凍して、出力が得られます。

uncompress(['3', '(', 'a', 'b', '2', '(', 'c', ')', ')'])
  -> 'a' + 'b' + uncompress(['2', '(', 'c', ')']) * 3
  -> 'a' + 'b' + ('c' + 'c') * 3
  -> 'a' + 'b' + 'cc' + 'cc' + 'cc'
  -> 'abccabccabcc'

よって、出力は 'abccabccabcc' になります。