import Data.Char (digitToInt)
import Test.QuickCheck
-- 1ª solución
-- ===========
ultimoNoNuloFactorial :: Integer -> Integer
ultimoNoNuloFactorial = ultimoNoNulo . factorial
-- (factorial n) es el factorial de n. Por ejemplo,
-- factorial 7 == 5040
factorial :: Integer -> Integer
factorial n = product [1..n]
-- (ultimoNoNulo n) es el último dígito no nulo de n. Por ejemplo,
-- ultimoNoNulo 5040 == 4
ultimoNoNulo :: Integer -> Integer
ultimoNoNulo n | r /= 0 = r
| otherwise = ultimoNoNulo q
where (q,r) = n `quotRem` 10
-- 2ª solución
-- ===========
ultimoNoNuloFactorial2 :: Integer -> Integer
ultimoNoNuloFactorial2 = last . filter (/= 0) . digitos . factorial
digitos :: Integer -> [Integer]
digitos n = [read [x] | x <- show n]
-- 3ª solución
-- ===========
ultimoNoNuloFactorial3 :: Integer -> Integer
ultimoNoNuloFactorial3 = last . filter (/= 0) . digitos3 . factorial3
digitos3 :: Integer -> [Integer]
digitos3 = map (fromIntegral . digitToInt) . show
factorial3 :: Integer -> Integer
factorial3 = product . enumFromTo 1
-- 4ª solución
-- ===========
ultimoNoNulo4 :: Integer -> Integer
ultimoNoNulo4 n = read [head (dropWhile (=='0') (reverse (show n)))]
-- 5ª solución
-- ===========
ultimoNoNulo5 :: Integer -> Integer
ultimoNoNulo5 =
read . return . head . dropWhile ('0' ==) . reverse . show
-- Propiedad
-- =========
-- La propiedad es
prop_ultimoNoNuloFactorial :: Integer -> Property
prop_ultimoNoNuloFactorial n =
n > 4 ==> even (ultimoNoNuloFactorial n)
-- La comprobación es
-- ghci> quickCheck prop_ultimoNoNuloFactorial
-- +++ OK, passed 100 tests.