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
&&
