Search code examples
algorithmhaskellfunctional-programmingbacktracking

haskell backtracking with integer


I am a Haskell newbie. So, I would like to ask a simple question.

I have to find with help of backtracking the (unique) number containing 9 numbers with the following characteristics:

The numbers 1/9 appear exactly once.

The first k numbers of n are divisible by k for k runs from 1/9

Example

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!

So, 123456789 is not the desired number.


Solution

  • 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]
    

    this was the solution to my problem.