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) |
Si haces
Cuando deberías obtener 411 como se obtiene con la definición de jaibengue.
Creo que el problema esta en el head utilizado en el aux2 que deberías solucionar.
Espero que te sirva de algo.
Buenas, la definición es incorrecta. Por ejemplo:
λ> numeroContado 11111111110
10101
λ> numeroContado2 11111111110
1101
Donde numeroContado2 es tu definición
Si se cambia la definción de numeroContado por:
Dejando el resto igual parece que ya se soluciona el problema.
Acabo de caer en que tenía el mismo problema que pabhueacu con los 0.