Home » List Palindromic Evil Numbers

List Palindromic Evil Numbers

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
                    
                  

&&

Leave a Reply