Menu Close

Números en una cadena

Definir la función

   numeros :: String -> [Int]

tal que (numeros cs) es la lista de los números enteros no negativos de la cadena cs. Por ejemplo,

   λ> numeros "Esta cadena tiene 3 numeros: el 16 y el 2019 solamente." 
   [3,16,2019]
   λ> numeros "Esta cadena tiene 3 numeros naturales: -2 más 2 es 0" 
   [3,2,0]
   λ> numeros "Esta cadena tiene 1 numero natural: 2.5 no es entereo" 
   [1]

Soluciones

import Data.Char  (isDigit)
 
-- 1ª definición
-- =============
 
numeros :: String -> [Int]
numeros cs = map read (filter esNumero (words cs))
 
-- (esNumero cs) se verifica si la cadena no vacía cs representa
-- un número entero. Por ejemplo,
--    esNumero "2019"  ==  True
--    esNumero "20.9"  ==  False
--    esNumero "201a"  ==  False
esNumero :: String -> Bool
esNumero = all (`elem` ['0'..'9'])
 
-- 2ª solución
-- ===========
 
numeros2 :: String -> [Int]
numeros2 cs = map read (filter (all isDigit) (words cs))
 
-- 3ª solución
-- ===========
 
numeros3 :: String -> [Int]
numeros3 = map read . filter (all isDigit) . words

Pensamiento

Tu profecía, poeta.
— Mañana hablarán los mudos:
el corazón y la piedra.

Antonio Machado

Posted in Inicial

5 Comments

  1. frahidzam
    leeNumero :: String -> [Int]
    leeNumero n = [read [a] | a <- n]
     
    numeros :: String -> [Int]
    numeros cs = map read (filter esNumero (words cs))
     
    esNumero :: String -> Bool
    esNumero cs = all isDigit cs
  2. adogargon
    numeros :: String -> [Int]
    numeros = map read . filter (all isDigit) . words
  3. luipromor
    numeros :: String -> [Int]
    numeros "" = []
    numeros p@(x:xs) | isDigit  x = read (take n   p): numeros ( drop n p)
                     | otherwise = numeros xs
                       where n = length $ takeWhile isDigit p
    • guicabgod

      Da resultado erróneos. Por ejemplo,

      λ> numeros "Esta cadena tiene 2 numeros: el 16 y el 2.19 solamente." 
      [2,16,2,19]

      y debería de dar [2,16] como en las otras.

  4. javmarcha1
    import Data.Char
     
    numeros :: String -> [Int]
    numeros xs = [joiner (digitos ys) | ys <- words xs, all isDigit ys]
     
    digitos :: String -> [Int]
    digitos xs = [read [a] | a <- xs]
     
    joiner :: [Int] -> Int
    joiner (x:xs) = read (concat (map show (x:xs)))

Leave a Reply to adogargonCancel reply

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