Menu Close

Pandigitales primos

Un número con n dígitos es pandigital si contiene todos los dígitos del 1 a n exactamente una vez. Por ejemplo, 2143 es un pandigital con 4 dígitos y, además, es primo.

Definir la constante

   pandigitalesPrimos :: [Int]

tal que sus elementos son los números pandigitales, ordenados de mayor a menor. Por ejemplo,

   take 3 pandigitalesPrimos       ==  [7652413,7642513,7641253]
   2143 `elem` pandigitalesPrimos  ==  True
   length pandigitalesPrimos       ==  538

Soluciones

import Data.List (permutations, sort)
import Data.Char (intToDigit)
import Data.Numbers.Primes (isPrime, primes)
 
-- 1ª solución
-- ===========
 
pandigitalesPrimos :: [Int]
pandigitalesPrimos =
  concatMap nPandigitalesPrimos [9,8..1]
 
-- (nPandigitalesPrimos n) es la lista de los números pandigitales con n
-- dígitos, ordenada de mayor a menor. Por ejemplo,
--    nPandigitalesPrimos 4  ==  [4231,2341,2143,1423]
--    nPandigitalesPrimos 5  ==  []
nPandigitalesPrimos1 :: Int -> [Int]
nPandigitalesPrimos1 n = filter isPrime (pandigitales n)
 
-- Nota. La definición anterior se puede simplificar, ya que la suma de
-- los números de 1 a n es divisible por 3, entonces los números
-- pandigitales con n dígitos también lo son y, por tanto, no son primos.
nPandigitalesPrimos2 :: Int -> [Int]
nPandigitalesPrimos2 n 
  | sum [1..n] `mod` 3 == 0 = []
  | otherwise               = filter isPrime (pandigitales n)
 
-- Nota. La definición anterior se puede simplificar, ya que
--    ghci> [n | n <- [1..9], sum [1..n] `mod` 3 /= 0]
--    [1,4,7]
nPandigitalesPrimos :: Int -> [Int]
nPandigitalesPrimos n 
  | n `elem` [4,7] = filter isPrime (pandigitales n)
  | otherwise      = []
 
-- (pandigitales n) es la lista de los números pandigitales de n dígitos
-- ordenada de mayor a menor. Por ejemplo,
--    pandigitales 3  ==  [321,312,231,213,132,123]
pandigitales :: Int -> [Int]
pandigitales n = 
  reverse $ sort $ map digitosAentero (permutations [1..n])
 
-- (digitosAentero ns) es el número cuyos dígitos son ns. Por ejemplo,
--    digitosAentero [3,2,5]  ==  325
digitosAentero :: [Int] -> Int
digitosAentero = read . map intToDigit

4 soluciones de “Pandigitales primos

  1. Enrique Zubiría
    import Data.List
    import Data.Numbers.Primes
     
    pandigitalesPrimos :: [Int]
    pandigitalesPrimos =
      reverse $ sort (concatMap pandigitalesPrimosA1N [9,8..1])
      where pandigitalesPrimosA1N n =
              filter isPrime (map (foldl ((+).(10*)) 0) (permutations [1..n]))
  2. fercarnav
    import Data.List
     
    pandigitalesPrimos :: [Int]
    pandigitalesPrimos =  reverse (sort (filter isPrime pandigitaLista))
     
    pandigitalList :: Int -> [Int]
    pandigitalList n = map read zs
      where ys = show (numero2 n)
            zs = permutations ys
     
    pandigitaLista :: [Int]
    pandigitaLista = concatMap pandigitalList [1..9]
     
    numero2 :: Int -> Int
    numero2 1 = 1
    numero2 n = n*10^(n-1) + numero2 (n-1)
  3. rebgongor
    import Data.Numbers.Primes
    import Data.List
     
    pandigitalesPrimos :: [Int]
    pandigitalesPrimos = reverse $ filter pandigital primos
      where primos = map read
                         (takeWhile (ys -> length ys <= 7) (map show primes)) 
     
    pandigital :: Int -> Bool
    pandigital n = sort xs == take l "1234567"
      where xs = show n
            l = length xs
  4. pabserpoz
    import Data.Char
    import Data.List
    import Data.Numbers.Primes
     
    pandigitalesPrimos :: [Int]
    pandigitalesPrimos =
      reverse (sort [m | a <- [3..9],
                         n <- permutations ['1'..intToDigit a],
                         let m = read n,
                         isPrime m])

Leave a Reply

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