Home » List Prime Pandigital Numbers

List Prime Pandigital Numbers

An n digit number is Pandigital if it makes use of all the digits 1 to n exactly once. For ex. 12, 231, 4312…. List the first 100 Pandigital numbers which are prime numbers also.

📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 436
Challenge Difficulty: ⭐️⭐️⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of List Prime Pandigital Numbers with Power Query

Power Query solution 1 for List Prime Pandigital Numbers, proposed by Bo Rydobon 🇹🇭:
let
  Source = 2, 
  Pan = List.Transform(
    List.Accumulate(
      {"2" .. "7"}, 
      {}, 
      (a, i) =>
        let
          n = {"1" .. i}
        in
          a
            & List.Accumulate(
              n, 
              {""}, 
              (s, l) =>
                List.Combine(
                  List.Transform(
                    s, 
                    each List.RemoveNulls(
                      List.Transform(n, (n) => if Text.Contains(_, n) then null else _ & n)
                    )
                  )
                )
            )
    ), 
    each Number.From(_)
  ), 
  Prime = List.FirstN(
    List.Select(
      Pan, 
      (n) =>
        List.AllTrue(
          List.Transform(
            {2, 3, 5, 7}
              & List.Combine(
                List.Transform(
                  {2 .. Number.IntegerDivide(Number.Sqrt(n), 6) + 1}, 
                  each List.Transform({- 1, 1}, (d) => _ * 6 + d)
                )
              ), 
            each Number.Mod(n, _) > 0
          )
        )
    ), 
    100
  )
in
  Prime
Power Query solution 2 for List Prime Pandigital Numbers, proposed by Aditya Kumar Darak 🇮🇳:
let
  MyFun = (Number as number) =>
    let
      Sqrt = Number.Sqrt(Number), 
      Int  = Number.IntegerDivide(Sqrt, 1), 
      Seq  = List.Buffer({3 .. Int}), 
      Mod  = List.Transform(Seq, each Number.Mod(Number, _)), 
      TF   = List.Min(Mod) <> 0
    in
      TF, 
  Generate = List.Generate(
    () => [a = 3, c = false, z = 0], 
    each [z] < 1200, 
    each [
      a = [a] + 2, 
      b = Text.From(a), 
      c = List.ContainsAll(Text.ToList(b), {"1" .. Text.From(Text.Length(b))})
        and List.Contains({"1", "3", "7"}, Text.End(b, 1)), 
      z = [z] + Number.From(c)
    ]
  ), 
  Table = Table.FromRecords(Generate), 
  Output = List.Buffer(Table.SelectRows(Table, each [c])[a]), 
  Select = List.Select(Output, MyFun), 
  Return = List.FirstN(Select, 100)
in
  Return
Power Query solution 3 for List Prime Pandigital Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  a = 2600000, 
  b = List.Select(
    List.Select({10 .. a}, each Number.IsOdd(_)), 
    each List.AllTrue(
      List.Transform(
        List.Transform({2 .. Int64.From(Number.Sqrt(_))}, (x) => Number.Mod(_, x)), 
        (y) => y <> 0
      )
    )
  ), 
  c = List.RemoveNulls(
    List.Transform(
      b, 
      each if Text.Contains(Text.From(_), "0") then null else Text.ToList(Text.From(_))
    )
  ), 
  e = List.Select(
    c, 
    each 
      let
        a = {1 .. List.Count(_)}, 
        b = List.Transform(List.Sort(_), Number.From), 
        d = a = b
      in
        d
  ), 
  f = List.Transform(e, each Number.From(Text.Combine(_)))
in
  f
Power Query solution 4 for List Prime Pandigital Numbers, proposed by Ramiro Ayala Chávez:
let
  G = List.Generate(
    () => [i = 2], 
    each [i] <= 9, 
    each [i = [i] + 1], 
    each 
      let
        a = {1 .. [i]}, 
        b = List.Accumulate(
          List.Repeat({0}, List.Count(a) - 1), 
          a, 
          (s, c) => List.TransformMany(s, each a, (x, y) => Text.From(x) & Text.From(y))
        ), 
        c = List.Transform(b, each Text.ToList(_)), 
        d = List.Select(c, each List.Count(_) = List.Count(List.Distinct(_))), 
        e = List.Transform(d, each Text.Combine(_))
      in
        e
  ), 
  f = Table.TransformColumnTypes(
    Table.FromList(List.Combine(G), null, {"Answer"}), 
    {"Answer", Int64.Type}
  ), 
  Fx = (x) =>
    let
      A = Number.IntegerDivide(Number.Sqrt(x), 1), 
      B = List.Transform(List.Buffer({2 .. A}), each Number.Mod(x, _)), 
      C = List.Min(B) <> 0
    in
      C, 
  g = Table.AddColumn(f, "L", each Fx([Answer])), 
  Sol = Table.FirstN(Table.SelectRows(g, each [L] = true)[[Answer]], 100)
in
  Sol

Solving the challenge of List Prime Pandigital Numbers with Excel

Excel solution 1 for List Prime Pandigital Numbers, proposed by Bo Rydobon 🇹🇭:
=TAKE(
    TOCOL(
        MAP(
            DROP(
                REDUCE(
                    ,
                    SEQUENCE(
                        7
                    ),
                    LAMBDA(
                        a,
                        v,
                        VSTACK(
                            a,
                            SORT(
                                TOCOL(
                                    REPLACE(
                                        FILTER(
                                            a,
                                            LEN(
                                                a
                                            )=v-1
                                        ),
                                        SEQUENCE(
                                            ,
                                            v
                                        ),
                                        ,
                                        v
                                    )
                                )
                            )
                        )
                    )
                ),
                1
            ),
            LAMBDA(
                k,
                k/AND(
                    MOD(
                        k,
                        SEQUENCE(
                            k^0.5
                        )+1
                    )
                )
            )
        ),
        3
    ),
    100
)
Excel solution 2 for List Prime Pandigital Numbers, proposed by John V.:
=LET(
    f,
    LAMBDA(
        s,
        b,
        LET(
            m,
            REPT(
                1,
                b
            )+BASE(
                SEQUENCE(
                    s
                ),
                b,
                b
            ),
            TOCOL(
                m/MAP(
                    m,
                    LAMBDA(
                        x,
                        AND(
                            FIND(
                                SEQUENCE(
                                    b
                                ),
                                x
                            )
                        )
                    )
                ),
                2
            )
        )
    ),
    i,
    VSTACK(
        f(
            255,
            4
        ),
        f(
            4^9,
            7
        )
    ),
    TAKE(
        TOCOL(
            i/MAP(
                i,
                LAMBDA(
                    x,
                    AND(
                        MOD(
                            x,
                            1+SEQUENCE(
                                x^0.5
                            )
                        )
                    )
                )
            ),
            2
        ),
        100
    )
)
Excel solution 3 for List Prime Pandigital Numbers, proposed by محمد حلمي:
=LET(q,
    LAMBDA(n,
    LET(
s,
    SEQUENCE(
        n
    )-1,
    e,
    MOD(
        INT(
            SEQUENCE(
                n^n,
                ,
                0
            )/n^TOROW(
                s
            )
        ),
        n
    )+1,
    
r,
    FILTER(
        e,
        IFERROR(
            BYROW(
                e,
                LAMBDA(
                    a,
                    AND(
                        FIND(
                            SEQUENCE(
                                ,
                                n
                            ),
                            
                            SORT(
                                a,
                                ,
                                ,
                                1
                            )
                        )
                    )
                )
            ),
            0
        )
    ),
    TOCOL(BYROW(FILTER(
        r,
        
        IFNA(
            XMATCH(
                DROP(
                    r,
                    ,
                    n-1
                ),
                {1,
                3,
                7}
            ),
            0
        )
    ),
    LAMBDA(a,
    LET(i,
    CONCAT(
        a
    ),
    
IFS(1-(OR(
    MOD(
        i,
        SEQUENCE(
            i^0.5
        )+1
    )=0
)),
    i)))),
    2))),
    
TAKE(
    SORT(
        --VSTACK(
            q(
                4
            ),
            q(
                7
            )
        )
    ),
    100
))
Excel solution 4 for List Prime Pandigital Numbers, proposed by Timothée BLIOT:
=LET(A,
    SEQUENCE(
        ,
        9
    ),
    B,
    REDUCE(
        TOCOL(
            A
        ),
        SEQUENCE(
            6
        ),
        LAMBDA(
            w,
            v,
            LET(
                C,
                FILTER(
                    w,
                    LEN(
                        w
                    )=v
                ),
                VSTACK(
                    w,
                    TOCOL(
                        IF(
                            ISERR(
                                FIND(
                                    A,
                                    C
                                )
                            ),
                            C&A,
                            1/0
                        ),
                        3
                    )
                )
            )
        )
    ),
    
D,
    FILTER(
        B,
        MAP(
            B,
            LAMBDA(
                x,
                CONCAT(
                    SORT(
                        --MID(
                            x,
                            SEQUENCE(
                                LEN(
                                    x
                                )
                            ),
                             1
                        )
                    )
                )=CONCAT(
                    SEQUENCE(
                                LEN(
                                    x
                                )
                            )
                )
            )
        )
    ),
    TAKE(--FILTER(D,
    MAP(D,
    LAMBDA(x,
     AND(x>1,
     IF(INT(
         x^0.5
     )>=2,
    SUM(--(MOD(
        x,
        SEQUENCE(
            INT(
         x^0.5
     )-1,
            ,
            2
        )
    )=0))=0,
    1))))),
    100))
Excel solution 5 for List Prime Pandigital Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(
    m,
    DROP(
        BYROW(
            IFNA(
                REDUCE(
                    1,
                    SEQUENCE(
                        6
                    )+1,
                    LAMBDA(
                        x,
                        y,
                        VSTACK(
                            x,
                            LET(
                                p,
                                FACT(
                                    y-1
                                ),
                                m,
                                IFNA(
                                    HSTACK(
                                        SEQUENCE(
                                            p
                                        )^0,
                                        x+1
                                    ),
                                    1
                                ),
                                REDUCE(
                                    m,
                                    SEQUENCE(
                                    y-1
                                ),
                                    LAMBDA(
                                        a,
                                        b,
                                        LET(
                                            c,
                                            TAKE(
                                                a,
                                                -p
                                            ),
                                            VSTACK(
                                                TAKE(
                                                    a,
                                                    -p*b
                                                ),
                                                IF(
                                                    c=b,
                                                    b+1,
                                                    IF(
                                                        c=b+1,
                                                        b,
                                                        c
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                    )
                ),
                ""
            ),
            CONCAT
        ),
        1
    ),
    TAKE(
        TOCOL(
            m/MAP(
                m,
                LAMBDA(
                    n,
                    LET(
                        x,
                        n/SEQUENCE(
                            n^0.5,
                            ,
                            2
                        ),
                        NOT(
                            OR(
                                x=INT(
                                    x
                                )
                            )
                        )
                    )
                )
            ),
            2
        ),
        100
    )
)

Solving the challenge of List Prime Pandigital Numbers with Python

Python solution 1 for List Prime Pandigital Numbers, proposed by Konrad Gryczan, PhD:
import pandas as pd
from itertools import permutations
from sympy import isprime
test = pd.read_excel("436 Pandigital Primes.xlsx", usecols="A", nrows=101)
def generate_pandigital(n):
 digits = list(range(1, n+1))
 digits = list(permutations(digits, n))
 digits = [int(''.join(map(str, x))) for x in digits]
 return digits
df = pd.DataFrame(columns=["numbers"])
for i in range(1, 8):
 pandigitals = generate_pandigital(i)
 df = df._append(pd.DataFrame({"numbers": pandigitals}))
df["is_prime"] = df["numbers"].apply(isprime)
df["numbers"] = df["numbers"].astype("int64")
result = df[df["is_prime"]].head(100).drop(columns="is_prime").reset_index(drop=True)
result.rename(columns={"numbers": "Answer Expected"}, inplace=True)
print(result.equals(test)) # True
                    
                  

Solving the challenge of List Prime Pandigital Numbers with Python in Excel

Python in Excel solution 1 for List Prime Pandigital Numbers, proposed by Abdallah Ally:
import pandas as pd
def is_prime(number):
 if number < 2: 
 return False
 for i in range(2, int(number ** 0.5) + 1):
 if number % i == 0: # alternatively => if not number % i
 return False
 return True
def is_pandigital(number):
 available_digits = [int(x) for x in str(number)]
 expected_digits = list(range(1, len(str(number)) + 1))
 return expected_digits == sorted(available_digits)
def prime_pandigital(n):
 numbers = []
 number = 10
 while len(numbers) < n:
 if is_prime(number) and is_pandigital(number):
 numbers.append(number)
 number += 1
 return numbers
file_path = 'Excel_Challenge_436 - Pandigital Primes.xlsx'
df = pd.read_excel(file_path)
df['My Answer'] = pd.Series(prime_pandigital(100))
prin&t(f'nRequired Results:n{df}')
                    
                  
Python in Excel solution 2 for List Prime Pandigital Numbers, proposed by Abdallah Ally:
import pandas as pd
def is_prime(number):
 if number < 2: return False
 for i in range(2, int(number ** 0.5) + 1):
 if not number % i: return False
 return True
def is_pandigital(number):
 available_digits = [int(x) for x in str(number)]
 expected_digits = list(range(1, len(str(number)) + 1))
 return expected_digits == sorted(available_digits)
def prime_pandigital(n):
 numbers = filter(lambda x: is_prime(x) and is_pandigital(x), range(10, 10 ** 7))
 return list(numbers)[ : n]
file_path = 'Excel_Challenge_436 - Pandigital Primes.xlsx'
df = pd.read_excel(file_path)
df['My Answer'] = pd.Series(prime_pandigital(100))
print(f'Required Results:n{df}')
                    
                  

Solving the challenge of List Prime Pandigital Numbers with R

R solution 1 for List Prime Pandigital Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(primes)
library(gtools)
test = read_excel("Excel/436 Pandigital Primes.xlsx", range = "A1:A101")
generate_pandigital = function(n) {
 digits = 1:n
 digits = permutations(n,n) 
 digits = apply(digits, 1, function(x) as.numeric(paste(x, collapse = "")))
 return(digits)
}
df = data.frame(numbers = NA)
for (i in 1:7) {
 pandigitals = generate_pandigital(i)
 df = rbind(df, data.frame(numbers = pandigitals)) 
}
result = df %>%
 mutate(is_prime = map_lgl(numbers, is_prime)) %>%
 filter(is_prime) %>%
 head(100)
                    
                  

Solving the challenge of List Prime Pandigital Numbers with Excel VBA

Excel VBA solution 1 for List Prime Pandigital Numbers, proposed by Julian Poeltl:
VBA-Code:
Sub CH()
Dim N, C As Long
N = 1001
Do
N = N + 2
If IsPrime(N) = True Then
If NoDouble(N) = True Then
If AllL(N) = True Then
Cells(C + 2, 2).Value = N
C = C + 1
End If
End If
End If
Loop Until C >= 100
End Sub
Function IsPrime(N) As Boolean
Dim i As Long
For i = 2 To Sqr(N)
If N Mod i = 0 Then
IsPrime = False
Exit Function
End If
Next
IsPrime = True
End Function
Function NoDouble(N) As Boolean
Dim L, R, T As Long
L = Len(N)
For R = 1 To L
For T = 1 To L
If Mid(N, R, 1) = Mid(N, T, 1) And R <> T Then
NoDouble = False
Exit Function
End If
Next
Next
NoDouble = True
End Function
Function AllL(N) As Boolean
Dim L, T As Long
L = Len(N)
For T = 1 To L
If InStr(1, Right(Str(N), L), Right(T, 1), vbTextCompare) = 0 Then
AllL = False
Exit Function
End If
Next
AllL = True
End Function
                    
                  

&&

Leave a Reply