Menu Close

Sin ceros finales

Definir la función

   sinCerosFinales :: Int -> Int

tal que (sinCerosFinales n) es el número obtenido eliminando los ceros finales de n. Por ejemplo,

   sinCerosFinales 104050     == 10405
   sinCerosFinales 960000     == 96
   sinCerosFinales 100050     == 10005
   sinCerosFinales (-10050)   == -1005
   sinCerosFinales 12         == 12
   sinCerosFinales 0          == 0

Comprobar con QuickCheck que, para cualquier número entero n,

   sinCerosFinales (sinCerosFinales n) == sinCerosFinales n

Soluciones

import Test.QuickCheck
 
-- 1ª solución
sinCerosFinales :: Int -> Int
sinCerosFinales 0 = 0
sinCerosFinales n
  | r /= 0    = n
  | otherwise = sinCerosFinales q  
  where (q,r) = quotRem n 10
 
-- 2ª solución
sinCerosFinales2 :: Int -> Int
sinCerosFinales2 0 = 0
sinCerosFinales2 n =
  read (reverse (dropWhile (=='0') (reverse (show n))))
 
-- 3ª solución
sinCerosFinales3 :: Int -> Int
sinCerosFinales3 0 = 0
sinCerosFinales3 n =
  (read . reverse . dropWhile (== '0') . reverse . show) n
 
-- 4ª solución
sinCerosFinales4 :: Int -> Int
sinCerosFinales4 0 = 0
sinCerosFinales4 n =
  read . reverse . dropWhile (== '0') . reverse . show $ n
 
-- La propiedad es
prop_sinCerosFinales :: Int -> Bool
prop_sinCerosFinales n =
  sinCerosFinales (sinCerosFinales n) == sinCerosFinales n
 
-- 5ª solución
sinCerosFinales5 :: Int -> Int
sinCerosFinales5 0 = 0
sinCerosFinales5 n = until (\x -> mod x 10 /= 0) (`div` 10) n
 
-- La comprobación es
--    λ> quickCheck prop_sinCerosFinales
--    +++ OK, passed 100 tests.

4 soluciones de “Sin ceros finales

  1. enrnarbej
    sinCerosFinales :: Int -> Int
    sinCerosFinales 0 = 0
    sinCerosFinales n = until (x -> mod x 10 /= 0) (`div` 10) n
     
    prop_sinCerosFinales :: Int -> Bool
    prop_sinCerosFinales n =
      sinCerosFinales (sinCerosFinales n) == sinCerosFinales n
     
    -- La comprobación es
    --    *Main> quickCheck prop_sinCerosFinales
    --    +++ OK, passed 100 tests.
  2. joscasgom1
    sinCerosFinales :: Int -> Int
    sinCerosFinales x
      | x == 0                = 0
      | last (digitos x) == 0 = sinCerosFinales (x `div` 10)
      | otherwise             = x
     
    digitos :: Int -> [Int]
    digitos x = [read [n] | n <- show x]
     
    prop_sinCerosFinales :: Int -> Bool
    prop_sinCerosFinales x =
      sinCerosFinales (sinCerosFinales x) == sinCerosFinales x
  3. Juanjo Ortega (juaorture)
    import Test.QuickCheck
     
    sinCerosFinales :: Int -> Int
    sinCerosFinales 0 = 0
    sinCerosFinales n | n `mod` 10 == 0 = sinCerosFinales (n`div`10)
                      | otherwise       = n
     
    prop_ceros :: Int -> Bool
    prop_ceros n = sinCerosFinales x == x
      where x = sinCerosFinales n
     
    -- La comprobación es:
    -- *Main> quickCheck prop_ceros
    -- +++ OK, passed 100 tests.
  4. monlagare
    sinCerosFinales :: Int -> Int
    sinCerosFinales 0 = 0
    sinCerosFinales n | n `rem` 10 == 0 = sinCerosFinales (n `div` 10)
                      | otherwise       = n

Escribe tu solución

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