This is the 3rd in series of Caesar’s Cipher Challenges. I had published 2 challenges on Caesar’s Cipher earlier (links at the bottom of the post) and this is the 3rd one. Shift each alphabet and number by values given in column B. If Shift value is 2, In case of alphabets – then A>C, B>D….Y>A, Z>B In case of numbers – then 0>2, 3>5, 9-1 0 means no shift. After Shift value of 25 in case of alphabets and 9 in case of numbers, same cycle repeats itself. Hence, shift of 26, 52, 78… is equal to shift of 0 in case of alphabets and 10, 20, 30… is equal to 0 in case of numbers. A character other than alphabet and number should not be shifted. – Earlier challenges on this topic – This challenge dealt with Caesar’s shift for numbers. This challenge dealt with Caesar’s shift for alphabets.
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 103
Challenge Difficulty: ⭐️⭐️⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Caesar Cipher Multi Shift with Power Query
Power Query solution 1 for Caesar Cipher Multi Shift, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Rs = Table.TransformRows(
Source,
each Text.Combine(
List.Transform(
Text.ToList([Text]),
(t) =>
let
UL = {"A" .. "Z", "A" .. "Z", "a" .. "z", "a" .. "z"},
Nc = {"0" .. "9", "0" .. "9"},
U = List.PositionOf(UL, t),
N = List.PositionOf(Nc, t)
in
if U >= 0 then
UL{U + Number.Mod([Shift], 26)}
else if N >= 0 then
Nc{N + Number.Mod([Shift], 10)}
else
t
)
)
)
in
Rs
Power Query solution 2 for Caesar Cipher Multi Shift, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Solucion = Table.AddColumn(
Source,
"Expected Answer",
each
let
a = _,
b = Number.Mod(a[Shift], 26),
y = Number.Mod(a[Shift], 10),
c = {"A" .. "Z"},
d = {"a" .. "z"},
z = {"0" .. "9"},
e = Text.ToList(a[Text]),
f = Text.Combine(
List.Transform(
e,
each
if List.Contains(c, _) then
c{Number.Mod(List.PositionOf(c, _) + b, 26)}
else if not List.Contains(d, _) and not List.Contains(z, _) then
_
else if List.Contains(z, _) then
z{Number.Mod(List.PositionOf(z, _) + y, 10)}
else
d{Number.Mod(List.PositionOf(d, _) + b, 26)}
),
""
)
in
f
)[[Expected Answer]]
in
Solucion
Power Query solution 3 for Caesar Cipher Multi Shift, proposed by Matthias Friedmann:
let
Source = Excel.CurrentWorkbook(){[Name = "CharacterShift"]}[Content],
#"Added Custom" = Table.AddColumn(
Source,
"Result",
each [
a = [Shift],
b = List.Transform(
Text.ToList([Text]),
each
if List.Contains({"0" .. "9"}, _) then
{"0" .. "9"}{Number.Mod(List.PositionOf({"0" .. "9"}, _) + a, 10)}
else if List.Contains({"A" .. "Z"}, _) then
{"A" .. "Z"}{Number.Mod(List.PositionOf({"A" .. "Z"}, _) + a, 26)}
else if List.Contains({"a" .. "z"}, _) then
{"a" .. "z"}{Number.Mod(List.PositionOf({"a" .. "z"}, _) + a, 26)}
else
_
),
c = Text.Combine(b)
][c]
)[[Result]]
in
#"Added Custom"
Power Query solution 4 for Caesar Cipher Multi Shift, proposed by Krzysztof Kominiak:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Result = Table.AddColumn(
Source,
"Expected Answer",
each [
a = {"A" .. "Z"} & {"a" .. "z"} & {"0" .. "9"},
sl = Number.Mod([Shift], 26),
sn = Number.Mod([Shift], 10),
b = List.Range(List.Skip({"A" .. "Z", "A" .. "Z"}, sl), 0, 26)
& List.Range(List.Skip({"a" .. "z", "a" .. "z"}, sl), 0, 26)
& List.Range(List.Skip({"0" .. "9", "0" .. "9"}, sn), 0, 10),
d = Text.ToList([Text]),
e = Text.Combine(
List.Transform(
d,
each
if List.Contains(a, _) then
Table.SelectRows(Table.FromColumns({a, b}, {"Old", "New"}), (x) => _ = x[Old])[New]{0}
else
_
)
)
][e]
)
in
Result
Power Query solution 5 for Caesar Cipher Multi Shift, proposed by Thomas DUCROQUETZ:
let
Source = YourRawData,
ModifType = Table.TransformColumnTypes(Source, {{"Text", type text}, {"Shift", Int64.Type}}),
LettersLower = {"a" .. "z"},
LettersUpper = {"A" .. "Z"},
Numbers = {"0" .. "9"},
fnShiftCharacter = (carac as text, shift as number) as text =>
let
ListToConsider =
if List.Contains(LettersLower, carac) then
LettersLower
else if List.Contains(LettersUpper, carac) then
LettersUpper
else if List.Contains(Numbers, carac) then
Numbers
else
{},
PositionOfCharacter = List.PositionOf(ListToConsider, carac),
ShiftedPos =
let
ListLength = List.Count(ListToConsider)
in
Number.Mod(PositionOfCharacter + shift, ListLength)
in
try ListToConsider{ShiftedPos} otherwise carac,
Answer = Table.AddColumn(
ModifType,
"Expected Answer",
each
let
shift = [Shift]
in
Text.Combine(List.Transform(Text.ToList([Text]), each fnShiftCharacter(_, shift))),
type text
)
in
Answer
Solving the challenge of Caesar Cipher Multi Shift with Excel
Excel solution 1 for Caesar Cipher Multi Shift, proposed by Bo Rydobon 🇹🇭:
=MAP(
A2:A10,
B2:B10,
LAMBDA(
z,
s,
LET(
x,
{0,
48,
58,
65,
91,
97,
123},
y,
{0,
10,
0,
26,
0,
26,
0},
c,
CODE(
MID(
z,
SEQUENCE(
LEN(
z
)
),
1
)
),
a,
LOOKUP(
c,
x
),
b,
LOOKUP(
c,
x,
y
),
CONCAT(
CHAR(
IF(
b,
MOD(
c+s-a-b,
b
)+a,
c
)
)
)
)
)
)
Excel solution 2 for Caesar Cipher Multi Shift, proposed by Bo Rydobon 🇹🇭:
=MAP(
A2:A10,
B2:B10,
LAMBDA(
z,
s,
LET(
m,
MID(
z,
SEQUENCE(
50
),
1
),
CONCAT(
IFERROR(
IFNA(
CHAR(
MOD(
XMATCH(
m,
CHAR(
SEQUENCE(
26
)+64
)
)+s-1,
26
)+65+32*EXACT(
LOWER(
m
),
m
)
),
MOD(
m+s,
10
)
),
m
)
)
)
)
)
Excel solution 3 for Caesar Cipher Multi Shift, proposed by Rick Rothstein:
=MAP(
A2:A10,
B2:B10,
LAMBDA(
t,
s,
LET(
d,
1234567890,
u,
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
l,
LOWER(
u
),
a,
u&u&l&l&d&d,
c,
MID(
t,
SEQUENCE(
LEN(
t
)
),
1
),
CONCAT(
IFERROR(
MID(
a,
FIND(
c,
a
)+MOD(
s,
IF(
ISNUMBER(
0+c
),
10,
26
)
),
1
),
c
)
)
)
)
)
Excel solution 4 for Caesar Cipher Multi Shift, proposed by John V.:
=MAP(A2:A10,
B2:B10,
LAMBDA(x,
y,
LET(c,
CODE(
MID(
x,
SEQUENCE(
LEN(
x
)
),
1
)
),
b,
{0;48;58;65;91;97;123},
l,
LOOKUP(
c,
b
),
CONCAT(CHAR(IF(ISODD(
MATCH(
c,
b
)
),
c,
l+MOD(c+y-l,
26-16*(l=48))))))))
Excel solution 5 for Caesar Cipher Multi Shift, proposed by محمد حلمي:
=MAP(A2:A10,
B2:B10,
LAMBDA(a,
b,
LET(
a,
CODE(
MID(
a,
SEQUENCE(
LEN(
a
)
),
1
)
),
CONCAT(CHAR(
IFS(
(a>64)*(a<91),
MOD(
a+b-65,
26
)+65,
(a>96)*(a<123),
MOD(
a+b-97,
26
)+97,
(a>47)*(a<58),
MOD(
a+b-48,
10
)+48,
1,
a))))))
Excel solution 6 for Caesar Cipher Multi Shift, proposed by Julian Poeltl:
=MAP(A2:A10,
B2:B10,
LAMBDA(T,
S,
LET(C,
CODE(
MID(
T,
SEQUENCE(
LEN(
T
)
),
1
)
),
CONCAT(CHAR(IFS((C>47)*(C<58),
MOD(
C-48+S,
10
)+48,
(C>64)*(C<91),
MOD(
C-65+S,
26
)+65,
(C>96)*(C<123),
MOD(
C-97+S,
26
)+97,
1,
C))))))
Excel solution 7 for Caesar Cipher Multi Shift, proposed by Aditya Kumar Darak 🇮🇳:
=MAP(
A2:A10,
B2:B10,
LAMBDA(
a,
b,
LET(
s,
MID(
a,
SEQUENCE(
LEN(
a
)
),
1
),
cd,
CODE(
s
),
e,
LAMBDA(
x,
y,
z,
LET(
s,
SEQUENCE(
x,
,
y
),
r,
IFERROR(
INDEX(
s,
MOD(
XMATCH(
z,
s
) + b - 1,
x
) + 1
),
z
),
r
)
),
c1,
e(
26,
65,
cd
),
c2,
e(
26,
97,
c1
),
c3,
e(
10,
48,
c2
),
r,
CONCAT(
CHAR(
c3
)
),
r
)
)
)
Excel solution 8 for Caesar Cipher Multi Shift, proposed by Timothée BLIOT:
=MAP(
A2:A10,
B2:B10,
LAMBDA(
v,
w,
LET(
A,
MID(
v,
SEQUENCE(
LEN(
v
)
),
1
),
B,
MAP(
A,
LAMBDA(
x,
EXACT(
x,
UPPER(
x
)
)
)
),
D,
MAP(
LOWER(
A
),
LAMBDA(
x,
IF(
ISNUMBER(
x*1
),
MOD(
x+w,
10
),
IF(
AND(
CODE(
x
)>96,
CODE(
x
)<122
),
CHAR(
MOD(
CODE(
x
)-97+w,
26
)+97
),
x
)
)
)
),
CONCAT(
MAP(
SEQUENCE(
ROWS(
D
)
),
LAMBDA(
x,
IF(
INDEX(
B,
x
),
UPPER(
INDEX(
D,
x
)
),
INDEX(
D,
x
)
)
)
)
)
)
)
)
Excel solution 9 for Caesar Cipher Multi Shift, proposed by Stefan Olsson:
=LAMBDA(
text,
shift,
az,
num,
MAP(
text,
shift,
LAMBDA(
t,
s,
REDUCE(
"",
REGEXEXTRACT(
t&"",
REPT(
"(.)",
LEN(
t
)
)
),
LAMBDA(
c,
a,
c&
IFS(
REGEXMATCH(
a&"",
"[^A-Za-z0-9]"
),
a,
REGEXMATCH(
a&"",
"[0-9]"
),
MID(
num&num,
10+RIGHT(
s+a,
1
),
1
),
REGEXMATCH(
a,
"[a-z]"
),
MID(
az&az,
26+MOD(
s+FIND(
a,
az
),
26
),
1
),
TRUE,
MID(
UPPER(
az&az
),
26+MOD(
s+FIND(
a,
UPPER(
az
)
),
26
),
1
)
)
)
)
)
)
)(A2:A11,
B2:B11,
"abcdefghijklmnopqrstuvwxyz",
"1234567890")
Excel solution 10 for Caesar Cipher Multi Shift, proposed by Abhishek Kumar Jain:
=MAP(A2:A10,
B2:B10,
LAMBDA(a,
b,
LET(
c,
CODE(
MID(
a,
SEQUENCE(
,
LEN(
a
)
),
1
)
),
d,
c+MOD(
b,
26
),
e,
c+MOD(
b,
10
),
f,
IFS((c>=65)*(c<=90),
IF(
d>90,
65+d-90-1,
d
),
(c>=97)*(c<=122),
IF(
d>122,
97+d-122-1,
d
),
(c>=48)*(c<=57),
IF(
e>57,
48+e-57-1,
e
),
TRUE,
c),
TEXTJOIN(
"",
FALSE,
CHAR(
f
)
))))
Solving the challenge of Caesar Cipher Multi Shift with SQL
SQL solution 1 for Caesar Cipher Multi Shift, proposed by Zoran Milokanović:
WITH -- Microsoft SQL Server 2019
ALPHABET
AS
(
SELECT CHAR(ASCII('A')) AS CHR, '0123456789' AS NUM
UNION ALL
SELECT CHAR(ASCII(CHR) + 1) AS CHR, A.NUM
FROM ALPHABET A
WHERE
ASCII(A.CHR) <> ASCII('Z')
),
CONVERTER
AS
(
SELECT
STRING_AGG(A.CHR, '') AS UPPER
,LOWER(STRING_AGG(A.CHR, '')) AS LOWER
,MIN(A.NUM) NUM
FROM ALPHABET A
)
SELECT
D.TEXT
,D.SHIFT
,TRANSLATE(
TRANSLATE(
TRANSLATE(
D.TEXT,
C.UPPER, SUBSTRING(C.UPPER + C.UPPER, 1 + D.SHIFT % LEN(C.UPPER), LEN(C.UPPER))
),
C.LOWER, SUBSTRING(C.LOWER + C.LOWER, 1 + D.SHIFT % LEN(C.LOWER), LEN(C.LOWER))
),
C.NUM, SUBSTRING(C.NUM + C.NUM, 1 + D.SHIFT % LEN(C.NUM), LEN(C.NUM))
) AS EXPECTED_ANSWER
FROM DATA D
CROSS JOIN CONVERTER C
ORDER BY
D.SHIFT
;
&&
