小町算
Posted feedbacks - JavaScript
#4725 を参考にしました。printはRhinoのprintで。
重いので、ブラウザでは動かさないように。
重いので、ブラウザでは動かさないように。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | function komachi() {
var list = Array.prototype.slice.apply(arguments, [0]);
var right = list.pop();
var operator = ["", "+", "-", "*", "/"];
var n = Math.pow(operator.length,list.length-1);
for(var i=0; i<n; i++) {
var exp = [list[0]];
var o = (n+i).toString(5);
for(var j=1, ii=i; j<list.length; j++) {
exp.push(operator[o.slice(j,j+1)]);
exp.push(list[j]);
ii = Math.floor(i/5);
}
if(eval(exp.join("")) == right) print(exp.join("") + '=' + right);
}
}
print("begin");
komachi(1,2,3,4,5,6,7,8,9,100);
print("end");
|
evalとreplaceの合わせ技。cscriptで26秒,Rhinoで17秒。
1 2 3 4 5 6 7 8 9 | function doukaku104(exp, ops){
var d = new Date, x = /□/g, f = function(t){ t = ops[i % o], i = i / o | 0; return t };
for(var R = [], r = 0, o = ops.length, n = Math.pow(o, exp.match(x).length), i, e; i = n--;)
if(eval(e = exp.replace(x, f))) R[r++] = e;
return R[r] = R.length +' results / '+ (new Date - d) +'[ms]', R.join('\n');
}
(typeof print != 'undefined' ? print : function($){ WSH.echo($) })
(doukaku104('1□2□3□4□5□6□7□8□9==100', ['', '+', '-', '*', '/']));
|


dpp
#4509()
Rating0/2=0.00
古典的なパズルである小町算を解くプログラムを作成してください。
小町算とは:
1□2□3□4□5□6□7□8□9=100
四角の中に、空白、+、-、×、÷のいずれかを一つ入れ、等式が成り立つようにするパズルです。
解答例:
1-2-3+4×56÷7+8×9=100
1+234×5÷6-7-89=100
参考: http://ja.wikipedia.org/wiki/%E5%B0%8F%E7%94%BA%E7%AE%97
手元で20数行ほどのPythonスクリプトを書いてみたところ、101個の解答が得られました。
[ reply ]