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