Home » Remove Digits for Largest Cube

Remove Digits for Largest Cube

For the largest cube number by removing minimum number of digits. If you remove a digit, all occurrences of that digits are removed. At least one digit need to be removed. So if the given number is a cubic number, that number itself will not be the answer. Ex. 7029 = 729 is largest cube which can be made by removing 0. 7030 = No possibility of a cube number. So answer is blank.

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

Solving the challenge of Remove Digits for Largest Cube with Power Query

_x000D_
Power Query solution 1 for Remove Digits for Largest Cube, proposed by Ahmed Ariem:
try
  Text.Combine(
    Splitter.SplitTextByAnyDelimiter(Text.Split([Removed Digits], ", "))(Text.From([Numbers]))
  )
otherwise
  null
_x000D_ _x000D_
Power Query solution 2 for Remove Digits for Largest Cube, proposed by Melissa de Korte:
Here's a Power Query approach
try Text.Remove( Number.ToText([Numbers]), List.Transform( Expression.Evaluate("{"&[Removed Digits] &"}"), Text.From )) otherwise null
_x000D_ _x000D_
Power Query solution 3 for Remove Digits for Largest Cube, proposed by Melissa de Korte:
let
  isCube = (txt as text) as logical =>
    [
      f = Number.Power(Number.FromText(txt), Value.Divide(1, 3, Precision.Decimal)), 
      a = Number.IntegerDivide(Number.Round(f, 9), 1) = Number.Round(f, 9)
    ][a], 
  Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content], 
  Answer = Table.AddColumn(
    Source, 
    "answer", 
    each [
      s = try
        Text.Remove(
          Number.ToText([Numbers]), 
          List.Transform(Expression.Evaluate("{" & [Removed Digits] & "}"), Text.From)
        )
      otherwise
        Text.From([Numbers]), 
      a = 
        if isCube(s) then
          s
        else
          [
            b = List.Transform({0 .. Text.Length(s) - 1}, (x) => Text.RemoveRange(s, x, 1)), 
            c = List.Max(List.Select(b, isCube))
          ][c]
    ][a]
  )
in
  Answer
_x000D_

Solving the challenge of Remove Digits for Largest Cube with Excel

_x000D_
Excel solution 1 for Remove Digits for Largest Cube, proposed by Bo Rydobon 🇹🇭:
=REDUCE(B2:C2,A3:A10,LAMBDA(h,n,LET(s,SEQUENCE(n^0.33)^3,
m,MAX(REGEXTEST(n,REGEXREPLACE(s,"d","$0.*"))*s),
VSTACK(h,IF(m,HSTACK(TEXTJOIN(", ",,UNIQUE(SORT(TOCOL(REGEXEXTRACT(n,"[^"&m&"]",1))))),m),{"",""})))))
_x000D_ _x000D_
Excel solution 2 for Remove Digits for Largest Cube, proposed by Bo Rydobon 🇹🇭:
=REDUCE(B2:C2,
    A3:A10,
    LAMBDA(h,
    n,
    LET(d,
    MID(
        n,
        SEQUENCE(
            LEN(
                n
            )
        ),
        1
    ),
    
q,
    DROP(
        REDUCE(
            0,
            d,
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    a&v
                )
            )
        ),
        -1
    )^(1/3),
    m,
    MAX((INT(
        q
    )=q)*q^3),
    
VSTACK(
    h,
    IF(
        m,
        HSTACK(
            TEXTJOIN(
                ", ",
                ,
                UNIQUE(
                    SORT(
                        REPT(
                            d,
                            ISERR(
                                FIND(
                                    d,
                                    m
                                )
                            )
                        )
                    )
                )
            ),
            m
        ),
        {"",
        ""}
    )
))))
_x000D_ _x000D_
Excel solution 3 for Remove Digits for Largest Cube, proposed by John V.:
=REDUCE(B2:C2,
    A3:A10,
    LAMBDA(c,
    y,
    LET(i,
    MID(
        y,
        SEQUENCE(
            LEN(
                y
            )
        ),
        1
    ),
    n,
    DROP(
        REDUCE(
            0,
            i,
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    a&v
                )
            )
        ),
        -1
    )^(1/3),
    b,
    MAX((n=INT(
        n
    ))*n^3),
    VSTACK(
        c,
        HSTACK(
            TEXTJOIN(
                ", ",
                ,
                UNIQUE(
                    SORT(
                        IF(
                            b*ISERR(
                                FIND(
                                    i,
                                    b
                                )
                            ),
                            i,
                            ""
                        )
                    )
                )
            ),
            IF(
                b,
                b,
                ""
            )
        )
    ))))
_x000D_ _x000D_
Excel solution 4 for Remove Digits for Largest Cube, proposed by محمد حلمي:
=REDUCE(B2:C2,
    A3:A10,
    LAMBDA(a,
    v,
    
VSTACK(a,
    LET(d,
    MID(
        v,
        SEQUENCE(
            LEN(
                v
            )
        ),
        1
    ),
    i,
    DROP(
        
        REDUCE(
            0,
            d,
            LAMBDA(
                a,
                v,
                VSTACK(
                    a,
                    a&v
                )
            )
        ),
        -1
    ),
    e,
    i^(1/3),
    
m,
    MAX((e=INT(
        e
    ))*i),
    IF(
        m,
        HSTACK(
            TEXTJOIN(
                ", ",
                ,
                
                SORT(
                    UNIQUE(
                        IF(
                            ISERR(
                                FIND(
                                    d,
                                    m
                                )
                            ),
                            d,
                            ""
                        )
                    )
                )
            ),
            m
        ),
        {"",
        ""}
    )))))
_x000D_ _x000D_
Excel solution 5 for Remove Digits for Largest Cube, proposed by Julian Poeltl:
=LET(R,
    TEXTSPLIT(TEXTJOIN("§",
    ,
    MAP(A3:A10,
    LAMBDA(N,
    LET(L,
    LEN(
        N
    ),
    SP,
    MID(
        N,
        SEQUENCE(
            L
        ),
        1
    ),
    B,
    BASE(
        SEQUENCE(
            2^L-1,
            ,
            2
        )-1,
        2,
        L
    ),
    M,
    MAP(
        B,
        LAMBDA(
            A,
            LET(
                BS,
                --MID(
                    A,
                    SEQUENCE(
            L
        ),
                    1
                ),
                C,
                IF(
                    BS,
                    "",
                    SP
                ),
                S,
                UNIQUE(
                    IF(
                        BS,
                        SP,
                        ""
                    )
                ),
                TEXTJOIN(
                    ", ",
                    ,
                    SORT(
                        S
                    )
                )&"|"&CONCAT(
                    C
                )
            )
        )
    ),
    AS,
    MAP(M,
    LAMBDA(A,
    LET(TB,
    TEXTBEFORE(
        A,
        "|"
    ),
    TA,
    --TEXTAFTER(
        A,
        "|"
    ),
    IF((SUM(
        --ISNUMBER(
            SEARCH(
                --TEXTSPLIT(
                    TB,
                    ", "
                ),
                --TA
            )
        )
    )=0)*(INT(TA^(1/3)=INT(TA^(1/3)))),
    A,
    0)))),
    TA,
    IFERROR(
        --TEXTAFTER(
            AS,
            "|"
        ),
        0
    ),
    IFERROR(
        XLOOKUP(
            "*|"&MAX(
                TA
            ),
            AS,
            AS,
            ,
            2
        ),
        "|"
    ))))),
    "|",
    "§"),
    IFERROR(
        HSTACK(
            TAKE(
                R,
                ,
                1
            ),
            --TAKE(
                R,
                ,
                -1
            )
        ),
        ""
    ))
_x000D_ _x000D_
Excel solution 6 for Remove Digits for Largest Cube, proposed by Timothée BLIOT:
=LET(D,DROP,U,UNIQUE,S,SEQUENCE,r,REDUCE,L,LEN,v,VSTACK,Hs,HSTACK,F,FILTER,Tk,TAKE,D(r(0,A3:A10,LAMBDA(m,n,LET(A,D(U(--r(Hs(n,""),S(MIN(ROWS(U(MID(n,S(L(n)),1)))-1,IF(L(n)>9,3,5))),LAMBDA(w,z,LET(B,F(w,L(Tk(w,,-1))=MAX(L(Tk(w,,-1)))),C,D(r(0,Tk(B,,1),LAMBDA(y,x,v(y,D(r(0,U(MID(x,S(L(x)),1)),LAMBDA(j,i,v(j,Hs(SUBSTITUTE(x,i,""),IFERROR(INDEX(B,XMATCH(x,Tk(B,,1)),2),"")&i)))),1)))),1),v(w,C))))),1),E,Tk(SORT(F(A,Tk(A,,1)^(1/3)=INT(Tk(A,,1)^(1/3))),2),1),v(m,IFERROR(Hs(TEXTJOIN(", ",,SORT(--MID( Tk(E,,-1),S(@L(Tk(E,,-1))),1))),Tk(E,,1)),{"",""}))))),1))
_x000D_ _x000D_
Excel solution 7 for Remove Digits for Largest Cube, proposed by Bilal Mahmoud kh.:
=TEXTSPLIT(TEXTJOIN("-",
    ,
    MAP(A2:A9,
    LAMBDA(m,
    LET(d,
    LET(
        a,
        UNIQUE(
            MID(
                m,
                SEQUENCE(
                    LEN(
                        m
                    )
                ),
                1
            )
        ),
        b,
        REDUCE(
            a,
            a,
            LAMBDA(
                x,
                y,
                VSTACK(
                    x,
                    x&","&y
                )
            )
        ),
        b
    ),
    e,
    MAP(
        d,
        LAMBDA(
            z,
            REDUCE(
                m,
                TEXTSPLIT(
                    z,
                    ","
                ),
                LAMBDA(
                    x,
                    y,
                    SUBSTITUTE(
                        INDEX(
                            x,
                            COUNTA(
                                x
                            ),
                            1
                        ),
                        y,
                        ""
                    )
                )
            )
        )
    ),
    f,
    LET(
        n,
        IFERROR(
            POWER(
                e,
                1/3
            ),
            0
        ),
        IF(
            INT(
                n
            )=n,
            n,
            ""
        )
    ),
    r,
    FILTER(d,
    (f=MAX(
        f
    ))*(f>0),
    0),
    q,
    FILTER(e,
    (f=MAX(
        f
    ))*(f>0),
    0),
    h,
    TEXTJOIN(
        ",",
        ,
        SORT(
            UNIQUE(
                TOCOL(
                    TEXTSPLIT(
                        TEXTJOIN(
                            ",",
                            ,
                            r
                        ),
                        ","
                    )
                )
            )
        )
    ),
    u,
    TEXTJOIN(
        ",",
        ,
        SORT(
            UNIQUE(
                TOCOL(
                    --TEXTSPLIT(
                        TEXTJOIN(
                            ",",
                            ,
                            q
                        ),
                        ","
                    )
                )
            )
        )
    ),
    h&"|"&IFERROR(
        u,
        ""
    ))))),
    "|",
    "-")
_x000D_ _x000D_
Excel solution 8 for Remove Digits for Largest Cube, proposed by Eddy Wijaya:
=DROP(REDUCE(0,
    A3:A10,
    LAMBDA(a,
    v,
    
VSTACK(a,
    IFERROR(LET(
split,
    MID(
        v,
        SEQUENCE(
            LEN(
                v
            )
        ),
        1
    ),
    
listComb,
    
DROP(
    VALUE(
        REDUCE(
            0,
            split,
            LAMBDA(
                x,
                y,
                
                VSTACK(
                    x,
                    x&y
                )
            )
        )
    ),
    1
),
    
cubeRoot,
    POWER(
        listComb,
        1/3
    ),
    
dbComb,
    IFNA(
        HSTACK(
            listComb,
            v,
            cubeRoot
        ),
        v
    ),
    
filterdbComb,
     FILTER(dbComb,
     ( TAKE(
         dbComb,
         ,
         1
     )<>CHOOSECOLS(
         dbComb,
         2
     ) ) * (TAKE(
         dbComb,
         ,
         -1
     )<>ROUND(
         POWER(
             TAKE(
         dbComb,
         ,
         -1
     ),
             1/3
         ),
         10
     )^3)),
    
adjCubeRoot,
    TAKE(
        filterdbComb,
        ,
        -1
    ),
    
MaxCubeRoot,
    POWER(
        MAX(
            FILTER(
                adjCubeRoot,
                adjCubeRoot=INT(
                    adjCubeRoot
                )
            )
        ),
        3
    ),
    
splitLargeCubeNumber,
    MID(
        MaxCubeRoot,
        SEQUENCE(
            LEN(
                MaxCubeRoot
            )
        ),
        1
    ),
    
RemoveDigits,
    TEXTJOIN(
        ",",
        TRUE,
        SORT(
            UNIQUE(
                FILTER(
                    split,
                    ISNA(
                        VLOOKUP(
                            split,
                            splitLargeCubeNumber,
                            1,
                            0
                        )
                    )
                )
            ),
            1,
            1
        )
    ),
    
HSTACK(
    RemoveDigits,
    MaxCubeRoot
)),
    {"",
    ""})))),
    1)
_x000D_ _x000D_
Excel solution 9 for Remove Digits for Largest Cube, proposed by El Badlis Mohd Marzudin:
=IFNA(TEXTSPLIT(TEXTJOIN(";",0,MAP(A3:A10,LAMBDA(z,LET(f,LAMBDA(w,MID(w,SEQUENCE(LEN(w)),1)),a,DROP(DROP(REDUCE("",f(z),LAMBDA(x,y,VSTACK(x,(x&y)+0))),1),-1),b,a^(1/3),c,MAX(FILTER(a,b=INT(b))),d,UNIQUE(SORT(FILTER(f(z),NOT(ISNUMBER(XMATCH(f(z),f(c))))))),IFERROR(TEXTJOIN(",",,d)&"|"&c,""))))),"|",";"),"")
_x000D_

Solving the challenge of Remove Digits for Largest Cube with Python

_x000D_
Python solution 1 for Remove Digits for Largest Cube, proposed by Konrad Gryczan, PhD:
import pandas as pd
import numpy as np
import itertools
path = "502 Remove Minimum Digits to Make a Cube.xlsx"
input = pd.read_excel(path, usecols="A", skiprows= 1)
test = pd.read_excel(path, usecols="B:C", skiprows= 1)
def cube_number(number):
 str_nums = list(str(number))
 digits_combinations = ["".join(comb) for i in range(1, len(str_nums)) for comb in itertools.combinations(str_nums, i)]
 all_combinations = [comb for comb in digits_combinations if round(int(comb) ** (1/3)) ** 3 == int(comb)]
 
 if all_combinations:
 cube = max(all_combinations, key=int)
 digits_left = list(set(str_nums) - set(str(cube)))
 unique_digits = list(set(digits_left))
 return [unique_digits, int(cube)]
 else:
 return [np.NaN, np.NaN]
result = input.copy()
result["Output"] = result["Numbers"].apply(cube_number)
result[["Removed Digits", "Cube Number"]] = result["Output"].apply(lambda x: pd.Series([x[0], x[1]]))
result["Removed Digits"] = result["Removed Digits"].apply(lambda x: ", ".join(sorted(x)) if isinstance(x, list) else x)
result = result.drop(columns=["Numbers", "Output"]).reset_index(drop=True)
print(result.equals(test)) # True
                    
                  
_x000D_

Solving the challenge of Remove Digits for Largest Cube with Python in Excel

_x000D_
Python in Excel solution 1 for Remove Digits for Largest Cube, proposed by Abdallah Ally:
from itertools import combinations
def cube_number(number):
 str_nums = list(str(number))
 cube = 0
 for n in range(len(str_nums) - 1, 0, -1):
 if cube: break
 for comb in &combinations(sorted(str_nums, reverse=True) if n == 1 else str_nums, n):
 num = int(''.join(comb))
 cube_root = round(num ** (1/3), 9)
 if cube_root == int(cube_root):
 cube = num
 break
 digits = [x for x in str_nums if x not in str(cube)]
 unique = sorted([x for key, x in enumerate(digits) if digits[: key + 1].count(x) == 1])
 return (', '.join(unique), cube) if cube else ('', '')
df = xl("A2:C10", headers=True)
# Perform data wrangling
df[['My Removed Digits', 'My Cube Number']] = df['Numbers'].map(cube_number).tolist()
df = df.fillna('')
df
                    
                  
_x000D_ &&

Leave a Reply