lang
1['(', '*', '(', '+', 2, 4, ')', 3, ')']
上のような配列ひとつを引数にとり、
lang
1['*', ['+', 2, 4], 3]
このような配列に変換して返す関数を定義したいのですが、
渡された配列の要素を順に検証していき '('
と ')'
に反応して再帰処理を行い
配列の配列を生成していくコードがなかなか書けません。
定義コードをお教えいただくか、効率的なアルゴリズムの説明をしていただけると嬉しいです。
追記:常に要素は()で括られているものとします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/02 04:52
回答2件
0
ベストアンサー
なかなか興味深い課題なので自分で書いてみました。
javascript
1function f(input){ 2 input = input.slice(1, -1); // 最初と最後の括弧は固定なので切り捨てる 3 function g(ary){ 4 var elm; 5 while(input.length){ 6 elm = input.shift(); // 先頭の要素を取得。同時にその要素をinputから捨てる 7 if(elm === "(") ary.push(g([])); // もし "(" なら再帰的に新しい配列を挿入する 8 else if(elm === ")") break; // もし ")" なら再帰的な配列挿入は終了する 9 else ary.push(elm); // それ以外なら現在の配列に挿入する 10 } 11 return ary; 12 } 13 return g([]); 14} 15 16f(['(', '*', '(', '+', 2, 4, ')', 3, ')']); // ["*",["+",2,4],3] 17f("(((a)))".split("")); // [[["a"]]] 18f("((a)((aa)(a)(a))(aa))".split("")); // [["a"],[["a","a"],["a"],["a"]],["a","a"]] 19
ただ、上のコードではエラーチェックをしていません。
エラーチェックもするならこんな感じにします。
javascript
1function f(input){ 2 if(!Array.isArray(input) || input[0] != "(" || input[input.length-1] != ")") throw new Error; // inputが配列かどうか、最初と最後の要素が正しいかどうかをチェックする 3 input = input.slice(1, -1); 4 function g(ary, top){ 5 var elm; 6 while(input.length){ 7 elm = input.shift(); 8 if(elm === "(") ary.push(g([], false)); 9 else if(elm === ")"){ 10 if(top) throw new Error; // 最上位の配列に挿入中なのに、")" が来るのはおかしい 11 else break; 12 } 13 else ary.push(elm); 14 } 15 if(!top && elm != ")" && input.length == 0) throw new Error; // 下位の配列に挿入中なのに、inputの要素がなくなるのはおかしい 16 return ary; 17 } 18 return g([], true); 19} 20 21f(['(', '*', '(', '+', 2, 4, ')', 3, ')']); // ["*",["+",2,4],3] 22f(['(', '*', '(', '+', 2, 4, ')', 3]); // エラー。最後の括弧がない 23f(['(', '*', '(', '+', 2, 4, 3, ')']); // エラー。閉じてない括弧がある 24f(['(', '*', '+', 2, 4, ')', 3, ')']); // エラー。括弧が開いていないのに閉じている
効率的なアルゴリズムかどうかは自信がありませんが、参考にしていただければと思います。
投稿2017/02/02 05:42
編集2017/02/02 05:42総合スコア368
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/02 05:57
0
でけた! (ことにして)
js
1var arr = ['(', '*', '(', '+', 2, 4, ')', 3, ')']; 2var str = '['; 3arr.map(v => v === '(' ? '[' : v === ')' ? ']' : isNaN(v) ? `"${v}"` : v).reduce((a, b, i) => { 4 str += (a === '[' || b === ']' ? '' : ',') + b; 5 return b; 6}); 7var result = JSON.parse(str); 8console.log(result);
これ以上は無理!! (じゃないのはわかってる)
再帰してない・・・・ゴメンこの回答は無し。
投稿2017/02/02 05:48
編集2017/02/02 05:55総合スコア4269
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。