Cadenas opuestas
La opuesta de una cadena de letras es la cadena obtenida cambiando las minúsculas por mayúsculas y las minúsculas por mayúsculas. Por ejemplo, la opuesta de «SeViLLa» es «sEvIllA».
Definir la función
1 |
esOpuesta :: String -> String -> Bool |
tal que (esOpuesta s1 s2) se verifica si las cadenas de letras s1 y s2 son opuestas. Por ejemplo,
1 2 3 4 5 6 |
esOpuesta "ab" "AB" `== True esOpuesta "aB" "Ab" `== True esOpuesta "aBcd" "AbCD" `== True esOpuesta "aBcde" "AbCD" `== False esOpuesta "AB" "Ab" `== False esOpuesta "" "" `== True |
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 |
import Data.Char (isLower, isUpper, ord, toLower, toUpper) -- 1ª solución (por comprensión) -- ============================= esOpuesta1 :: String -> String -> Bool esOpuesta1 s1 s2 = [opuesto c | c <- s1] == s2 opuesto :: Char -> Char opuesto c | isLower c = toUpper c | otherwise = toLower c -- 2ª solución (con map) -- ===================== esOpuesta2 :: String -> String -> Bool esOpuesta2 s1 s2 = map opuesto s1 == s2 -- 3ª solución (por recursión) -- =========================== esOpuesta3 :: String -> String -> Bool esOpuesta3 "" "" = True esOpuesta3 (c1:s1) (c2:s2) = esOpuesto c1 c2 && esOpuesta3 s1 s2 esOpuesta3 _ _ = False esOpuesto :: Char -> Char -> Bool esOpuesto c1 c2 = abs (ord c1 - ord c2) == 32 |