Home » Palindrome Count and Sum by Digit

Palindrome Count and Sum by Digit

Find the count and sum of Palindrome numbers for N digits Palindrome numbers. A Palindrome number is that which is same even when read from backwards. Such as 5665. For N = 2, palindrome numbers are 11, 22, 33, 44, 55, 66, 77, 88, 99. Hence, count is 9 and sum is 495.

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

Solving the challenge of Palindrome Count and Sum by Digit with Power Query

Power Query solution 1 for Palindrome Count and Sum by Digit, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Origen = Excel.CurrentWorkbook(){[Name = "Tabla1"]}[Content], 
  Pros = Table.AddColumn(
    Origen, 
    "A", 
    (x) =>
      let
        a = {Number.Power(10, x[N] - 1) + 1 .. Number.Power(10, x[N]) - 1}, 
        b = List.Transform(a, Text.From), 
        c = List.Select(
          b, 
          each 
            if Number.IsEven(x[N]) then
              Text.Start(_, x[N] / 2) = Text.Reverse(Text.End(_, x[N] / 2))
            else
              Text.Start(_, (x[N] - 1) / 2) = Text.Reverse(Text.End(_, (x[N] - 1) / 2))
        ), 
        d = List.Transform(c, Number.From), 
        e = List.Count(d), 
        f = List.Sum(d)
      in
        [Count = e, Sum = f]
  )[[A]], 
  Sol = Table.ExpandRecordColumn(Pros, "A", Record.FieldNames(Pros[A]{0}))
in
  Sol
Power Query solution 2 for Palindrome Count and Sum by Digit, proposed by Ramiro Ayala Chávez:
let
  S = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Fx = (x) =>
    let
      N = x, 
      A = {Number.Power(10, x - 1) .. Number.Power(10, x) - 1}, 
      B = List.Transform(A, Text.From), 
      C = List.Select(B, each _ = Text.Reverse(_)), 
      D = List.Count(C), 
      E = List.Transform(C, Number.From), 
      F = List.Sum(E), 
      G = {D} & {F}
    in
      G, 
  H = Table.AddColumn(S, "Count", each Fx([N]){0}), 
  Sol = Table.AddColumn(H, "Sum", each Fx([N]){1})
in
  Sol
Power Query solution 3 for Palindrome Count and Sum by Digit, proposed by Mihai Radu O:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  sol = Table.ExpandTableColumn(
    Table.AddColumn(
      Source, 
      "r", 
      each 
        let
          z = Number.IntegerDivide([N], 2), 
          a = List.Transform(
            List.Numbers(Number.Power(10, z - 1), Number.Power(10, z) - Number.Power(10, z - 1)), 
            Text.From
          ), 
          b = List.Transform(a, Text.Reverse), 
          c = List.Combine(
            List.Transform(
              a, 
              each List.Transform({"0" .. "9"}, (y) => Number.From(_ & y & Text.Reverse(_)))
            )
          ), 
          d = 
            if Number.IsEven([N]) then
              List.Transform(List.Zip({a, b}), each Number.From(_{0} & _{1}))
            else
              c
        in
          Table.FromColumns({{List.Count(d)}, {List.Sum(d)}}, {"Count", "Sum"})
    ), 
    "r", 
    {"Count", "Sum"}
  )
in
  sol

Solving the challenge of Palindrome Count and Sum by Digit with Excel

Excel solution 1 for Palindrome Count and Sum by Digit, proposed by Bo Rydobon 🇹🇭:
=LET(n,
    A3:A9-1,
    9*10^INT(
        n/2
    )*(5.5*10^n)^{0,
    1})
Excel solution 2 for Palindrome Count and Sum by Digit, proposed by Rick Rothstein:
=LET(
    r,
    A2:A8-2,
    n,
    9*10^ROUND(
        r/2,
        
    ),
    HSTACK(
        n,
        55*n*10^r
    )
)
Excel solution 3 for Palindrome Count and Sum by Digit, proposed by John V.:
=9/10^(1+INT(
    -A3:A9/2
))*(55*(10^(A3:A9-2)))
Excel solution 4 for Palindrome Count and Sum by Digit, proposed by Kris Jaganah:
=LET(a,
    A3:A9,
    b,
    SEQUENCE(
        9,
        ,
        11,
        11
    ),
    HSTACK(ROWS(
        b
    )*(10^INT((a-1)/2)),
    10^CEILING((a-2)*3/2,
    1)*SUM(
        b
    )))
Excel solution 5 for Palindrome Count and Sum by Digit, proposed by Julian Poeltl:
=TEXTSPLIT(
    TEXTJOIN(
        "|",
        ,
        MAP(
            A3:A9,
            LAMBDA(
                NN,
                LET(
                    N,
                    ROUNDDOWN(
                        NN/2,
                        0
                    ),
                    S,
                    SEQUENCE(
                        REPT(
                            9,
                            N
                        )*1-IFERROR(
                            REPT(
                                9,
                                N-1
                            )*1,
                            0
                        ),
                        ,
                        IFERROR(
                            REPT(
                                9,
                                N-1
                            )+1,
                            1
                        )
                    ),
                    M,
                    MAP(
                        S,
                        LAMBDA(
                            A,
                            A&TRANSPOSE(
                                CONCAT(
                                    MID(
                                        A,
                                        SEQUENCE(
                                            LEN(
                                                A
                                            ),
                                            ,
                                            LEN(
                                                A
                                            ),
                                            -1
                                        ),
                                        1
                                    )
                                )
                            )
                        )
                    ),
                    MM,
                    IF(
                        ISEVEN(
                            NN
                        ),
                        M,
                        LEFT(
                            M,
                            N
                        )&SEQUENCE(
                            ,
                            10,
                            0
                        )&RIGHT(
                            M,
                            N
                        )
                    )*1,
                    TEXTJOIN(
                        ",",
                        ,
                        COUNT(
                            MM
                        ),
                        SUM(
                            MM
                        )
                    )
                )
            )
        )
    ),
    ",",
    "|"
)
Excel solution 6 for Palindrome Count and Sum by Digit, proposed by Aditya Kumar Darak 🇮🇳:
=LET(
 _n,
     A3:A9,
    
 _cnt,
     MAP(
         _n,
          LAMBDA(
              a,
               9 * 10 ^ QUOTIENT(
                   a - 1,
                    2
               )
          )
     ),
    
 _ttl,
     _cnt * 55 * 10 ^ (_n - 2),
    
 _r,
     HSTACK(
         _n,
          _cnt,
          _ttl
     ),
    
 _r
)
Excel solution 7 for Palindrome Count and Sum by Digit, proposed by LEONARD OCHEA 🇷🇴:
=REDUCE(
    B2:C2,
    A3:A9,
    LAMBDA(
        h,
        n,
        LET(
            m,
            INT(
                n/2
            ),
            p,
            10^m/10,
            s,
            SEQUENCE(
                9*p,
                ,
                p
            ),
            t,
            ISEVEN(
                n
            ),
            r,
            IF(
                t,
                1,
                SEQUENCE(
                    10,
                    ,
                    0
                )
            ),
            d,
            DROP(
                REDUCE(
                    "",
                    r,
                    LAMBDA(
                        a,
                        b,
                        VSTACK(
                            a,
                            MAP(
                                s,
                                LAMBDA(
                                    c,
                                    c&IF(
                                        t,
                                        "",
                                        b
                                    )&CONCAT(
                                        MID(
                                            c,
                                            n-SEQUENCE(
                n
            )+1,
                                            1
                                        )
                                    )
                                )
                            )
                        )
                    )
                ),
                1
            ),
            VSTACK(
                h,
                HSTACK(
                    ROWS(
                        d
                    ),
                    SUM(
                        --d
                    )
                )
            )
        )
    )
)
Excel solution 8 for Palindrome Count and Sum by Digit, proposed by 🇵🇪 Ned Navarrete C.:
=LET(n,
    A3:A9,
    f,
    ROUNDUP(
        n/2,
        
    ),
    --({9,
    495}&REPT(
        0,
        HSTACK(
            f-1,
            n+f-3
        )
    )))
Excel solution 9 for Palindrome Count and Sum by Digit, proposed by El Badlis Mohd Marzudin:
=TEXTSPLIT(TEXTJOIN(";",,MAP(A3:A7, LAMBDA(x, LET(ed,REPT(9,x),st,1&REPT(0,x-1),sq,SEQUENCE(ed-st+1,,st),rv,MAP(sq,LAMBDA(w,TEXTJOIN("",,MID(w,SEQUENCE(LEN(w),,LEN(w),-1),1)))),pl,FILTER(sq,rv=sq&""), COUNT(pl)&"|"&SUM(pl))))),"|",";")

Solving the challenge of Palindrome Count and Sum by Digit with Python

Python solution 1 for Palindrome Count and Sum by Digit, proposed by Konrad Gryczan, PhD:
import pandas as pd
path = "495 Sum of N Digit Palindrome Numbers.xlsx"
input = pd.read_excel(path, usecols = "A", skiprows = 1)
test  = pd.read_excel(path, usecols = "B:C", skiprows = 1)
def generate_all_palindromes(num_digits):
 if num_digits < 1:
 raise ValueError("Number of digits must be at least 1")
 if num_digits == 1:
 return list(range(10))
 half_digits = (num_digits + 1) // 2
 start_num = 10 ** (half_digits - 1)
 end_num = 10 ** half_digits - 1
 palindromes = []
 
 for i in range(start_num, end_num + 1):
 num_str = str(i)
 rev_str = num_str[::-1]
 if num_digits % 2 == 0:
 palindrome_str = num_str + rev_str
 else:
 palindrome_str = num_str + rev_str[1:]
 palindromes.append(int(palindrome_str))
 
 return palindromes
result = input.assign(palindromes = input['N'].map(generate_all_palindromes)) 
 .assign(Count = lambda x: x['palindromes'].map(len),
 Sum = lambda x: x['palindromes'].map(sum)) 
 .loc[:, ['Count', 'Sum']]
print(result.equals(test)) # True
                    
                  

Solving the challenge of Palindrome Count and Sum by Digit with Python in Excel

Python in Excel solution 1 for Palindrome Count and Sum by Digit, proposed by Abdallah Ally:
def pallindrome_info(length):
 min_num = 10 ** (length - 1)
 max_num = 10 ** length
 rng = range(min_num, max_num)
 numbers = list(filter(lambda x: x == int(str(x)[::-1]), rng))
 return len(numbers), sum(numbers)
df = xl("A2:A9", headers=True)
# Perform data wrangling
df[['Count', 'Sum']] = df['N'].map(pallindrome_info).tolist()
df
                    
                  

Solving the challenge of Palindrome Count and Sum by Digit with R

R solution 1 for Palindrome Count and Sum by Digit, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "Excel/495 Sum of N Digit Palindrome Numbers.xlsx"
input = read_xlsx(path, range = "A2:A9")
test = read_xlsx(path, range = "B2:C9")
generate_all_palindromes <- function(num_digits) {
 if (num_digits < 1) {
 stop("Number of digits must be at least 1")
 }
 if (num_digits == 1) {
 return(0:9)
 }
 half_digits <- ceiling(num_digits / 2)
 start_num <- 10^(half_digits - 1)
 end_num <- 10^half_digits - 1
 palindromes <- vector("integer", length = 0)
 
 for (i in start_num:end_num) {
 num_str <- as.character(i)
 rev_str <- paste0(rev(strsplit(num_str, "")[[1]]), collapse = "")
 if (num_digits %% 2 == 0) {
 palindrome_str <- paste0(num_str, rev_str)
 } else {
 palindrome_str <- paste0(num_str, substring(rev_str, 2))
 }
 palindromes <- c(palindromes, as.integer(palindrome_str))
 }
 return(palindromes)
}
result = input %>%
 mutate(palindromes = map(N, generate_all_palindromes)) %>%
 mutate(Count = map_dbl(palindromes, length),
 Sum = map_dbl(palindromes, sum)) %>%
 select(Count, Sum)
identical(result, test)
# [1] TRUE
                    
                  

&&&

Leave a Reply