ラピュタの覆面算

今日はラピュタの日ということでタイムラインは賑わっておりますが、そんな中、こんな素敵な Tweet を見かけました。

つまり、

SHEETA + PAZU + LAPUTA = BALLSH

これが覆面算として成立しているのですね。なお、バルスの英語綴りをざっと調べてみたところ、英語版 DVD の字幕には表記が無いために一定していないようですが、BALLSH はおそらく少数派です。

そんなわけで、ざっくり解いてみました。今回は Ruby で。

formula = "_SHEETA+_PAZU+_LAPUTA==_BALLSH".gsub("_", "0d")

vars = formula.split("").select {|c| c.match(/[A-Z]/)}.sort.uniq
vars_str = vars.join("")
(0..9).to_a.permutation(vars.size) {|ary|
  p vars.zip(ary) if eval(formula.tr(vars_str, ary.join("")))
}

最初は tr して eval するだけと思っていたのですが、0 始まりの数値リテラルが 8 進数として扱われるという罠をすっかり忘れていたため、数値の先頭に 0d を挿入するというあまり綺麗じゃないやり方となってしまい、少々残念だったのでした。

覆面算くらいであれば、何の工夫もない総当たりで6行で解けるというのもコンピュータの力ですね。