Reducción de opuestos
Se considera el siguiente procedimiento de reducción de listas: busca un par de elementos consecutivos iguales pero con signos opuestos, se eliminan dichos elementos y se continúa el proceso hasta que no se encuentren pares de elementos consecutivos iguales pero con signos opuestos. Por ejemplo, la reducción de [-2,1,-1,2,3,4,-3] es
1 2 3 |
[-2,1,-1,2,3,4,-3] (se elimina el par (1,-1)) -> [-2,2,3,4,-3] (se elimina el par (-2,2)) -> [3,4,-3] (el par (3,-3) no son consecutivos) |
Definir la función
1 |
reducida :: [Int] -> [Int] |
tal que (reducida xs) es la lista obtenida aplicando a xs el de eliminación de pares de elementos consecutivos opuestos. Por ejemplo,
1 2 3 4 |
reducida [-2,1,-1,2,3,4,-3] == [3,4,-3] reducida [-2,1,-1,2,3,-4,4,-3] == [] reducida [-2,1,-1,2,5,3,-4,4,-3] == [5] reducida [-2,1,-1,2,5,3,-4,4,-3,-5] == [] |
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 |
-- 1ª solución -- =========== reducida :: [Int] -> [Int] reducida xs | xs == ys = xs | otherwise = reducida ys where ys = paso xs paso :: [Int] -> [Int] paso [] = [] paso [x] = [x] paso (x:y:zs) | x == -y = paso zs | otherwise = x : paso (y:zs) -- 2ª solución -- =========== reducida2 :: [Int] -> [Int] reducida2 xs = aux xs [] where aux [] ys = reverse ys aux (x:xs) (y:ys) | x == -y = aux xs ys aux (x:xs) ys = aux xs (x:ys) -- Comparación de eficiencia -- ========================= -- λ> reducida (take (10^7) (cycle [1,-1])) -- [] -- (9.40 secs, 1,280,127,720 bytes) -- λ> reducida2 (take (10^7) (cycle [1,-1])) -- [] -- (12.16 secs, 2,080,127,560 bytes) |
4 Comentarios