Home » Next Three Palindromes

Next Three Palindromes

A palindrome number is that which is same even when read backwards. Find the next 3 palindrome numbers after given numbers. Ex. 184 => 191, 202, 212

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

Solving the challenge of Next Three Palindromes with Power Query

Power Query solution 1 for Next Three Palindromes, proposed by Kris Jaganah:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Ans = Table.AddColumn(
    Source, 
    "Custom", 
    each 
      let
        a = [Number], 
        b = Number.Power(10, Number.RoundUp(Text.Length(Text.From(a)) / 2 + 0.5, 0)), 
        c = List.FirstN(
          List.RemoveNulls(
            List.Transform(
              {a + 1 .. a + b}, 
              each 
                let
                  x = Text.From(_)
                in
                  if Text.Reverse(x) = x then _ else null
            )
          ), 
          3
        )
      in
        Table.FromRows({c}, {"No.1", "No.2", "No.3"})
  ), 
  Expan = Table.ExpandTableColumn(Ans, "Custom", {"No.1", "No.2", "No.3"})
in
  Expan
Power Query solution 2 for Next Three Palindromes, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  LG = Table.AddColumn(
    Source, 
    "A", 
    each List.Generate(
      () => [x = [Number], y = 0, s = false], 
      each [y] <= 3, 
      each [
        x = [x] + 1, 
        s = Text.From(x) = Text.Reverse(Text.From(x)), 
        y = if s then [y] + 1 else [y]
      ], 
      each {[x], [s]}
    )
  )[A], 
  Sol = Table.Combine(
    List.Transform(
      LG, 
      each 
        let
          a = List.Select(_, each _{1} = true), 
          b = List.Transform(a, each _{0}), 
          c = Table.FromRows({b})
        in
          c
    )
  )
in
  Sol
Power Query solution 3 for Next Three Palindromes, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Process = Table.AddColumn(
    Source, 
    "A", 
    each 
      let
        a = Text.From([Number]), 
        b = Number.RoundUp(List.Count(Text.ToList(a)) / 2), 
        c = Text.Combine(List.FirstN(Text.ToList(a), b)), 
        d = List.Transform(
          if Text.Length(a) <= 3 then
            {1 .. 3}
          else if Text.Length(a) > 3 and Number.From(Text.End(c, 1)) < Number.From(Text.At(a, b)) then
            {1 .. 3}
          else
            {0 .. 2}, 
          each Text.From(Number.From(c) + _)
            & (
              if Number.IsOdd(Text.Length(a)) then
                Text.Combine(
                  List.RemoveFirstN(Text.ToList(Text.Reverse(Text.From(Number.From(c) + _))))
                )
              else
                Text.Reverse(Text.From(Number.From(c) + _))
            )
        ), 
        e = Table.FromRows({List.Transform(d, each Number.From(_))})
      in
        e
  ), 
  Sol = Table.ExpandTableColumn(Process, "A", Table.ColumnNames(Process[A]{0}))
in
  Sol
Power Query solution 4 for Next Three Palindromes, proposed by Rafael González B.:
let
 Source = Table,
 Result = Table.AddColumn(Source, "Answer Expected", each 
 let
 N = [Number],
 A = List.Generate(
 () => [i = 0, L = {}, Nu = N],
 each [i] <= 3,
 each [
 i = if PN[c] then [i] + 1 else [i],
 L = if PN[c] then [L] & {PN[a]} else [L],
 PN = [ 
 a = Text.From([Nu] + 1),
 b = Text.Reverse(a),
 c = a = b
 ],
 Nu = Number.From(PN[a])
 ],
 each [L]
 ),
 B = Text.Combine(List.First(List.Select(A, each List.Count(_) = 3)), ", ")
 in
 B)[[Answer Expected]]
in
 Result
🧙🏻‍♂️🧙🏻‍♂️🧙🏻‍♂️
                    
                  
          
Power Query solution 5 for Next Three Palindromes, proposed by Francesco Bianchi 🇮🇹:
let
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  LG = Table.AddColumn(
    Source, 
    "List", 
    each List.Generate(
      () => [x = _[Number] + 1, y = 0], 
      each [y] < 3, 
      each [x = [x] + 1, y = if Text.From([x]) = Text.Reverse(Text.From([x])) then [y] + 1 else [y]], 
      each [x]
    )
  ), 
  Select = Table.AddColumn(
    LG, 
    "Custom", 
    each List.Select([List], each Text.From(_) = Text.Reverse(Text.From(_)))
  )[Custom], 
  Result = Table.FromRows(Select)
in
  Result
Power Query solution 6 for Next Three Palindromes, proposed by Renato Salazar:
let
  Fx = (Source) =>
    let
      Fx = (num) as table =>
        let
          a = List.Generate(
            () => [x = num, y = 0, z = false], 
            each [y] <= 3, 
            each [
              x = [x] + 1, 
              z = Text.From(x) = Text.Reverse(Text.From(x)), 
              y = if z then [y] + 1 else [y]
            ], 
            each {[x], [z]}
          ), 
          b = List.Select(a, (x) => x{1} = true), 
          c = List.Transform(b, (x) => x{0}), 
          d = Table.FromRows({c}, {"v1", "v2", "v3"})
        in
          d, 
      LG = Table.AddColumn(Source, "Values", (j) => Fx(j[Number])), 
      Res = Table.ExpandTableColumn(LG, "Values", {"v1", "v2", "v3"})
    in
      Res
in
  Fx
Power Query solution 7 for Next Three Palindromes, proposed by Renato Salazar:
let
 Origen = Table
 LG = Table.AddColumn(Table, "Values", each
 let
 a = List.Generate(
 ()=> [x= [Number], y=0, z= false],
 each [y] <= 3,
 each [x = [x] + 1,
 z=
 Text.From(x) = Text.Reverse(Text.From(x)),
 y = if z then [y] + 1 else [y]],
 each {[x],[z]} 
 ), 
 b = List.Select(a, each _{1} = true),
 c = List.Transform(b, each _{0}),
 d = Table.FromRows({c}, {"v1", "v2", "v3"}) 
 in d
 ),
 Res = Table.ExpandTableColumn(LG, "Values", {"v1", "v2", "v3"})
 in
 Res
                    
                  
          

Solving the challenge of Next Three Palindromes with Excel

Excel solution 1 for Next Three Palindromes, proposed by Bo Rydobon 🇹🇭:
=DROP(--REDUCE(0,A2:A10,LAMBDA(c,n,LET(l,LEN(n),a,LEFT(n,EVEN(l)/2)+{0,1,2,3},b,--(a&BYCOL(MID(a,-SORT(-SEQUENCE(l/2)),1),CONCAT)),VSTACK(c,TAKE(FILTER(b,b>n),,3))))),1)
Excel solution 2 for Next Three Palindromes, proposed by محمد حلمي:
=DROP(REDUCE(0,
    A2:A10,
    LAMBDA(a,
    v,
    VSTACK(a,
    
TAKE(TOROW(MAP(v+SEQUENCE(
    29000
),
    LAMBDA(x,
    
x/(x=--CONCAT(
    MID(
        x,
        10-SEQUENCE(
            9
        ),
        1
    )
)))),
    2),
    ,
    3)))),
    1)


=DROP(
    REDUCE(
        0,
        A2:A10,
        LAMBDA(
            a,
            v,
            LET(
                
                s,
                v+SEQUENCE(
                    ,
                    
                    29000
                ),
                VSTACK(
                    a,
                    TAKE(
                        FILTER(
                            s,
                            MAP(
                                s,
                                LAMBDA(
                                    x,
                                    
                                    x=--CONCAT(
    MID(
        x,
        10-SEQUENCE(
            9
        ),
        1
    )
)
                                )
                            )
                        ),
                        ,
                        3
                    )
                )
            )
        )
    ),
    1
)
Excel solution 3 for Next Three Palindromes, proposed by Julian Poeltl:
=DROP(REDUCE(1,
    A2:A10,
    LAMBDA(A,
    B,
    VSTACK(A,
    LET(R,
    10^(ROUNDUP((LEN(
        B
    )-1)/2,
    0))*1,
    1,
    P,
    LAMBDA(
        A,
        LET(
            S,
            A+SEQUENCE(
                R
            ),
            T,
            MAP(
                S,
                LAMBDA(
                    A,
                    LEFT(
                        A,
                        LEN(
                            A
                        )/2
                    )=CONCAT(
                        MID(
                            A,
                            SEQUENCE(
                                LEN(
                            A
                        )/2,
                                ,
                                LEN(
                            A
                        ),
                                -1
                            ),
                            1
                        )
                    )
                )
            ),
            XLOOKUP(
                TRUE,
                T,
                S
            )
        )
    ),
    HSTACK(
        P(
        B
    ),
        P(
            P(
        B
    )
        ),
        P(
            P(
            P(
        B
    )
        )
        )
    ))))),
    1)
Excel solution 4 for Next Three Palindromes, proposed by Timothée BLIOT:
=DROP(
    REDUCE(
        0,
        A2:A10,
        LAMBDA(
            w,
            v,
            LET(
                A,
                LEN(
                    v
                ),
                B,
                CEILING(
                    A/2,
                    1
                ),
                C,
                FLOOR(
                    A/2,
                    1
                ),
                D,
                LEFT(
                    v,
                    B
                )+{0,
                1,
                2,
                3},
                E,
                LEFT(
                    D,
                    C
                ),
                 F,
                --MAP(
                    D,
                    E,
                    LAMBDA(
                        x,
                        y,
                         CONCAT(
                             x,
                             MID(
                                 y,
                                 LEN(
                                     y
                                 )+1-SEQUENCE(
                                     LEN(
                                     y
                                 )
                                 ),
                                 1
                             )
                         )
                    )
                ),
                
                VSTACK(
                    w,
                    IF(
                        TAKE(
                            F,
                            ,
                            1
                        )>v,
                        TAKE(
                            F,
                            ,
                            3
                        ),
                        TAKE(
                            F,
                            ,
                            -3
                        )
                    )
                )
            )
        )
    ),
    1
)
Excel solution 5 for Next Three Palindromes, proposed by Pieter de B.:
=--DROP(
    REDUCE(
        "",
        A2:A10,
        LAMBDA(
            i,
            m,
            VSTACK(
                i,
                DROP(
                    REDUCE(
                        m,
                        SEQUENCE(
                            3
                        ),
                        LAMBDA(
                            n,
                            s,
                            LET(
                                a,
                                @TAKE(
                                    n,
                                    ,
                                    -1
                                ),
                                b,
                                LEN(
                                    a
                                )/2,
                                x,
                                LEFT(
                                    a,
                                    ROUND(
                                        b,
                                        
                                    )
                                ),
                                y,
                                IF(
                                    RIGHT(
                                    a
                                )
Excel solution 6 for Next Three Palindromes, proposed by Jaroslaw Kujawa:
=DROP(
    REDUCE(
         0;
         A2:A10;
        
        LAMBDA(
             a;
             z;
             LET(
                  x;
                  SEQUENCE(
                       ;
                       30000;
                       z+1
                  );
                 
                 y;
                  MAP(
                       x;
                       LAMBDA(
                            b;
                            IF(
                                 b<>1*CONCAT(
                                     MID(
                                          b;
                                          1+LEN(
                                               b 
                                          )-SEQUENCE(
                                               ;
                                               LEN(
                                               b 
                                          )
                                          );
                                          1 
                                     )
                                 );
                                 "NO";
                                 b 
                            )
                       )
                  );
                 
                 VSTACK(
                      a;
                      TAKE(
                          FILTER(
                               y ;
                               y<>"NO"
                          ) ;
                           ;
                           3
                      )
                 )
             )
        )
    ) ;
    1
)
Excel solution 7 for Next Three Palindromes, proposed by Bilal Mahmoud kh.:
=LET(
    chk,
    LAMBDA(
        x,
        --CONCAT(
            MID(
                x,
                SEQUENCE(
                    LEN(
                        x
                    ),
                    ,
                    LEN(
                        x
                    ),
                    -1
                ),
                1
            )
        )=x
    ),
    res,
    MAP(
        A2:A10,
        LAMBDA(
            n,
            TEXTJOIN(
                ",",
                TRUE,
                LET(
                    m,
                    MAP(
                        SEQUENCE(
                            100000,
                            ,
                            n
                        ),
                        &LAMBDA(
                            n,
                            IF(
                                chk(
                                    n
                                ),
                                n,
                                ""
                            )
                        )
                    ),
                    TAKE(
                        FILTER(
                            m,
                            m<>""
                        ),
                        3
                    )
                )
            )
        )
    ),
    TEXTSPLIT(
        TEXTJOIN(
            "-",
            ,
            res
        ),
        ",",
        "-"
    )
)

Solving the challenge of Next Three Palindromes with Python

Python solution 1 for Next Three Palindromes, proposed by Konrad Gryczan, PhD:
(Dynamic to have as many next as we ask for. Not looping (like Anshu Bantra), but working on structure of number)
import pandas as pd
path = "526 Next 3 Palindromes.xlsx"
input = pd.read_excel(path, usecols="A")
test = pd.read_excel(path, usecols="B:D", names=['res1', 'res2', 'res3'])
def get_next_palindromes(num, cnt):
 num = str(num)
 nc = len(num)
 
 fh = num[:nc // 2]
 mid = num[nc // 2]
 ld = num[nc // 2 - 1]
 fd = num[nc // 2 + 1]
 
 if nc % 2 == 0:
 next_fh = [str(int(fh) + i - (mid < ld)) for i in range(1, cnt + 1)]
 palindromes = [fh + fh[::-1] for fh in next_fh]
 else:
 next_fh = [str(int(fh + mid) + i - (fd < ld)) for i in range(1, cnt + 1)]
 palindromes = [fh + fh[::-1][1:] for fh in next_fh]
 
 return palindromes
result = input.assign(res=input['Number'].apply(lambda x: get_next_palindromes(x, 3))).explode('res').reset_index(drop=True)
result['rownum'] = result.groupby('Number').cumcount() + 1
result = result.pivot(index='Number', columns='rownum', values='res').add_prefix('res').reset_index(drop=True)
result = result.astype('int64')
result.columns.name = None
print(result.equals(test))  # True
                    
                  

Solving the challenge of Next Three Palindromes with Python in Excel

Python in Excel solution 1 for Next Three Palindromes, proposed by Alejandro Campos:
def is_palindrome(n):
 return str(n) == str(n)[::-1]
def next_palindromes(n, count=3):
 palindromes = []
 n += 1  # Empezamos con el siguiente número
 while len(palindromes) < count:
 if is_palindrome(n):
 palindromes.append(n)
 n += 1
 return palindromes
numbers = xl("A2:A10")[0]
data = {f' {num}': next_palindromes(num) for i, num in enumerate(numbers)}
df = pd.DataFrame(data).T
df
                    
                  
Python in Excel solution 2 for Next Three Palindromes, proposed by Anshu Bantra:
def palindromes(start, num=3):
 lst = []
 while num>0:
 start += 1
 if str(start) == str(start)[::-1]:
 lst.append(start)
 num -= 1
 return lst
df = xl("A1:A10", headers=True)
lst = [palindromes(_) for _ in df['Number'].values]
lst
                    
                  

&&

Leave a Reply