Representación de conjuntos mediante intervalos
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
1 |
intervalos :: [Int] -> [(Int,Int)] |
tal que (intervalos xs) es lista ordenada de intervalos que representa al conjunto xs. Por ejemplo,
1 |
intervalos [2,7,4,3,9,6] == [(2,4),(6,7),(9,9)] |
Nota: Este ejercicio está basado en el problema Bus numbers de Kattis
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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) |
12 Comentarios