for式の効率

あどべ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分けるとかですかね?

*1:もちろん読みやすさ重視するなら、もとのプログラムで十分なのは承知のうえで。

*2:scalaの関数の形で書いたけど

*3:そもそもこういう式で、解が存在するのか?いくつ存在するのか?って大学の整数論の範囲ですよね?