Home » Matching Digit Sums

Matching Digit Sums

Find first 25 numbers starting with two digits where sum of individual digits of (Number = Square of Number = Cube of Number) Ex. 468 Sum of digits of Number = 4+6+8 = 18 Sum of digits of square of Number = 468^2 = 219024 =2+1+9+0+2+4 = 18 Sum of digits of cube of Number = 468^3 = 102503232 = 1+0+2+5+0+3+2+3+2 = 18

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

Solving the challenge of Matching Digit Sums with Power Query

Power Query solution 1 for Matching Digit Sums, proposed by Kris Jaganah:
let
  q = Table.FromColumns(
    {
      List.FirstN(
        List.RemoveNulls(
          List.Transform(
            {10 .. 3000000}, 
            (x) =>
              let
                a = List.Sum(List.Transform(Text.ToList(Text.From(x)), Number.From)), 
                b = List.Sum(
                  List.Transform(Text.ToList(Text.From(Number.Power(x, 2))), Number.From)
                ), 
                c = List.Sum(
                  List.Transform(Text.ToList(Text.From(Number.Power(x, 3))), Number.From)
                ), 
                d = if a = b and b = c and a = c then x else null
              in
                d
          )
        ), 
        25
      )
    }, 
    {"Answer Expected"}
  )
in
  q
Power Query solution 2 for Matching Digit Sums, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = List.RemoveFirstN(
    List.Generate(
      () => [x = 9, y = 0], 
      each [y] <= 25, 
      each [
        x = [x] + 1, 
        t = List.Transform(
          {x, Number.Power(x, 2), Number.Power(x, 3)}, 
          each List.Sum(List.Transform(Text.ToList(Text.From(_)), Number.From))
        ), 
        u = t{0} = t{1} and t{1} = t{2}, 
        y = if u then [y] + 1 else [y]
      ], 
      each Record.ToList([[x], [u]])
    )
  ), 
  Sol = List.Transform(List.Select(Source, each _{1} = true), each _{0})
in
  Sol
Power Query solution 3 for Matching Digit Sums, proposed by Ramiro Ayala Chávez:
let
  A = Table.FromColumns({{10 .. 3000000}}, {"N"}), 
  Fx = (x) =>
    let
      L = List.Transform, 
      a = x, 
      G = List.Generate(
        () => [i = 1], 
        each [i] < 4, 
        each [i = [i] + 1], 
        each 
          let
            b = L({Number.Power(a, [i])}, each Text.ToList(Text.From(_))), 
            c = L(L(b, each L(_, Number.From)), List.Sum)
          in
            c
      ), 
      d = List.Combine(G), 
      e = if d{0} = d{1} and d{0} = d{2} then a else null
    in
      e, 
  B = Table.AddColumn(A, "Answer Expected", each Fx([N])), 
  Sol = Table.FirstN(Table.SelectRows(B, each [Answer Expected] <> null)[[Answer Expected]], 25)
in
  Sol

Solving the challenge of Matching Digit Sums with Excel

Excel solution 1 for Matching Digit Sums, proposed by Bo Rydobon 🇹🇭:
=LET(s,SEQUENCE(5^7)+9,SORT(UNIQUE(TOCOL(FILTER(s,TOCOL(MAP(s,LAMBDA(n,LET(p,n^{1,2,3},IF(STDEV(p-INT(p/9)*9)=0,STDEV(BYCOL(--(0&MID(p,SEQUENCE(15),1)),SUM))=0))))))*10^{0,1,2}))))
Excel solution 2 for Matching Digit Sums, proposed by John V.:
=LET(s,9+SEQUENCE(9^5),TAKE(UNIQUE(SORT(TOCOL(s*10^{0,1,2}/MAP(s,LAMBDA(x,STDEV(BYCOL(--(0&MID(x^{1,2,3},ROW(1:15),1)),SUM))=0))))),25))
Excel solution 3 for Matching Digit Sums, proposed by محمد حلمي:
=SORT(UNIQUE(TOCOL(MAP(SEQUENCE(60000)+9,LAMBDA(n,
LET(r,LAMBDA(e,SUM(-MID(n^e,SEQUENCE(LEN(n^e)),1))),
n/AND(r(1)=r(2),r(1)=r(3)))))*10^{0,1,2},2)))
Excel solution 4 for Matching Digit Sums, proposed by Kris Jaganah:
=LET(
    a,
    SEQUENCE(
        9^5,
        ,
        10
    ),
    b,
    TOCOL(
        a/MAP(
            a,
            a^2,
            a^3,
            LAMBDA(
                x,
                y,
                z,
                LET(
                    a,
                    LAMBDA(
                        u,
                        SUM(
                            --MID(
                                u,
                                SEQUENCE(
                                    LEN(
                                        u
                                    )
                                ),
                                1
                            )
                        )
                    ),
                    AND(
                        a(
                            x
                        )=a(
                            y
                        ),
                        a(
                            y
                        )=a(
                            z
                        ),
                        a(
                            x
                        )=a(
                            z
                        )
                    )
                )
            )
        ),
        3
    ),
    c,
    TAKE(
        b,
        -7
    ),
    TAKE(
        VSTACK(
            b,
            c*10,
            c*100
        ),
        25
    )
)
Excel solution 5 for Matching Digit Sums, proposed by Julian Poeltl:
=LET(SD,LAMBDA(A,ROWS(UNIQUE(MAP(A^SEQUENCE(3),LAMBDA(A,SUM(--(MID(A,SEQUENCE(LEN(A)),1)))))))=1),TAKE(TOCOL(MAP(SEQUENCE(10^6,,2),LAMBDA(A,IF(SD(A),A,E))),3),25))
Excel solution 6 for Matching Digit Sums, proposed by Timothée BLIOT:
=LET(S,SEQUENCE(10^5,6)+1,F,LAMBDA(n,MAP(SUBSTITUTE(n,"0",""),LAMBDA(x,SUM(--MID(x,SEQUENCE(LEN(x)),1))))), TAKE(TOCOL(IF(F(IF(F(S^2)=F(S),S,0)^3)=F(S),S,1/0),3),25))
Excel solution 7 for Matching Digit Sums, proposed by Oscar Mendez Roca Farell:
=LET(s,
     SEQUENCE(
         9^5,
          ,
          10
     ),
     t,
     TOCOL(s/MAP(s,
     LAMBDA(a,
     LET(n,
     --(0&MID(
         a^{1; 2; 3},
          SEQUENCE(
               ,
               20
          ),
          1
     )),
     m,
     MMULT(
         n,
          SEQUENCE(
              20
          )^0
     ),
     AND(
         m=AVERAGE(
             m
         )
     )))),
     3),
     TAKE(
         VSTACK(
             t,
              TOCOL(
                  TAKE(
                      t,
                       -7
                  )*10^{1,
                   2},
                   ,
                   1
              )
         ),
          25
     ))
Excel solution 8 for Matching Digit Sums, proposed by Sunny Baggu:
=LET(
    
     a,
     SEQUENCE(
         A26 / 20,
          20,
          10
     ),
    
     b,
     a ^ 2,
    
     c,
     a ^ 3,
    
     l,
     LAMBDA(
         n,
          SUM(
              --MID(
                  n,
                   SEQUENCE(
                       LEN(
                           n
                       )
                   ),
                   1
              )
          )
     ),
    
     TAKE(
         
          TOCOL(
              
               IF(
                   MAP(
                       a,
                        b,
                        c,
                        LAMBDA(
                            x,
                             y,
                             z,
                             AND(
                                 l(
                                     x
                                 ) = l(
                                     y
                                 ),
                                  l(
                                     y
                                 ) = l(
                                     z
                                 )
                             )
                        )
                   ),
                    a,
                    NA()
               ),
              
               3
               
          ),
         
          25
          
     )
    
)
Excel solution 9 for Matching Digit Sums, proposed by Anshu Bantra:
=1):
 str_lst = [_ for _ in str(
     num**pow
 )]
 return sum(
     [int(
         _
     ) for _ in str_lst]
 )
num = 10
lst = []
while len(
    lst
)<25:
 if sum_lst(
     num
 )==sum_lst(
     num,
      2
 )==sum_lst(
     num,
      3
 ): lst.append(
     num
 )
Excel solution 10 for Matching Digit Sums, proposed by Jaroslaw Kujawa:
=LET(x;
    MAP(LAMBDA(
        a;
        LET(
            b;
            VSTACK(
                a;
                a^2;
                a^3
            );
            b
        )
    )(SEQUENCE(
        ;
        1000000
    ));
    LAMBDA(
        b;
        SUM(
            --MID(
                b;
                SEQUENCE(
                    LEN(
                        b
                    )
                );
                1
            )
        )
    ));
    TAKE(TAKE(FILTER(VSTACK(
        SEQUENCE(
        ;
        1000000
    );
        x
    );
    
(TAKE(
    x;
    -1
)=TAKE(
    TAKE(
        x;
        -2
    );
    1
))*(TAKE(
    x;
    1
)=TAKE(
    TAKE(
        x;
        -2
    );
    1
)));
    1);
    ;
    25))
Excel solution 11 for Matching Digit Sums, proposed by Bilal Mahmoud kh.:
=LET(ch,LAMBDA(m,SUM(--MID(m,SEQUENCE(LEN(m)),1))),res,REDUCE(10,SEQUENCE(10),LAMBDA(x,y,VSTACK(x,LET(re,MAP(SEQUENCE(500000,,MAX(x)+1),LAMBDA(in,IF(ch(in)=ch(in^2),IF(ch(in^2)=ch(in^3),in,0),0))),FILTER(re,re<>0,0))))),FILTER(res,res<>0))
Excel solution 12 for Matching Digit Sums, proposed by Eddy Wijaya:
=LET(
d,
     SEQUENCE(
         10^6,
         ,
         10
     ),
    
sum_digits_power,
     LAMBDA(
         arr,
         power,
          MAP(
              arr,
               LAMBDA(
                   x,
                    SUM(
                        VALUE(
                            MID(
                                x^power,
                                 SEQUENCE(
                                     LEN(
                                         x^power
                                     )
                                 ),
                                 1
                            )
                        )
                    )
               )
          )
     ),
    
a,
     sum_digits_power(
         d,
          1
     ),
    
b,
     sum_digits_power(
         d,
          2
     ),
    
c,
     sum_digits_power(
         d,
          3
     ),
    
newDb,
    HSTACK(
        a,
        b,
        c
    ),
    
TAKE(TOCOL(IF( (a=b) * (b=c),
    d,
    x),
    2),
    25))
Excel solution 13 for Matching Digit Sums, proposed by Safa Macit:
=
LET(
a,
    SEQUENCE(
        600000,
        1
    ),
    
b,
    FILTER(a,
    (LEN(
        a
    )>1)),
    
c,
    BYROW(
        NUMBERVALUE(
            MID(
                b,
                MAKEARRAY(
                    1,
                    20,
                    LAMBDA(
                        a,
                        b,
                        a+b-1
                    )
                ),
                1
            )
        ),
        LAMBDA(
            a,
            SUM(
        a
    )
        )
    ),
    
d,
    b^2,
    
e,
    b^3,
    
f,
    BYROW(
        NUMBERVALUE(
            MID(
                d,
                MAKEARRAY(
                    1,
                    20,
                    LAMBDA(
                        a,
                        b,
                        a+b-1
                    )
                ),
                1
            )
        ),
        LAMBDA(
            a,
            SUM(
        a
    )
        )
    ),
    
g,
    BYROW(
        NUMBERVALUE(
            MID(
                e,
                MAKEARRAY(
                    1,
                    20,
                    LAMBDA(
                        a,
                        b,
                        a+b-1
                    )
                ),
                1
            )
        ),
        LAMBDA(
            a,
            SUM(
        a
    )
        )
    ),
    
FILTER(b,
    (c=f)*(f=g))
)

Solving the challenge of Matching Digit Sums with Python

Python solution 1 for Matching Digit Sums, proposed by Konrad Gryczan, PhD:
Faster than R but still not satisfying me with speed. :D
import pandas as pd
path = "519 Sum of Digits of Number, Square and Cube are Same.xlsx"
test = pd.read_excel(path, usecols= "A")
def digit_sum(x):
 return sum([int(d) for d in str(x)])
x = 9
results = []
while len(results) < 25:
 n = digit_sum(x)
 s = digit_sum(x**2)
 c = digit_sum(x**3)
 
 if n == s and n == c:
 results.append({'x': x, 'n': n, 's': s, 'c': c})
 
 x += 1
results = pd.DataFrame(results)['x']
print(results.equals(test['Answer Expected'])) # True
                    
                  

Solving the challenge of Matching Digit Sums with R

R solution 1 for Matching Digit Sums, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(gmp)
path = "Excel/519 Sum of Digits of Number, Square and Cube are Same.xlsx"
test = read_excel(path, range = "A1:A26")
digit_sum <- function(x) {
 sum(as.integer(unlist(strsplit(as.character(x), ""))))
}
x <- 9
results <- tibble(x = numeric(), n= numeric(), s= numeric(), c= numeric())
while (nrow(results) < 25) {
 n <- digit_sum(x)
 s <- digit_sum(as.bigz(x)^2)
 c <- digit_sum(as.bigz(x)^3)
 
 if (n == s && n == c) {
 results <- results %>% add_row(x = x, n = n, s = s, c = c)
 }
 
 x <- x + 1
}
identical(results$x, test$`Answer Expected`)
#> [1] TRUE
                    
                  

&&&

Leave a Reply