haskell 整数回溯
haskell backtracking with integer
我是 Haskell 新手。所以,我想问一个简单的问题。
我必须在回溯的帮助下找到包含 9 个具有以下特征的数字的(唯一)数字:
The numbers 1/9 appear exactly once.
The first k numbers of n are
divisible by k for k runs from 1/9
例子
n = 123456789
1 (the first number of n) should be divisible by 1. true!
2 (the first 2 numbers of n) should be divisible by 2. true!
3 (the first 3 numbers of n) should be divisible by 3. true!
4 (the first 4 numbers of n) should be divisible by 4. false!
所以,123456789 不是想要的号码。
解决方法如下:
module Main where
import Data.Maybe
import Data.Set (Set)
import qualified Data.Set as Set
findUniqueNumber :: Int -> Int -> Set Int -> Maybe Int
findUniqueNumber currNum divisor remDigits
| divisor == 9 && currNum `rem` divisor == 0 = Just currNum
| divisor > 0 && currNum `rem` divisor /= 0 = Nothing
| otherwise =
case filter isJust posNums of
[] -> Nothing
[uniqueNumber] -> uniqueNumber
where
posNums = map posAns (Set.toList remDigits)
posAns d' = findUniqueNumber (currNum * 10 + d') (divisor + 1) (Set.delete d' remDigits)
main :: IO ()
main = (print . fromJust) $ findUniqueNumber 0 0 (Set.fromList [1..9])
uniekGetal :: [Int]
uniekGetal = [val9 |
x1 <- [1..9],
let val = x1,
x2 <- [x| x <- [1..9], x /= x1],
let val2 = val * 10 + x2,
mod val2 2 == 0,
x3 <- [x| x <- [1..9], x /= x1, x /= x2],
let val3 = val2 * 10 + x3,
mod val3 3 == 0,
x4 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3],
let val4 = val3 * 10 + x4,
mod val4 4 == 0,
x5 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4],
let val5 = val4 * 10 + x5,
mod val5 5 == 0,
x6 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5],
let val6 = val5 * 10 + x6,
mod val6 6 == 0,
x7 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6],
let val7 = val6 * 10 + x7,
mod val7 7 == 0,
x8 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7],
let val8 = val7 * 10 + x8,
mod val8 8 == 0,
x9 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7, x /= x8],
let val9 = val8 * 10 + x9,
mod val9 9 == 0]
这是我的问题的解决方案。
我是 Haskell 新手。所以,我想问一个简单的问题。
我必须在回溯的帮助下找到包含 9 个具有以下特征的数字的(唯一)数字:
The numbers 1/9 appear exactly once.
The first k numbers of n are divisible by k for k runs from 1/9
例子
n = 123456789
1 (the first number of n) should be divisible by 1. true!
2 (the first 2 numbers of n) should be divisible by 2. true!
3 (the first 3 numbers of n) should be divisible by 3. true!
4 (the first 4 numbers of n) should be divisible by 4. false!
所以,123456789 不是想要的号码。
解决方法如下:
module Main where
import Data.Maybe
import Data.Set (Set)
import qualified Data.Set as Set
findUniqueNumber :: Int -> Int -> Set Int -> Maybe Int
findUniqueNumber currNum divisor remDigits
| divisor == 9 && currNum `rem` divisor == 0 = Just currNum
| divisor > 0 && currNum `rem` divisor /= 0 = Nothing
| otherwise =
case filter isJust posNums of
[] -> Nothing
[uniqueNumber] -> uniqueNumber
where
posNums = map posAns (Set.toList remDigits)
posAns d' = findUniqueNumber (currNum * 10 + d') (divisor + 1) (Set.delete d' remDigits)
main :: IO ()
main = (print . fromJust) $ findUniqueNumber 0 0 (Set.fromList [1..9])
uniekGetal :: [Int]
uniekGetal = [val9 |
x1 <- [1..9],
let val = x1,
x2 <- [x| x <- [1..9], x /= x1],
let val2 = val * 10 + x2,
mod val2 2 == 0,
x3 <- [x| x <- [1..9], x /= x1, x /= x2],
let val3 = val2 * 10 + x3,
mod val3 3 == 0,
x4 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3],
let val4 = val3 * 10 + x4,
mod val4 4 == 0,
x5 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4],
let val5 = val4 * 10 + x5,
mod val5 5 == 0,
x6 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5],
let val6 = val5 * 10 + x6,
mod val6 6 == 0,
x7 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6],
let val7 = val6 * 10 + x7,
mod val7 7 == 0,
x8 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7],
let val8 = val7 * 10 + x8,
mod val8 8 == 0,
x9 <- [x| x <- [1..9], x /= x1, x /= x2, x /= x3, x /= x4, x /= x5, x /= x6, x /= x7, x /= x8],
let val9 = val8 * 10 + x9,
mod val9 9 == 0]
这是我的问题的解决方案。