Números colinas
Se dice que un número natural n es una colina si su primer dígito es igual a su último dígito, los primeros dígitos son estrictamente creciente hasta llegar al máximo, el máximo se puede repetir y los dígitos desde el máximo al final son estrictamente decrecientes.
Definir la función
| 1 |    esColina :: Integer -> Bool | 
tal que (esColina n) se verifica si n es un número colina. Por ejemplo,
| 1 2 3 4 5 6 7 8 9 |    esColina 12377731  ==  True    esColina 1237731   ==  True    esColina 123731    ==  True    esColina 122731    ==  False    esColina 12377730  ==  False    esColina 12377730  ==  False    esColina 10377731  ==  False    esColina 12377701  ==  False    esColina 33333333  ==  True | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | import Data.Char (digitToInt) -- 1ª definición -- ============= esColina :: Integer -> Bool esColina n =   head ds == last ds &&   esCreciente xs &&   esDecreciente ys   where ds = digitos n         m  = maximum ds         xs = takeWhile (<m) ds         ys = dropWhile (==m) (dropWhile (<m) ds) -- (digitos n) es la lista de los dígitos de n. Por ejemplo, --    digitos 425  ==  [4,2,5] digitos :: Integer -> [Int] digitos n = map digitToInt (show n) -- (esCreciente xs) se verifica si la lista xs es estrictamente -- creciente. Por ejemplo, --    esCreciente [2,4,7]  ==  True --    esCreciente [2,2,7]  ==  False --    esCreciente [2,1,7]  ==  False esCreciente :: [Int] -> Bool esCreciente xs = and [x < y | (x,y) <- zip xs (tail xs)] -- (esDecreciente xs) se verifica si la lista xs es estrictamente -- decreciente. Por ejemplo, --    esDecreciente [7,4,2]  ==  True --    esDecreciente [7,2,2]  ==  False --    esDecreciente [7,1,2]  ==  False esDecreciente :: [Int] -> Bool esDecreciente xs = and [x > y | (x,y) <- zip xs (tail xs)] -- 2ª definición -- ============= esColina2 :: Integer -> Bool esColina2 n =   head ds == last ds &&   null (dropWhile (==(-1)) (dropWhile (==0) (dropWhile (==1) xs)))   where ds = digitos n         xs = [signum (y-x) | (x,y) <- zip ds (tail ds)]  -- Equivalencia -- ============ -- La propiedad de equivalencia es prop_esColina :: Integer -> Property prop_esColina n =   n >= 0 ==> esColina n == esColina2 n  -- La comprobación es --    λ> quickCheck prop_esColina --    +++ OK, passed 100 tests. | 
Referencia
Basado en el problema Is this number a hill number? de Code Golf
Pensamiento
Si me tengo que morir
poco me importa aprender.
Y si no puedo saber,
poco me importa vivir.Antonio Machado