Un conjunto de números enteros se pueden representar mediante una lista ordenada de intervalos tales que la diferencia entre el menor elemento de un intervalo y el mayor elemento de su intervalo anterior es mayor que uno.
Por ejemplo, el conjunto {2, 7, 4, 3, 9, 6} se puede representar mediante la lista de intervalos [(2,4),(6,7),(9,9)] de forma que en el primer intervalo se agrupan los números 2, 3 y 4; en el segundo, los números 6 y 7 y el tercero, el número 9.
Definir la función
intervalos :: [Int] -> [(Int,Int)] |
tal que (intervalos xs) es lista ordenada de intervalos que representa
al conjunto xs. Por ejemplo,
λ> intervalos [2,7,4,3,9,6] [(2,4),(6,7),(9,9)] λ> intervalos [180,141,174,143,142,175] [(141,143),(174,175),(180,180)] |
Soluciones
import Data.List (sort) intervalos :: [Int] -> [(Int,Int)] intervalos = map intervalo . segmentos -- (segmentos xs) es la lista de segmentos formados por elementos -- consecutivos de xs. Por ejemplo, -- segmentos [2,7,4,3,9,6] == [[2,3,4],[6,7],[9]] segmentos :: [Int] -> [[Int]] segmentos xs = aux as [[a]] where aux [] zs = zs aux (y:ys) ((a:as):zs) | y == a-1 = aux ys ((y:a:as):zs) | otherwise = aux ys ([y]:(a:as):zs) (a:as) = reverse (sort xs) -- (intervalo xs) es el intervalo correspondiente al segmento xs. Por -- ejemplo, -- intervalo [2,3,4] == (2,4) -- intervalo [6,7] == (6,7) -- intervalo [9] == (9,9) intervalo :: [Int] -> (Int,Int) intervalo xs = (head xs, last xs) |
Pensamiento
Cuando el saber se especializa, crece el volumen total de la cultura. Esta es la ilusión y el consuelo de los especialistas. ¡Lo que sabemos entre todos! ¡Oh, eso es lo que no sabe nadie!
Antonio Machado
6 soluciones de “Representación de conjuntos mediante intervalos”