Yesterday, I ended up posting a complex challenge. This deterred many persons from answering it. So, let’s reduce the complexity back to normal. Find the count of those numbers between From and To which 1. Are odd 2. Have unique digits. 1076 has unique digits whereas 1071 is not having unique digits as 1 gets repeated. Hence for range 150 to 170, odd numbers are 151, 153, 155, 157, 159, 161, 163, 165, 167, 169. 151, 155, 161 are not having unique digits. Hence answer would be 7.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 97
Challenge Difficulty: ⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Count Unique Odd Digit Numbers with Power Query
Power Query solution 1 for Count Unique Odd Digit Numbers, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Custom1 = Table.AddColumn(
Source,
"Count",
each List.Count(
List.Select(
{[From] .. [To]},
each List.Distinct(Text.ToList(Number.ToText(_)))
= Text.ToList(Number.ToText(_)) and Number.IsOdd(_)
)
)
)[[Count]]
in
Custom1Power Query solution 2 for Count Unique Odd Digit Numbers, proposed by Luan Rodrigues:
let
Fonte = Data,
a = Table.AddColumn(
Fonte,
"Personalizar",
each [a = {[From] .. [To]}, b = List.Select(a, each Number.IsOdd(_))][b]
),
b = Table.ExpandListColumn(a, "Personalizar"),
c = Table.AddColumn(
b,
"Personalizar.1",
each [
a = Text.ToList(Text.From([Personalizar])),
b = List.Count(a),
c = List.Count(List.Distinct(a)),
d = List.Select({b = c}, each b = c = true){0}?
][d]
),
d = Table.SelectRows(c, each ([Personalizar.1] = true)),
Result = Table.Group(d, {"From", "To"}, {{"Contagem", each Table.RowCount(_)}})
in
ResultPower Query solution 3 for Count Unique Odd Digit Numbers, proposed by Bhavya Gupta:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
ExpectedOutput = Table.AddColumn(
Source,
"Custom",
each List.Count(
List.Select(
{[From] .. [To]},
each List.IsDistinct(Text.ToList(Text.From(_))) and Number.IsOdd(_)
)
)
)
in
ExpectedOutputPower Query solution 4 for Count Unique Odd Digit Numbers, proposed by Matthias Friedmann:
let
Source = Excel.CurrentWorkbook(){[Name = "FromTo"]}[Content],
#"Added Custom" = Table.AddColumn(
Source,
"Count",
each List.Count(
List.Select(
{[From] .. [To]},
each [
a = Text.ToList(Text.From(_)),
b = not Number.IsEven(_) and a = List.Distinct(a)
][b]
)
)
)[[Count]]
in
#"Added Custom"
With Bhavya Gupta's elements:
let
Source = Excel.CurrentWorkbook(){[Name = "FromTo"]}[Content],
#"Added Custom" = Table.AddColumn(
Source,
"Count",
each List.Count(
List.Select(
{[From] .. [To]},
each Number.IsOdd(_) and List.IsDistinct(Text.ToList(Text.From(_)))
)
)
)[[Count]]
in
#"Added Custom"
Power Query solution 5 for Count Unique Odd Digit Numbers, proposed by Jan Willem Van Holst:
let
FXdigitUnique = (x) =>
let
s1 = Text.ToList(Number.ToText(x)),
s2 = List.Distinct(s1),
s3 = List.Count(s1) = List.Count(s2)
in
s3,
Source = Table.FromRows(
Json.Document(
Binary.Decompress(
Binary.FromText(
"i45WMlTSUTIyABKWSrE6QK6BAVgARBobgYUsjU2AHEMDC5CYiSFYzNjIGKQFBEByppZAI2JjAQ==",
BinaryEncoding.Base64
),
Compression.Deflate
)
),
let
_t = ((type nullable text) meta [Serialized.Text = true])
in
type table [From = _t, To = _t, Count = _t]
),
#"Changed Type" = Table.TransformColumnTypes(
Source,
{{"From", Int64.Type}, {"To", Int64.Type}, {"Count", Int64.Type}}
),
Result = Table.AddColumn(
#"Changed Type",
"Result",
each
let
listOfNumbers = {[From] .. [To]},
listOfOddNumbers = List.Select(listOfNumbers, Number.IsOdd),
listOfUniqueNumber = List.Select(listOfNumbers, FXdigitUnique),
intersectedNumbers = List.Intersect({listOfOddNumbers, listOfUniqueNumber})
in
List.Count(intersectedNumbers)
)
in
ResultSolving the challenge of Count Unique Odd Digit Numbers with Excel
Excel solution 1 for Count Unique Odd Digit Numbers, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A5,B2:B5,LAMBDA(a,b,COUNT(MAP(SEQUENCE(b-a+1,,a),LAMBDA(s,IF(MOD(s,2),1/(ROWS(UNIQUE(MID(s,SEQUENCE(LEN(s)),1)))=LEN(s))))))))
Excel solution 2 for Count Unique Odd Digit Numbers, proposed by Rick Rothstein:
=MAP(A2:A5,B2:B5,LAMBDA(a,b,LET(s,SEQUENCE((b-a+1)/2,,a+ISEVEN(a),2),SUM(MAP(s,LAMBDA(x,LET(u,UNIQUE(MID(x,SEQUENCE(LEN(x)),1)),0+(COUNT(-u)=LEN(x)))))))))
Excel solution 3 for Count Unique Odd Digit Numbers, proposed by John V.:
=MAP(A2:A5,B2:B5,LAMBDA(a,b,SUM(MAP(SEQUENCE(1+b-a,,a),LAMBDA(x,LET(m,MID(x,SEQUENCE(LEN(x)),1),u,UNIQUE(m),(COUNTA(m)=COUNTA(u))*ISODD(x)))))))
Excel solution 4 for Count Unique Odd Digit Numbers, proposed by Zoran Milokanović:
= LEN(REPLACE(RL.NUM_TEXT, '3', '')) + CASE WHEN CHARINDEX('3', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '4', '')) + CASE WHEN CHARINDEX('4', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '5', '')) + CASE WHEN CHARINDEX('5', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '6', '')) + CASE WHEN CHARINDEX('6', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '7', '')) + CASE WHEN CHARINDEX('7', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '8', '')) + CASE WHEN CHARINDEX('8', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
AND LEN(RL.NUM_TEXT) = LEN(REPLACE(RL.NUM_TEXT, '9', '')) + CASE WHEN CHARINDEX('9', RL.NUM_TEXT) = 0 THEN 0 ELSE 1 END
THEN 'YES'
ELSE 'NO'
END = 'YES'
THEN 1
ELSE 0
END
) AS "COUNT"
FROM DATA_PREPARATION DP
JOIN RANGE_LIMIT RL ON RL.NUM BETWEEN DP."FROM" AND DP."TO"
GROUP BY
DP.ORDINAL_NUMBER
,DP."FROM"
,DP."TO"
ORDER BY
DP.ORDINAL_NUMBER
OPTION (MAXRECURSION 1000)
Excel solution 5 for Count Unique Odd Digit Numbers, proposed by محمد حلمي:
=MAP(A2:A5,B2:B5,LAMBDA(a,b,SUM(MAP(
SEQUENCE(b-a+1,,a),LAMBDA(r,
(COUNT(FIND(ROW(1:10)-1,r))=LEN(r))*ISODD(r))))))
Excel solution 6 for Count Unique Odd Digit Numbers, proposed by محمد حلمي:
=MAP(A2:A5,B2:B5,LAMBDA(a,b,SUM(--(MAP(SEQUENCE(b-a+1,,a),LAMBDA(r, AND(COUNT(SEARCH(ROW(1:10)-1,r))=LEN(r),ISODD(r))))))))
Excel solution 7 for Count Unique Odd Digit Numbers, proposed by محمد حلمي:
=MAP(
A2:A5,B2:B5,
LAMBDA(a,b,
SUM(--(
MAP(SEQUENCE(b-a+1,,a),LAMBDA(r, AND(
LEN(CONCAT(UNIQUE(MID(r,SEQUENCE(LEN(r)),1))))=LEN(r),
ISODD(r))))))))
Excel solution 8 for Count Unique Odd Digit Numbers, proposed by Kris Jaganah:
=LET(a,A2:A5,b,B2:B5,c,MAP(a,b,LAMBDA(p,q,SUM(BYROW(SEQUENCE(q-p+1,,p,1), LAMBDA(x,MOD(x,2)*(--(LEN(x)=LEN(TEXTJOIN("",TRUE,UNIQUE(MID(x,SEQUENCE(,5),1),TRUE)))))))))),c)
Excel solution 9 for Count Unique Odd Digit Numbers, proposed by Julian Poeltl:
=MAP(
A2:A5,
B2:B5,
LAMBDA(
F,
T,
LET(
S,
SEQUENCE(
T-F+1,
,
F
),
SUM(
--ISODD(
S
)*MAP(
S,
LAMBDA(
A,
ROWS(
UNIQUE(
MID(
A,
SEQUENCE(
LEN(
A
)
),
1
)
)
)=LEN(
A
)
)
)
)
)
)
)
Excel solution 10 for Count Unique Odd Digit Numbers, proposed by Aditya Kumar Darak 🇮🇳:
=MAP(
A1:A4,
B1:B4,
LAMBDA(
a,
b,
LET(
_s,
SEQUENCE(
b - a,
,
a
),
_e,
LAMBDA(
x,
AND(
ISODD(
x
),
COUNT(
FIND(
SEQUENCE(
10,
,
0
),
x
)
) = LEN(
x
)
)
),
_c,
MAP(
_s,
_e
),
_r,
SUM(
N(
_c
)
),
_r
)
)
)
Excel solution 11 for Count Unique Odd Digit Numbers, proposed by Timothée BLIOT:
=LET(Data,
A2:B5,
Odds,
LAMBDA(
a,
b,
FILTER(
SEQUENCE(
b-a+1,
,
a
),
ISODD(
SEQUENCE(
b-a+1,
,
a
)
)
)
),
UniqDigits,
LAMBDA(a,
--(ROWS(
MID(
a,
SEQUENCE(
LEN(
a
)
),
1
)
)= ROWS(
UNIQUE(
MID(
a,
SEQUENCE(
LEN(
a
)
),
1
)
)
))),
MAP(
SEQUENCE(
ROWS(
Data
)
),
LAMBDA(
x,
SUM(
MAP(
Odds(
INDEX(
Data,
x,
1
),
INDEX(
Data,
x,
2
)
),
LAMBDA(
a,
UniqDigits(
a
)
)
)
)
)
) )
Excel solution 12 for Count Unique Odd Digit Numbers, proposed by Stefan Olsson:
=MAP(A2:A5, B2:B5, LAMBDA(_f, _t, COUNTIFS(MAP(SEQUENCE((_t-_f+1)/2, 1, _f+ISEVEN(_f), 2), LAMBDA(x, (LEN(x)=COUNTA(UNIQUE(SPLIT(REGEXREPLACE(x&"", "(.)", "$1|"), "|"), TRUE))))), TRUE)))
Excel solution 13 for Count Unique Odd Digit Numbers, proposed by Victor Momoh (MVP, MOS, R.Eng):
=MAP(A2:A5,B2:B5,
LAMBDA(x,y,
LET(a,SEQUENCE(y-x+1,,x),
SUM(--MAP(a,LAMBDA(x,ISODD(x)*(COUNTA(UNIQUE(MID(x,SEQUENCE(LEN(x)),1)))=
LEN(x))))))))
Excel solution 14 for Count Unique Odd Digit Numbers, proposed by Guillermo Arroyo:
= BYROW(
A2:B5,
LAMBDA(
y,
LET(
_list,
SEQUENCE(INDEX(y, , 2) - INDEX(y, , 1) + 1, , INDEX(y, , 1), 1),
_Unique,
MAP(
_list,
LAMBDA(
x,
COLUMNS(UNIQUE(MID(x, SEQUENCE(, LEN(x)), 1), 1)) = LEN(x))),
_ODD,
ISODD(_list),
ROWS(FILTER(_list, _Unique * _ODD)))))
Excel solution 15 for Count Unique Odd Digit Numbers, proposed by roberto mensa:
=SUM(--(LEN(SEQUENCE((B2-A2+1)/2,
,
ODD(
A2-1
),
2))=MMULT(ISNUMBER(FIND(SEQUENCE(
,
10,
0,
),
SEQUENCE((B2-A2+1)/2,
,
ODD(
A2-1
),
2)))*1,
SEQUENCE(
10,
,
,
0
))))
Excel solution 16 for Count Unique Odd Digit Numbers, proposed by roberto mensa:
=SUM(--(LEN(ROW(OFFSET($A$1,A2-1,,(B2-A2+1)/2))*2-ODD(A2-1))=MMULT(ISNUMBER(FIND(COLUMN(A:J)-1,ROW(OFFSET($A$1,A2-1,,(B2-A2+1)/2))*2-ODD(A2-1)))*1,ROW($1:$10)^0)))
Excel solution 17 for Count Unique Odd Digit Numbers, proposed by Mohammad Afrooz:
=SUM(BYROW(SEQUENCE((B38-A38)+1,
1,
A38,
1),
LAMBDA(b,
if(ISODD(
b
),
(LAMBDA(
a,
if(
len(
text(
a,
"#"
)
)=count(
unique(
SPLIT(
REGEXREPLACE(
a,
"(.)",
"$1|"
),
"|",
true
),
true
)
),
true,
false
)
)(text(
b,
"#"
)))*1,
0))))
Solving the challenge of Count Unique Odd Digit Numbers with Python
Python solution 1 for Count Unique Odd Digit Numbers, proposed by &Igor Perković:
import pandas as pd
# SOURCE
df = pd.read_excel('C97.xlsx')
# Processing
acc = {}
for e,r in enumerate(df.values.tolist()):
tmp=[]
for i in range(r[0], r[1]+1):
if i%2 != 0:
sn = str(i)
if sn not in tmp and len(set(sn))==len(str(i)):
tmp.append(sn)
acc[e] = len(tmp)
df['Check'] = [v for k,v in acc.items()]
# Result
print(df.to_string(index=False))
Solving the challenge of Count Unique Odd Digit Numbers with Python in Excel
Python in Excel solution 1 for Count Unique Odd Digit Numbers, proposed by Alejandro Campos:
results = pd.DataFrame([
{'From': f, 'To': t, 'Count': sum(n % 2 and len(set(str(n))) == len(str(n)) for n in range(f, t + 1))}
for f, t in [(1, 20), (100, 200), (934, 1080), (323, 99999)]])
Solving the challenge of Count Unique Odd Digit Numbers with SQL
SQL solution 1 for Count Unique Odd Digit Numbers, proposed by Zoran Milokanović:
1/2
WITH -- Microsoft SQL Server 2019
DATA
AS
(
SELECT 1 AS "FROM", 20 AS "TO" UNION ALL
SELECT 100 AS "FROM", 200 AS "TO" UNION ALL
SELECT 934 AS "FROM", 1080 AS "TO" UNION ALL
SELECT 323 AS "FROM", 99999
),
DATA_PREPARATION
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY ORDERING) AS ORDINAL_NUMBER
,T."FROM"
,T."TO"
FROM
(
SELECT
1 AS ORDERING
,D."FROM"
,D."TO"
FROM DATA D
) T
),
COUNTERS
AS
(
SELECT 1 AS NUM
UNION ALL
SELECT
C.NUM + 1 AS NUM
FROM COUNTERS C
WHERE
C.NUM < 1000
),
RANGE_LIMIT
AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY C1.NUM) AS NUM
,CAST(ROW_NUMBER() OVER (ORDER BY C1.NUM) AS VARCHAR) AS NUM_TEXT
FROM COUNTERS C1
CROSS JOIN COUNTERS C2
)
SELECT
DP."FROM"
,DP."TO"
,SUM
(
CASE
CASE
