Work out the first 1000 Evil Numbers (at least 2 digits) which are Palindromic also. Evil Number – is a non-negative integer that has an even number of 1s in its binary representation. Palindromic Number – The number which is same even if read from backwards.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 464
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of List Palindromic Evil Numbers with Power Query
Power Query solution 1 for List Palindromic Evil Numbers, proposed by Bo Rydobon 🇹🇭:
let
Palin = List.Sort(
List.Transform(
List.Accumulate(
{1, 2},
List.Transform({"1" .. "9"}, each _ & _),
(s, l) =>
s
& List.Combine(
List.Combine(
List.Transform(
List.Select(s, each Text.Length(List.Last(s)) = Text.Length(_)),
(p) =>
List.Transform(
{"0" .. "9"},
(m) => {
Text.ReplaceRange(p, Text.Length(p) / 2, 0, m),
Text.ReplaceRange(p, Text.Length(p) / 2, 0, m & m)
}
)
)
)
)
),
Number.From
)
),
Bin = (n, b) =>
if n < 2 then
Text.From(n) & b
else
@Bin(Number.IntegerDivide(n, 2), Text.From(Number.Mod(n, 2)) & b),
Ans = List.FirstN(
List.Select(Palin, each Number.Mod(Text.Length(Text.Select(Bin(_, ""), "1")), 2) = 0),
1000
)
in
Ans
Power Query solution 2 for List Palindromic Evil Numbers, proposed by Aditya Kumar Darak 🇮🇳:
lete brute force
let
MyFun = ( Number as number, optional start ) =>
let
I = Number.IntegerDivide ( Number, 2 ),
M = Number.Mod ( Number, 2 ),
R = if Number = 1 then ( start ?? 0 ) + M else @MyFun ( I, ( start ?? 0 ) + M )
in
R,
Generate = List.Generate (
() => [ a = 9, c = false, d = 0, r = null ],
each [d] <= 1000,
each [
a = [a] + 1,
b = MyFun ( a ),
t = Text.From ( a ),
c = Number.IsEven ( b ) and t = Text.Reverse ( t ),
d = [d] + Number.From ( c ),
r = if [c] = true then [a] else null
],
each [r]
),
Return = List.RemoveNulls ( Generate )
in
Return
Power Query solution 3 for List Palindromic Evil Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Table.FromColumns({{1 .. 1000000}}),
EvilNum = Table.SelectRows(
Source,
each
let
a = Number.RoundDown(Number.Log([Column1], 2)),
b = List.Reverse({0 .. a}),
c = List.Transform(
b,
(x) => Number.Mod(Number.RoundDown([Column1] / Number.Power(2, x)), 2)
),
d = List.Count(List.Select(c, each _ = 1)),
e = Number.Mod(d, 2) = 0
in
e
),
Palimdromic = Table.FirstN(
Table.SelectRows(
EvilNum,
each [Column1] > 9 and Text.From([Column1]) = Text.Reverse(Text.From([Column1]))
),
1000
)
in
Palimdromic
Power Query solution 4 for List Palindromic Evil Numbers, proposed by Alexis Olson:
let
EvenPalindromes = List.Transform({1 .. 999}, each Text.From(_) & Text.Reverse(Text.From(_))),
OddPalindromes = List.Transform(
{10 .. 999},
each Text.From(_) & Text.Reverse(Text.RemoveRange(Text.From(_), 0))
),
Palindromes = List.Sort(
List.Transform(List.Combine({EvenPalindromes, OddPalindromes}), Number.From)
),
IsEvil = (n as number) as logical =>
[
BinLen = Number.RoundDown(Number.Log(n, 2)),
BinDigits = List.Transform({0 .. BinLen}, each Number.BitwiseAnd(n, Number.Power(2, _))),
OnesParity = Number.IsEven(List.Count(List.Select(BinDigits, each _ <> 0)))
][OnesParity],
Result = List.FirstN(List.Select(Palindromes, IsEvil), 1000)
in
Result
Power Query solution 5 for List Palindromic Evil Numbers, proposed by Brian Julius:
let
Source = Table.FromList({11 .. 1000000}, Splitter.SplitByNothing(), {"Number"}),
NonDist = Table.SelectRows(Source, each not List.IsDistinct(Text.ToList(Text.From([Number])))),
Pal = Table.TransformColumnTypes(
Table.SelectRows(
NonDist,
each Text.ToList(Text.From([Number])) = List.Reverse(Text.ToList(Text.From([Number])))
),
{"Number", Number.Type}
),
RUtilsToBin = R.Execute(
"library(R.utils)#(lf)df <- dataset#(lf)df$Num < -as.numeric(df$Number)#(lf)df$Binary <- sapply(df$Num, function(x) intToBin(x))#(lf)df",
[dataset = Pal]
),
Expand = Table.RemoveColumns(
Table.ExpandTableColumn(RUtilsToBin, "Value", {"Number", "Binary"}, {"Answer", "Binary"}),
"Name"
),
EvenOnes = Table.AddColumn(
Expand,
"OnesIsEven",
each Number.IsEven(Text.Length(Text.Remove([Binary], "0")))
),
Clean = Table.SelectColumns(Table.SelectRows(EvenOnes, each [OnesIsEven] = true), "Answer")
in
Clean
Power Query solution 6 for List Palindromic Evil Numbers, proposed by Ramiro Ayala Chávez:
let
A = {11 .. 1000000},
B = List.Select(A, each Text.From(_) = Text.Reverse(Text.From(_))),
C = Table.FromColumns({B}, {"Answer Expected"}),
Fx = (x) =>
let
a = Text.Combine(
List.Reverse(
List.Generate(
() => [i = x],
each [i] > 0,
each [i = Number.IntegerDivide([i], 2)],
each (Text.From(Number.Mod([i], 2)))
)
)
)
in
a,
b = Table.AddColumn(C, "P", each Fx([Answer Expected])),
c = Table.AddColumn(b, "C", each List.Count(Text.ToList(Text.Select([P], {"1"})))),
d = Table.SelectRows(
c,
each [C] = 2 or [C] = 4 or [C] = 6 or [C] = 8 or [C] = 10 or [C] = 12 or [C] = 14 or [C] = 16
),
Sol = Table.FirstN(d[[Answer Expected]], 1000)
in
Sol
Solving the challenge of List Palindromic Evil Numbers with Excel
Excel solution 1 for List Palindromic Evil Numbers, proposed by Bo Rydobon 🇹🇭:
=LET(
n,
SEQUENCE(
,
10,
0
),
TAKE(
SORT(
TOCOL(
MAP(
REDUCE(
DROP(
TOCOL(
n&n
),
1
),
{1,
2},
LAMBDA(
a,
v,
VSTACK(
a,
TOCOL(
IFS(
LEN(
a
)=MAX(
LEN(
a
)
),
REPLACE(
a,
LEN(
a
)/2+1,
,
HSTACK(
n,
n&n
)
)
),
3
)
)
)
),
LAMBDA(
m,
m/ISEVEN(
LEN(
SUBSTITUTE(
BASE(
m,
2
),
0,
)
)
)
)
),
3
)
),
1000
)
)
Excel solution 2 for List Palindromic Evil Numbers, proposed by Rick Rothstein:
=LET(
s,
SEQUENCE(
1000000,
,
10
),
f,
FILTER(
s,
ISEVEN(
LEN(
SUBSTITUTE(
BASE(
s,
2
),
0,
""
)
)
)
),
TAKE(
FILTER(
f,
f=0+SCAN(
"",
f,
LAMBDA(
a,
x,
CONCAT(
MID(
x,
LEN(
x
)-SEQUENCE(
LEN(
x
),
,
0
),
1
)
)
)
)
),
1000
)
)
Excel solution 3 for List Palindromic Evil Numbers, proposed by Rick Rothstein:
=TAKE(TOCOL(MAP(SEQUENCE(
1000000
)+9,
LAMBDA(A,
A/(ISEVEN(
LEN(
SUBSTITUTE(
BASE(
A,
2
),
0,
)
)
)*
(A=--CONCAT(
MID(
A,
9-SEQUENCE(
8
),
1
)
))))),
2),
1000)
Excel solution 4 for List Palindromic Evil Numbers, proposed by John V.:
=LET(s,
10+ROW(
1:980000
),
TOCOL(s/(s=--BYROW(
MID(
s,
7-COLUMN(
A:F
),
1
),
CONCAT
))/ISEVEN(
LEN(
SUBSTITUTE(
BASE(
s,
2
),
0,
)
)
),
2))
✅ Faster way:
=LET(s,
ROW(
1:10
)-1,
i,
LAMBDA(
n,
REDUCE(
n,
{1;2},
LAMBDA(
a,
v,
VSTACK(
a,
TOCOL(
s&TOROW(
a
)&s
)
)
)
)
),
u,
SORT(
UNIQUE(
--VSTACK(
i(
s
),
i(
s&s
)
)
)
),
TAKE(FILTER(u,
(u>9)*RIGHT(
u
)*ISEVEN(
LEN(
SUBSTITUTE(
BASE(
u,
2
),
0,
)
)
)),
1000))
Excel solution 5 for List Palindromic Evil Numbers, proposed by محمد حلمي:
=TOCOL(MAP(SEQUENCE(
50000
)+9,
LAMBDA(A,
A/(ISEVEN(
LEN(
SUBSTITUTE(
BASE(
A,
2
),
0,
)
)
)*
(A=--CONCAT(
MID(
A,
9-SEQUENCE(
8
),
1
)
))))),
2)
Excel solution 6 for List Palindromic Evil Numbers, proposed by Kris Jaganah:
=LET(a,
TEXT(
SEQUENCE(
1000
),
"#"
),
b,
MAP(
a,
LAMBDA(
x,
CONCAT(
MID(
x,
SEQUENCE(
LEN(
x
),
,
LEN(
x
),
-1
),
1
)
)
)
),
c,
SEQUENCE(
,
10,
0
),
d,
SORT(
UNIQUE(
--TOCOL(
VSTACK(
a&c&a,
a&c&b,
a&b
)
)
)
),
TAKE(TOCOL(d/((ISEVEN(
--LEN(
SUBSTITUTE(
BASE(
d,
2
),
0,
)
)
))*(--MAP(
d,
LAMBDA(
y,
CONCAT(
MID(
y,
SEQUENCE(
LEN(
y
),
,
LEN(
y
),
-1
),
1
)
)
)
)=d)),
3),
1000))
Excel solution 7 for List Palindromic Evil Numbers, proposed by Julian Poeltl:
=TAKE(
LET(
S,
SEQUENCE(
1000000,
,
10
),
IP,
MAP(
S,
LAMBDA(
A,
E_ISPalindrome(
A
)
)
),
B,
BASE(
S,
2
),
IE,
MAP(
B,
LAMBDA(
A,
ISEVEN(
SUM(
MID(
A,
SEQUENCE(
LEN(
A
)
),
1
)*1
)
)
)
),
FILTER(
S,
IE*IP
)
),
1000
)
E_ISPalindrome:
=LAMBDA(PAL?,
LET(Text,
PAL?,
L,
LEFT(Text,
ROUNDUP((LEN(
Text
)-1)/2,
0)),
r,
CONCAT(L_ReverseHorizontalArray(MID(RIGHT(Text,
ROUNDUP((LEN(
Text
)-1)/2,
0)),
SEQUENCE(,
LEN(RIGHT(Text,
ROUNDUP((LEN(
Text
)-1)/2,
0)))),
1))),
Res,
L=r,
Res))
L_ReverseHorizontalArray:
=LAMBDA(
Array,
TRANSPOSE(
INDEX(
TRANSPOSE(
Array
),
SEQUENCE(
ROWS(
TRANSPOSE(
Array
)
),
1,
ROWS(
TRANSPOSE(
Array
)
),
-1
),
SEQUENCE(
1,
COLUMNS(
TRANSPOSE(
Array
)
)
)
)
)
)
Excel solution 8 for List Palindromic Evil Numbers, proposed by Timothée BLIOT:
=LET(
S,
SEQUENCE(
10^6,
,
10
),
D,
FILTER(
S,
ISEVEN(
LEN(
SUBSTITUTE(
BASE(
S,
2
),
"0",
""
)
)
)
),
TAKE(
FILTER(
D,
MAP(
D,
LAMBDA(
x,
--CONCAT(
SORTBY(
MID(
x,
SEQUENCE(
LEN(
& x
)
),
1
),
SEQUENCE(
LEN(
x
)
),
-1
)
)=x
)
)
),
10^3
)
)
Excel solution 9 for List Palindromic Evil Numbers, proposed by Sunny Baggu:
=LET(
l,
SEQUENCE(
977779,
,
10
),
_s1,
MAP(
l,
LAMBDA(
a,
a = CONCAT(
MID(
a,
LEN(
a
) + 1 - SEQUENCE(
LEN(
a
)
),
1
)
) + 0
)
),
_s2,
MAP(
MAP(
l,
LAMBDA(
b,
BASE(
b,
2
)
)
),
LAMBDA(
c,
ISEVEN(
SUM(
--MID(
c,
SEQUENCE(
LEN(
c
)
),
1
)
)
)
)
),
TOCOL(l / (_s1 * _s2),
3)
)
Excel solution 10 for List Palindromic Evil Numbers, proposed by LEONARD OCHEA 🇷🇴:
=LET(s,
SEQUENCE(
980000,
,
10
),
TOCOL(s/MAP(s,
LAMBDA(a,
LET(c,
BASE(
a,
2
),
ISEVEN(
LEN(
c
)-LEN(
SUBSTITUTE(
c,
1,
""
)
)
)*(a&""=CONCAT(
MID(
a,
7-SEQUENCE(
6
),
1
)
))))),
2))
Excel solution 11 for List Palindromic Evil Numbers, proposed by Sandeep Marwal:
=LET(
series,
SEQUENCE(
1000000,
,
10
),
binary,
BYROW(
series,
LAMBDA(
a,
BASE(
a,
2
)
)
),
evencheck,
MAP(
binary,
LAMBDA(
b,
ISEVEN(
SUM(
--MID(
b,
SEQUENCE(
LEN(
b
)
),
1
)
)
)
)
),
reversecheck,
MAP(
series,
LAMBDA(
c,
c=--TEXTJOIN(
"",
,
MID(
c,
SEQUENCE(
LEN(
c
),
,
LEN(
c
),
-1
),
1
)
)
)
),
bothcheck,
evencheck*reversecheck,
TAKE(
FILTER(
series,
bothcheck
),
1000
)
)
Excel solution 12 for List Palindromic Evil Numbers, proposed by Tyler Cameron:
=TOCOL(
--MAP(
SEQUENCE(
977779,
,
10
),
LAMBDA(
x,
LET(
a,
INT(
LEN(
x
)/2
),
IF(
AND(
ISEVEN(
LEN(
SUBSTITUTE(
BASE(
x,
2
),
0,
""
)
)
),
LEFT(
x,
a
)=CONCAT(
MID(
x,
SEQUENCE(
,
a,
LEN(
x
),
-1
),
1
)
)
),
x,
""
)
)
)
),
3
)
Excel solution 13 for List Palindromic Evil Numbers, proposed by Erik Oehm:
=LET(
_TopN,
1000,
_NumbersToCheck,
SEQUENCE(
10 ^ 6,
,
10
),
fnIsEvil,
LAMBDA(
x,
ISEVEN(
LEN(
SUBSTITUTE(
BASE(
x,
2
),
"0",
""
)
)
)
),
fnReverse,
LAMBDA(
x,
CONCAT(
MID(
x,
SEQUENCE(
LEN(
x
),
,
LEN(
x
),
-1
),
1
)
)
),
fnIsPalindromic,
LAMBDA(
x,
x = VALUE(
fnReverse(
x
)
)
),
_IsBoth,
MAP(
_NumbersToCheck,
LAMBDA(
x,
AND(
fnIsPalindromic(
x
),
fnIsEvil(
x
)
)
)
),
_Result,
TAKE(
FILTER(
_NumbersToCheck,
_IsBoth
),
_TopN
),
_Result
)
Excel solution 14 for List Palindromic Evil Numbers, proposed by Moshe Moses, FCCA:
=A2)*1
Column D - FILTER(A2#,
(B2:B10001=0)*(C2:C10001=1))
Not the neatest but works (ish)
Excel solution 15 for List Palindromic Evil Numbers, proposed by Marek Tomanek:
=LET(
nums;
SEQUENCE(
999990;
;
10
);
revs;
MAP(
nums;
LAMBDA(
a;
--CONCAT(
MID(
a;
SEQUENCE(
LEN(
a
);
;
LEN(
a
);
-1
);
1
)
)
)
);
devs;
FILTER(revs;
(nums=revs)*(MOD(
LEN(
BASE(
revs;
2
)
)-LEN(
SUBSTITUTE(
BASE(
revs;
2
);
1;
""
)
);
2
)=0));
devs)
Solving the challenge of List Palindromic Evil Numbers with Python
Python solution 1 for List Palindromic Evil Numbers, proposed by Konrad Gryczan, PhD:
import pandas as pd
test = pd.read_excel("464 Palindromic Evil Numbers.xlsx", usecols="A")
is_palindromic = lambda x: str(x) == str(x)[::-1]
is_evil = lambda x: bin(x).count("1") % 2 == 0
range = range(10, 1000000)
result = [x for x in range if is_palindromic(x) and is_evil(x)][:1000]
print(result == test["Answer Expected"].tolist()) # True
Solving the challenge of List Palindromic Evil Numbers with Python in Excel
Python in Excel solution 1 for List Palindromic Evil Numbers, proposed by Abdallah Ally:
import pandas as pd
file_path = 'Excel_Challenge_464 - Palindromic Evil Numbers.xlsx'
df = pd.read_excel(file_path)
# Perform data wrangling
def evil_palindromic_numbers(n):
numbers = []
num = 10
while len(numbers) < n:
if num == int(str(num)[::-1]) and not bin(num).count('1') % 2:
numbers.append(num)
num += 1
return numbers
df['My Answer'] = evil_palindromic_numbers(1000)
df
Solving the challenge of List Palindromic Evil Numbers with R
R solution 1 for List Palindromic Evil Numbers, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
library(stringi)
library(r.utils)
test = read_excel('Excel/464 Palindromic Evil Numbers.xlsx', range = "A1:A1001")
is_palindromic = function(x) {
x_str <- as.character(x)
x_str == stri_reverse(x_str)
}
is_evil = function(x) {
str_count(intToBin(x),"1") %% 2 == 0
}
range = tibble(numbers = 1:1000000) %>%
mutate(palindromic = is_palindromic(numbers),
evil = is_evil(numbers)) %>%
filter(palindromic & evil) %>%
filter(numbers >= 10) %>%
head(1000)
all.equal(range$numbers, test$`Answer Expected`)
# [1] TRUE
Solving the challenge of List Palindromic Evil Numbers with Excel VBA
Excel VBA solution 1 for List Palindromic Evil Numbers, proposed by Rushikesh K.:
Sub FindEvilPalindromicNumbers()
Dim i As Long
Dim count As Long
Dim ep(1 To 1000) As Long
Dim num As Long
count = 0
num = 10
Do While count < 1000
If IsEvil(num) And IP(num) Then
count = count + 1
ep(count) = num
End If
num = num + 1
Loop
Dim outputSheet As Worksheet
Set outputSheet = ThisWorkbook.Sheets.Add
For i = 1 To 1000
outputSheet.Cells(i, 1).Value = ep(i)
Next i
End Sub
Function IsEvil(num As Long) As Boolean
Dim oC As Integer
Dim i As Integer
binaryStr = DecToBin(num)
oC = 0
For i = 1 To Len(binaryStr)
If Mid(binaryStr, i, 1) = "1" Then
oC = oC + 1
End If
Next i
IsEvil = (oC Mod 2 = 0)
End Function
Function DecToBin(ByVal num As Long) As String
Dim binaryStr As String
binaryStr = ""
Do While num > 0
binaryStr = CStr(num Mod 2) & binaryStr
num = num 2
Loop
If binaryStr = "" Then
binaryStr = "0"
End If
DecToBin = binaryStr
End Function
Function IP(num As Long) As Boolean
Dim numStr As String
Dim reversedStr As String
Dim i As Integer
numStr = CStr(num)
reversedStr = StrReverse(numStr)
IP = (numStr = reversedStr)
End Function
&&
