Definir la función
alternadas :: String -> (String,String) |
alternadas :: String -> (String,String)
tal que (alternadas cs) es el par de cadenas (xs,ys) donde xs es la cadena obtenida escribiendo alternativamente en mayúscula o minúscula las letras de la palabra cs (que se supone que es una cadena de letras minúsculas) e ys se obtiene análogamente pero empezando en minúscula. Por ejemplo,
λ> alternadas "salamandra"
("SaLaMaNdRa","sAlAmAnDrA")
λ> alternadas "solosequenosenada"
("SoLoSeQuEnOsEnAdA","sOlOsEqUeNoSeNaDa")
λ> alternadas (replicate 30 'a')
("AaAaAaAaAaAaAaAaAaAaAaAaAaAaAa","aAaAaAaAaAaAaAaAaAaAaAaAaAaAaA") |
λ> alternadas "salamandra"
("SaLaMaNdRa","sAlAmAnDrA")
λ> alternadas "solosequenosenada"
("SoLoSeQuEnOsEnAdA","sOlOsEqUeNoSeNaDa")
λ> alternadas (replicate 30 'a')
("AaAaAaAaAaAaAaAaAaAaAaAaAaAaAa","aAaAaAaAaAaAaAaAaAaAaAaAaAaAaA")
Soluciones
import Data.Char (toUpper)
-- 1ª solución
alternadas :: String -> (String,String)
alternadas [] = ([],[])
alternadas (x:xs) = (toUpper x : zs, x : ys)
where (ys,zs) = alternadas xs
-- 2ª solución
alternadas2 :: String -> (String,String)
alternadas2 xs =
( [f x | (f,x) <- zip (cycle [toUpper,id]) xs]
, [f x | (f,x) <- zip (cycle [id,toUpper]) xs]
)
-- Comparación de eficiencia
-- λ> import Data.List
-- λ> let (xs,ys) = alternadas (replicate (10^6) 'a') in nub (xs ++ ys)
-- "Aa"
-- (4.81 secs, 616,143,320 bytes)
-- λ> let (xs,ys) = alternadas2 (replicate (10^6) 'a') in nub (xs ++ ys)
-- "Aa"
-- (3.23 secs, 528,144,752 bytes) |
import Data.Char (toUpper)
-- 1ª solución
alternadas :: String -> (String,String)
alternadas [] = ([],[])
alternadas (x:xs) = (toUpper x : zs, x : ys)
where (ys,zs) = alternadas xs
-- 2ª solución
alternadas2 :: String -> (String,String)
alternadas2 xs =
( [f x | (f,x) <- zip (cycle [toUpper,id]) xs]
, [f x | (f,x) <- zip (cycle [id,toUpper]) xs]
)
-- Comparación de eficiencia
-- λ> import Data.List
-- λ> let (xs,ys) = alternadas (replicate (10^6) 'a') in nub (xs ++ ys)
-- "Aa"
-- (4.81 secs, 616,143,320 bytes)
-- λ> let (xs,ys) = alternadas2 (replicate (10^6) 'a') in nub (xs ++ ys)
-- "Aa"
-- (3.23 secs, 528,144,752 bytes)
Se puede imprimir o compartir con
Si se añade un toLower en aux2 funciona también para mayúsculas.
Por compresión
Por recursión pero con una sola función auxiliar