レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
-
昨夜気づいた問題を修正した版
function hoge(str, p, list){
var i, c, s, newlist, t = 0, e = 0;
/** t
* 0 一つ目の要素の読み取り開始前段階
* 1 一つ目の要素はシンボルで読み取り中
* 2 一つ目の要素はリスト
* 3 一つ目の要素を登録完了
* 4 一つ目の要素と二つ目の要素を繋ぐ'.'読み取り前段階
* 5 二つ目の要素の読み取り開始前段階
* 6 二つ目の要素はシンボルで読み取り中
* 7 二つ目の要素はリスト
**/
for (i = p; i < str.length; i++) {
c = str.charAt(i);
if (c == '(') {
if (t == 0) { //一つ目の要素はリスト
newlist = new Array(); i = hoge(str, i + 1, newlist); t = 2;
} else if (t == 3) { // . の省略、二つ目の要素はリスト(そのリストの一つ目の要素がリスト)
newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
} else if (t == 5) { //二つ目の要素はリスト
newlist = new Array(); i = hoge(str, i + 1, newlist); t = 7;
} else {
alert("error char '(' t=" + t); return str.length + 10;
}
} else if (c == ')') {
if (t == 1) { //要素が一つしかない(要素はシンボル)
list[0] = s; list[1] = "nil";
} else if (t == 2) { //要素が一つしかない(要素はリスト)
list[0] = newlist; list[1] = "nil";
} else if (t == 6) { //二つ目の要素(シンボル)の登録
list[1] = s;
} else if (t == 7) { //二つ目の要素(リスト)の登録
list[1] = newlist;
} else if (t != 0) { // t==0 は空のリストになる
alert("error char ')' t=" + t); return str.length + 10;
}
return i;
} else if (c == ' ') {
if (p == 0) { //一番外側の括弧である必要があり構文エラー
alert("error char ' ' t=" + t + " (p == 0)"); return -1;
}
if (t == 1) { //一つ目の要素
list[0] = s; t = 3;
} else if (t == 2) { //一つ目の要素はリスト
list[0] = newlist; t = 3;
} else if (t == 4) { //次にくるのは2つ目の要素
t = 5;
} else {
alert("error char ' ' t=" + t); return str.length + 10;
}
} else if (c == '.') {
if (t == 3) { //このリストは略式でない
t = 4;
} else {
alert("error char '.' t=" + t); return str.length + 10;
}
} else {
if (t == 0) { //一つ目の要素のシンボル開始
s = c; t = 1;
} else if ((t == 1) || (t == 6)) { //シンボル文字が続く
s += c;
} else if (t == 3) { // . が省略されてるので二つ目の要素はリスト(そのリストの一つ目の要素がシンボル)
newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
} else if (t == 5) { //二つ目の要素のシンボル開始
s = c; t = 6;
} else {
alert("error char '"+c+"' t=" + t); return str.length + 10;
}
}
}
if (p != 0) { //再帰呼び出しで文字列を読み取り終わってしまっている
return -1;
}
if (i > str.length + 1) {
return -1;
}
if (t == 1) {
list[0] = s;
} else if (t == 2) {
list[0] = newlist;
} else {
return -1;
}
return i;
}
|
|
掲示板管理者へ連絡
無料レンタル掲示板