Sucesión contadora
Definir las siguientes funciones
1 2 3 |
numeroContado :: Integer -> Integer contadora :: Integer -> [Integer] lugarPuntoFijoContadora :: Integer -> Integer -> Maybe Integer |
tales que
- (numeroContado n) es el número obtenido al contar las repeticiones de cada una de las cifras de n. Por ejemplo,
1 2 3 4 |
numeroContado 1 == 11 numeroContado 114213 == 31121314 numeroContado 1111111111111111 == 161 numeroContado 555555555500 == 20105 |
- (contadora n) es la sucesión cuyo primer elemento es n y los restantes se obtienen contando el número anterior de la sucesión. Por ejemplo,
1 2 3 4 5 6 |
λ> take 14 (contadora 1) [1,11,21,1112,3112,211213,312213,212223,114213,31121314,41122314, 31221324,21322314,21322314] λ> take 14 (contadora 5) [5,15,1115,3115,211315,31121315,41122315,3122131415,4122231415, 3132132415,3122331415,3122331415,3122331415,3122331415] |
- (lugarPuntoFijoContadora n k) es el menor i <= k tal que son iguales los elementos en las posiciones i e i+1 de la sucesión contadora que cominza con n. Por ejemplo,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
λ> lugarPuntoFijoContadora 1 100 Just 12 λ> contadora 1 !! 11 31221324 λ> contadora 1 !! 12 21322314 λ> contadora 1 !! 13 21322314 λ> lugarPuntoFijoContadora 1 10 Nothing λ> lugarPuntoFijoContadora 5 20 Just 10 λ> lugarPuntoFijoContadora 40 200 Nothing |
Nota: Este ejercicio ha sido propuesto por Ángel Ruiz.
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 |
import Data.List ( genericLength , genericTake , group , nub , sort ) -- Definición de numeroContado numeroContado :: Integer -> Integer numeroContado n = (read . concat . map concat) [[(show . length) m,nub m] | m <- (group . sort . show) n] -- 1ª definición de contadora contadora :: Integer -> [Integer] contadora n = n : map numeroContado (contadora n) -- 2ª definición de contadora contadora2 :: Integer -> [Integer] contadora2 = iterate numeroContado -- Definición de lugarPuntoFijoContadora lugarPuntoFijoContadora :: Integer -> Integer -> Maybe Integer lugarPuntoFijoContadora n k | m == k-1 = Nothing | otherwise = Just m where xs = genericTake k (contadora n) ds = zipWith (-) xs (tail xs) m = genericLength (takeWhile (/=0) ds) |