javascript で SEND + MORE = MONEY

覆面算を append map の深さ優先探索で解いてみる。
参考 ocaml-nagoya:ネタ記録庫

function solve() {
  // var digs = [0,1,2,3,4,5,6,7,8,9];
  var digs = $A($R(0,9));
  var m = 1;
  var o = 0;
  var s = 9;
  return digs.without(m,o,s).map(function(e) {
    return digs.without(m,o,s,e).map(function(n) {
      return digs.without(m,o,s,e,n).map(function(d) {
	return digs.without(m,o,s,e,n,d).map(function(r) {
	  return digs.without(m,o,s,e,n,d,r).map(function(y) {
	    if (1000 * s + 100 * e + 10 * n + d +
		1000 * m + 100 * o + 10 * r + e ==
		10000 * m + 1000 * o + 100 * n + 10 * e + y)
	      return ''+s+e+n+d+'+'+m+o+r+e+'='+m+o+n+e+y;
	    else
	      return [];
	  })})})})}).flatten();
}

prototype.js の Array.without() が便利。
時間がかかるので m o s は決定済み。
解を文字列で返せばflatten()につぶされません。
解を[s,e,n,d,m,o,r,y]で返そうとすると問題になるかとおもいきや、
どうせ解は1個なんでつぶされても見分けがつきます(ぉ