Conmutaciones ondulantes
Una lista binaria es ondulante si sus elementos son alternativamente 0 y 1. Por ejemplo, las listas [0,1,0,1,0] y [1,0,1,0] son ondulantes.
Definir la función
1 |
minConmutacionesOndulante :: [Int] -> Int |
tal que (minConmutacionesOndulante xs) es el mínimo número de conmutaciones (es decir, cambios de 0 a 1 o de 1 a 0) necesarias para transformar xs en una lista ondulante. Por ejemplo,
1 2 |
minConmutacionesOndulante [1,1,1] == 1 minConmutacionesOndulante [0,0,0,1,0,1,0,1,1,1] == 2 |
En el primer ejemplo basta conmutar el elemento en la posición 1 para obtener [1,0,1] y el segundo ejemplo los elementos en las posiciones 1 y 8 para obtener [0,1,0,1,0,1,0,1,0,1].
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 |
minConmutacionesOndulante :: [Int] -> Int minConmutacionesOndulante xs = min (diferencia xs ondulante0) (diferencia xs ondulante1) -- (diferencia xs ys) es el número de posiciones con elementos -- distintos. Por ejemplo, -- diferencia [1,1,1] [1,0,1] == 1 -- diferencia "0001010111" "0101010101" == 2 diferencia :: Eq a => [a] -> [a] -> Int diferencia xs ys = sum [1 | (x,y) <- zip xs ys, x /= y] -- ondulante0 es la lista binaria ondulante cuyo primer elemento es -- 0. Por ejemplo, -- take 10 ondulante0 == [0,1,0,1,0,1,0,1,0,1] ondulante0 :: [Int] ondulante0 = 0 : ondulante1 -- ondulante1 es la lista binaria ondulante cuyo primer elemento es -- 1. Por ejemplo, -- take 10 ondulante1 == [1,0,1,0,1,0,1,0,1,0] ondulante1 :: [Int] ondulante1 = 1 : ondulante0 |
5 Comentarios