Haskell で SEND MORE MONEY する修行

学習六日目の Haskell で SEND MORE MONEY を解いてみた。昼休みに起動してプログラムが停止したのは夕飯食べに外出していたとき。いくら Eden 600 MHz でも 8 時間は遅すぎでしょう。効率悪すぎ。文字が割り当たらない 3, 4 の曖昧性除去もできてないし。

    perm [] = [[]]
    perm (x:xs) = lists (insert x) (perm xs)
    lists f [] = []
    lists f (x:xs) = (f x) ++ (lists f xs)
    insert y [] = [[y]]
    insert y (x:xs) = (y:x:xs):[x:z|z<-insert y xs]
    v (x:[]) = x
    v (h:r) = (v r)*10+h
    v2 list val = v (map (p list) val)
    p y x = q 0 y x
    q i [] x = -1
    q i (z:r) x

    [l|l<-(perm "sendmory--"),(p l 's')>0,(p l 'm')>0,(v2 l "dnes")+(v2 l "erom")==(v2 l "yenom")]
    ["omy--endrs","omy--endrs"]

結果はせめてこうやって表示しないとわかりにくいですね。これでも十分わかりにくいけど。

    pois :: Int -> [Char] -> [Char]
    pois i "" = ""
    pois i (x:xs) = [x] ++ "=" ++ (show i) ++ "n" ++ (pois (i+1) xs)

    putStr $ pois 0 "omy--endrs"
    o=0
    m=1
    y=2
    -=3
    -=4
    e=5
    n=6
    d=7
    r=8
    s=9