ようこそ。睡眠不足なプログラマのチラ裏です。

Haskellで虫食い算的なもの

後日LINQで解いてみた、LINQで虫食い算的なものはこちらです。


虫食い算を解く

{-虫食い算-}
--    4○○
--   × ○○
--   --------
-- ○○○○○
-- ※ただし、○には4を除く0〜9の数字を1つずつ使用
--   また、桁の先頭は0ではないこと。

import Control.Monad

num = [0..3]++[5..9]

main :: IO ()
main = return answer >>= print

answer :: [[Int]]
answer = do a <- num
            b <- num  ; guard $ notElem b [a]
            c <- num  ; guard $ notElem c [a,b] ; guard $ c /= 0
            d <- num  ; guard $ notElem d [a,b,c]
            e <- num  ; guard $ notElem e [a,b,c,d] ; guard $ e /= 0
            f <- num  ; guard $ notElem f [a,b,c,d,e]
            g <- num  ; guard $ notElem g [a,b,c,d,e,f]
            h <- num  ; guard $ notElem h [a,b,c,d,e,f,g]
            i <- num  ; guard $ notElem i [a,b,c,d,e,f,g,h]
            guard $ toint [4,a,b] * toint [c,d] == toint [e,f,g,h,i]
            return $ map toint [[4,a,b],[c,d],[e,f,g,h,i]]

toint :: [Int] -> Int
toint = foldl (\ i j -> 10*i+j) 0 


実行結果

[[402,39,15678],[495,36,17820]]

はいよくできましたー