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
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
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
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),{"",""})))))
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
),
{"",
""}
)
))))
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,
""
)
)
))))
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
),
{"",
""}
)))))
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
)
),
""
))
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))
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,
""
))))),
"|",
"-")
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)
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,""))))),"|",";"),"")
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
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
