最終更新: 2015-05-31T16:39+0900
ファイル作成日時をみると1時間半前だった。不合格。
繰り返しのしかたを決めるまでに時間がかかりすぎた。再帰、ツリー、順列。再帰関数は共有して進めたり戻したりする変数とローカルな変数を整理しきれなくてあきらめた。深さ優先探索が書けないとかやばいね。三進数を使った順列(※下の解法)はちょっとだけ違う似たような計算を何度も繰り返すのがもったいない。カウンタの上限がすぐ来てスケールもしないし。
-1+2-3+4+5+6+78+9 は答えに数えないみたいだけどそのまま。
var CScript = WScript; // cscript.exeでの実行をおすすめします。
var Op = [
function op_shift(o, x) {
o.buf = o.buf*10 + o.buf/Math.abs(o.buf)*x;
o.expr += x;
},
function op_plus(o, x) {
o.sum += o.buf;
o.buf = x;
o.expr += "+" + x;
},
function op_minus(o, x) {
o.sum += o.buf;
o.buf = -x;
o.expr += "-" + x;
}
];
for (var op9seq = Math.pow(3,9)-1; 0 <= op9seq; --op9seq) {
var o = {sum:0, buf:0, expr:""}, q = op9seq, r;
for (var x = 1; x <= 9; ++x) {
r = q % 3;
q = (q-r) / 3;
Op[r](o, x);
}
o.sum += o.buf;
if (o.sum == 100) {
CScript.Echo(o.expr);
}
}
ところでこちらの、「Kazuho's Weblog: C言語で「1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に」の5問目を解いてみた」、変数 n の使い方がわかりません(わからないから自分は sumの他にもうひとつ bufという変数が必要になった)。ブコメに小町算とあるのだけど、これがヒント?