Ordenación pendular
La ordenación pendular de una lista xs es la lista obtenida organizando sus elementos de manera similar al movimiento de ida y vuelta de un péndulo; es decir,
- El menor elemento de xs se coloca en el centro de la lista.
- El siguiente elemento se coloca a la derecha del menor.
- El siguiente elemento se coloca a la izquierda del menor y así sucesivamente, de una manera similar a la de un péndulo.
Por ejemplo, la ordenación pendular de [6,6,8,5,10] es [10,6,5,6,8].
Definir la función
1 |
pendulo :: [Int] -> [Int] |
tal que (pendulo xs) es la ordenación pendular de xs. Por ejemplo,
1 2 3 |
pendulo [6,6,8,5,10] == [10,6,5,6,8] pendulo [-9,-2,-10,-6] == [-6,-10,-9,-2] pendulo [11,-16,-18,13,-11,-12,3,18] == [13,3,-12,-18,-16,-11,11,18] |
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 33 34 35 36 37 38 39 |
import Data.List (sort) -- 1ª solución -- =========== pendulo :: [Int] -> [Int] pendulo xs = reverse (impares ys) ++ y : pares ys where (y:ys) = sort xs -- (pares xs) son los elementos de xs que ocupan posiciones pares. pares :: [a] -> [a] pares [] = [] pares (x:xs) = x : impares xs -- (impares xs) son los elementos de xs que ocupan posiciones impares. impares :: [a] -> [a] impares [] = [] impares (_:xs) = pares xs -- 2ª solución -- =========== pendulo2 :: [Int] -> [Int] pendulo2 xs = aux (sort xs) [] True where aux [] ys _ = ys aux (x:xs) ys True = aux xs (x:ys) False aux (x:xs) ys False = aux xs (ys ++ [x]) True -- Comparación de eficiencia -- ========================= -- La comparación es -- λ> length (pendulo [1..2*10^4]) -- 20000 -- (0.03 secs, 6,501,896 bytes) -- λ> length (pendulo2 [1..2*10^4]) -- 20000 -- (2.37 secs, 8,596,479,096 bytes) |
Otras soluciones
- Se pueden escribir otras soluciones en los comentarios.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
Pensamiento
«La mejor obra del matemático es el arte, un arte altamente perfecto, tan audaz como los más secretos sueños de la imaginación, claro y límpido. El genio matemático y el genio artístico se tocan mutuamente.»
4 Comentarios