あどべ25日のみずぴーさんのプログラムちょっと手いれて遊んでみる(´・ω・`)
効率どうなの?的なコメント入れてる人がいたから、以下のようにちょっと改造↓
def int(xs : Int*) : Int = xs.foldLeft(0)( _ * 10 + _) var i = 0 def solve : Seq[(Int, Int,Int)] = { val digits = 0 to 9 for { s <- digits e <- digits diff List(s) n <- digits diff List(s, e) d <- digits diff List(s, e, n) m <- digits diff List(s, e, n, d) o <- digits diff List(s, e, n, d, m) r <- digits diff List(s, e, n, d, m, o) y <- digits diff List(s, e, n, d, m, o, r) val a = i += 1 //aはとくに意味ない。iをインクリメントしたいだけ if s != 0 if m != 0 if int(s, e, n, d) + int(m, o, r, e) == int(m, o, n, e, y) } yield (int(s, e, n, d) , int(m, o, r, e) , int(m, o, n, e, y)) } solve println(i) // 1814400 って表示される
(場合によっては意識しないほうがいいんだけど、)結局内部的には、総当りのループみたいな物なのであまり効率よろしくはない。
*1
というか、結局ループにしか見えない自分の手続き脳をどうにかしたい(´・ω・`)
たとえば以下のように変えると↓
def int(xs : Int*) : Int = xs.foldLeft(0)( _ * 10 + _) var i = 0 def solve : Seq[(Int, Int,Int)] = { val digits = 0 to 9 val natural = 1 to 9 for { s <- natural e <- digits diff List(s) n <- digits diff List(s, e) d <- digits diff List(s, e, n) m <- natural diff List(s, e, n, d) o <- digits diff List(s, e, n, d, m) r <- digits diff List(s, e, n, d, m, o) y <- digits diff List(s, e, n, d, m, o, r) val a = i += 1 if int(s, e, n, d) + int(m, o, r, e) == int(m, o, n, e, y) } yield (int(s, e, n, d) , int(m, o, r, e) , int(m, o, n, e, y)) } solve println(i) // 1451520
ちょっとだけましになる。効率を最優先にして解く場合はどうなるんですかね?
追記
覆面算なんて、整理すれば結局以下のような方程式*2
def test(s:Int,m:Int,e:Int,o:Int,n:Int,r:Int,d:Int,y:Int):Boolaen = { 1000 * s - 9000 * m + 91 * e - 900 * o - 90 * n + 10 * r + d - y == 0 } //ただし、sとmは1から9の整数、それ以外は0から9の整数
だから、一般的な解法はないか。*3
プログラム的に速さ求めるなら、分割統治法で、Thread分けるとかですかね?