ラピュタの覆面算
今日はラピュタの日ということでタイムラインは賑わっておりますが、そんな中、こんな素敵な Tweet を見かけました。
パズルとバルスのツイートをすべき空気だから再掲しとこう。「シータとパズーがラピュタで出会う=バルス」って覆面算パズル(同じ文字には同じ数字があてはまり、違う文字には違う数字があてはまる)です。 sheeta+pazu+laputa=ballsh 答えはバルスの頃に。
— たきせあきひこ (@puzzlepocket) August 2, 2013
つまり、
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行で解けるというのもコンピュータの力ですね。