Siguiente equidigital
Dos números son equidigitales si tienen el mismo multiconjunto de dígitos. Por ejemplo, 2021 y 2120 son equidigitales ya que ambos tiene a {0,1,2,2} como su multiconjunto de dígitos.
Definir la función
siguienteEquidigital :: Integer -> Maybe Integer
tal que (siguienteEquidigital n) es precisamente el menor número equidigital con n que es mayor que n (es decir, (Just x) si x es dicho número o Nothing si no hay ningún número equidigital con n que sea mayor que n). Por ejemplo,
siguienteEquidigital 12 == Just 21 siguienteEquidigital 21 == Nothing siguienteEquidigital 513 == Just 531 siguienteEquidigital 531 == Nothing siguienteEquidigital 2021 == Just 2102 siguienteEquidigital 2102 == Just 2120 siguienteEquidigital 2120 == Just 2201 siguienteEquidigital 2201 == Just 2210 siguienteEquidigital 2210 == Nothing fmap (`mod` 1000) (siguienteEquidigital (2^(10^5))) == Just 637
Soluciones
import Data.List (sort) import Data.Maybe (listToMaybe) -- 1ª solución -- =========== siguienteEquidigital :: Integer -> Maybe Integer siguienteEquidigital n | null xs = Nothing | otherwise = Just (head xs) where xs = equidigitalesMayores n -- (equidigitalesMayores n) es la lista de los equidigitales mayores que -- n. Por ejemplo, -- equidigitalesMayores 2021 == [2102,2120,2201,2210] -- equidigitalesMayores 2210 == [] equidigitalesMayores :: Integer -> [Integer] equidigitalesMayores n = [x | x <- [n+1..mayorEquidigital n], sort (show x) == ds] where ds = sort (show n) -- (mayorEquidigital n) es el mayor número equidigital con n. Por ejemplo, -- mayorEquidigital 2021 == 2210 -- mayorEquidigital 2210 == 2210 mayorEquidigital :: Integer -> Integer mayorEquidigital = read . reverse . sort . show -- 2ª solución -- =========== siguienteEquidigital2 :: Integer -> Maybe Integer siguienteEquidigital2 = listToMaybe . equidigitalesMayores