Mayúsculas y minúsculas alternadas
Definir la función
1 |
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,
1 2 3 4 5 6 |
λ> alternadas "salamandra" ("SaLaMaNdRa","sAlAmAnDrA") λ> alternadas "solosequenosenada" ("SoLoSeQuEnOsEnAdA","sOlOsEqUeNoSeNaDa") λ> alternadas (replicate 30 'a') ("AaAaAaAaAaAaAaAaAaAaAaAaAaAaAa","aAaAaAaAaAaAaAaAaAaAaAaAaAaAaA") |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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) |
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