-- |
-- Module      : Divisores_con_final
-- Description : Divisores de un número con final dado.
-- Copyright   : Exercitium (16-06-14)
-- License     : GPL-3
-- Maintainer  : JoseA.Alonso@gmail.com
-- 
-- __Divisores de un número con final dado__
-- 
-- Definir la función
-- 
-- > divisoresConFinal :: Integer -> Integer -> [Integer]
-- 
-- tal que __(divisoresConFinal n m)__ es la lista de los divisores de n
-- cuyos dígitos finales coincide con m. Por ejemplo,
-- 
-- >>> divisoresConFinal 84 4
-- [4,14,84]
-- >>> divisoresConFinal 720 20
-- [20,120,720]

module Divisores_con_final where

import Data.List (isSuffixOf)
import Test.QuickCheck

-- | 1ª definición.
divisoresConFinal :: Integer -> Integer -> [Integer]
divisoresConFinal n m = 
  [x | x <- [1..n]
     , n `rem` x == 0
     , final x m]

-- | __(final x y)__ se verifica si las cifras finales de x coincide con
-- y. Por ejemplo,
-- 
-- >>> final 325 5
-- True
-- >>> final 325 25
-- True
-- >>> final 325 35
-- False
final :: Integer -> Integer -> Bool
final x y = take n xs == ys
  where xs = reverse (show x)
        ys = reverse (show y)
        n  = length ys

-- | 2ª solución (con 'isSuffixOf').
divisoresConFinal2 :: Integer -> Integer -> [Integer]
divisoresConFinal2 n m = 
  [x | x <- [1..n]
     , n `rem` x == 0
     , show m `isSuffixOf` show x]

-- | Comprobación de la equivalencia de las definiciones de
-- 'divisoresConFinal'.
--
-- >>> quickCheck prop_equiv_divisoresConFinal
-- +++ OK, passed 100 tests.
prop_equiv_divisoresConFinal :: (Positive Integer) -> (Positive Integer) -> Bool
prop_equiv_divisoresConFinal (Positive n) (Positive m) =
  divisoresConFinal n m == divisoresConFinal2 n m