Menu Close

Extensión de un fichero

Enunciado

-- La extensión de un fichero es la palabra a continuación del último
-- punto en el nombre del fichero. Por ejemplo, la extensión de
-- "documento.txt" es "txt" 
-- 
-- Definir la función
--    extension :: String -> String
-- tal que (extension cs) es la extensión del fichero cs. Por ejemplo,
--    extension "ejercicio.hs"       ==  "hs"
--    extension "documento.txt"      ==  "txt"
--    extension "documento.txt.pdf"  ==  "pdf"
--    extension "resumen"            ==  ""

Soluciones

-- 1ª definición (por recursión):
extension1 :: String -> String
extension1 cs | elem '.' cs = reverse (aux (reverse cs))
              | otherwise   = ""
    where aux []       = []
          aux ('.':cs) = []
          aux (c:cs)   = c : aux cs
 
-- 2ª definición (con takeWhile):
extension2 :: String -> String
extension2 cs
    | notElem '.' cs = ""
    | otherwise      = reverse (takeWhile (/= '.') (reverse cs))

5 soluciones de “Extensión de un fichero

  1. Julián Galindo

    He definido la función de dos maneras distintas : extension y extension2

    extension :: String -> String
    extension xs | notElem '.' xs = ""
                 | otherwise      = extensionAux xs
     
    extensionAux (x:xs) | x == '.' && notElem '.' xs = xs
                        | otherwise                  = extension xs 
     
    extension2 :: String -> String 
    extension2 xs | notElem '.' xs = ""
                  | otherwise      = snd (splitAt (last (posicion '.' xs)) xs)
     
    posiciones xs = zip xs [1..length xs - 1]
     
    posicion x xs = [b | (a,b) <- posiciones xs, x == a]
  2. Jesús Navas Orozco
    extension :: String -> String
    extension cs 
        | not (elem '.' cs) = ""
        | otherwise         = [x| (x,y) <- zip cs [0..],y > ultPosicion '.' cs]
     
    ultPosicion x xs = last [y | (z,y) <- zip xs [0..], z == x ]
    • Jesús Navas Orozco
      extension :: String -> String
      extension cs 
          | notElem '.' cs = ""
          | otherwise         = [x| (x,y) <- zip cs [0..],y > ultPosicion '.' cs]
       
      ultPosicion x xs = last [y | (z,y) <- zip xs [0..], z == x ]

      He simplificado not (elem ‘.’ cs) por notElem ‘.’ cs

    • Jesús Navas Orozco
      extension :: String -> String
      extension cs | notElem '.' cs = ""
                   | otherwise = [x| (x,y) <- zip cs [0..], y > u]
                   where u = last [y | ('.',y) <- zip cs [0..]]

      Usando una variable local aumenta considerablemente la eficiencia de la definición.

      • Jesús Navas Orozco
        extension :: String -> String
        extension cs | notElem '.' cs = ""
                     | otherwise = drop u cs
                     where u = last [y | ('.',y) <- zip cs [0..]]

        Más simplificado

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.