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
1 |
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,
1 2 3 4 5 6 7 8 9 10 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
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 |
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>
6 Comentarios