Replace the vowels with vowels in sorted order. Ex. “orange” There are 3 vowels – o, a, e Sorting it would give a, e, o Hence, a will replace o, e will replace a and o will replace e. Hence answer would be “arengo”
📌 Challenge Details and Links
ExcelBI Excel Challenge Number: 239
Challenge Difficulty: ⭐️
📥Download Sample File
📥Link to the solutions on LinkedIn
Solving the challenge of Sorted Vowel Substitution with Power Query
Power Query solution 1 for Sorted Vowel Substitution, proposed by Bo Rydobon 🇹🇭:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Ans = Table.TransformRows(
Source,
each
let
v = "uoiea",
m = Text.ToList([Strings]),
V = List.Sort(m, each - Text.PositionOf(v, _)),
L = List.Accumulate(
m,
{},
(s, l) => s & {List.Last(s, 0) + Number.From(Text.PositionOf(v, l) >= 0)}
)
in
Text.Combine(
List.Transform(
{0 .. List.Count(m) - 1},
each if Text.PositionOf(v, m{_}) >= 0 then V{L{_} - 1} else m{_}
)
)
)
in
Ans
Power Query solution 2 for Sorted Vowel Substitution, proposed by Zoran Milokanović:
let
Source = Excel.CurrentWorkbook(){[Name = "Input"]}[Content],
S = Table.TransformRows(
Source,
each
let
c = Text.ToList([Strings]),
s = {"a", "e", "i", "o", "u"},
v = List.Sort(Text.ToList(Text.Select([Strings], s)))
in
Text.Combine(
List.Transform(
List.Positions(c),
each
let
f = List.PositionOf(List.PositionOfAny(c, s, 2), _)
in
if f = - 1 then c{_} else v{f}
)
)
)
in
S
Power Query solution 3 for Sorted Vowel Substitution, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
Sol = Table.AddColumn(
Source,
"Answer",
each
let
a = Text.ToList([Strings]),
b = Text.PositionOfAny([Strings], {"a", "e", "i", "o", "u"}, Occurrence.All),
c = List.Zip({{0 .. Text.Length([Strings]) - 1}, a}),
d = List.Zip({b, List.Sort(List.Transform(b, each a{_}), Order.Ascending)}),
e = List.Select(c, each not List.Contains({"a", "e", "i", "o", "u"}, _{1}))
in
Text.Combine(Table.Sort(Table.FromRows(e & d), {"Column1"})[Column2])
)[[Answer]]
in
Sol
Power Query solution 4 for Sorted Vowel Substitution, proposed by Luan Rodrigues:
let
Fonte = Query_Tabela1,
res = Table.AddColumn(
Fonte,
"Personalizar",
each [
a = Text.PositionOfAny([Strings], {"a", "e", "i", "o", "u"}, Occurrence.All),
b = List.Sort(Text.ToList(Text.Select([Strings], {"a", "e", "i", "o", "u"}))),
c = List.Zip({a, b}),
d = Text.PositionOfAny([Strings], {"a" .. "z"}, Occurrence.All),
e = Text.ToList([Strings]),
f = List.Zip({d, e}),
g = List.ReplaceMatchingItems(d, c),
h = Text.Combine(List.ReplaceMatchingItems(g, f))
][h]
)
in
res
Power Query solution 5 for Sorted Vowel Substitution, proposed by Venkata Rajesh:
let
Source = Data,
Output = Table.AddColumn(
Source,
"Result",
each [
x = List.Sort(Text.ToList(Text.Select([Strings], {"a", "e", "i", "o", "u"}))),
y = Text.PositionOfAny([Strings], x, Occurrence.All),
z = List.Accumulate(
{0 .. List.Count(y) - 1},
[Strings],
(state, current) => Text.ReplaceRange(state, y{current}, 1, x{current})
)
][z]
)
in
Output
Solving the challenge of Sorted Vowel Substitution with Excel
Excel solution 1 for Sorted Vowel Substitution, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A10,LAMBDA(a,LET(v,"aeiou",m,MID(a,SEQUENCE(LEN(a)),1),f,FIND(m,v),e,ISERR(f),CONCAT(IF(e,m,INDEX(SORTBY(m,f),SCAN(0,e,LAMBDA(a,x,a+1-x))))))))
Excel solution 2 for Sorted Vowel Substitution, proposed by Bo Rydobon 🇹🇭:
=MAP(A2:A10,LAMBDA(a,LET(s,SEQUENCE(LEN(a)),m,MID(a,s,1),f,FIND(m,"aeiou"),CONCAT(SORTBY(SORTBY(m,f),SORTBY(s,ISERR(f)))))))
Excel solution 3 for Sorted Vowel Substitution, proposed by Rick Rothstein:
=MAP(A2:A10,LAMBDA(a,IFERROR(LET(c,MID(a,SEQUENCE(LEN(a)),1),v,SORT(TOROW(MAP(SUBSTITUTE(c," ",""),LAMBDA(x,IF(ISNUMBER(FIND(x,"aeiou")),x,0/0))),2),,,1),r,REDUCE("",c,LAMBDA(a,z,a&IF(ISNUMBER(FIND(z,"aeiou")),"@",z))),REDUCE(r,v,LAMBDA(a,x,SUBSTITUTE(a,"@",x,1)))),a)))
Excel solution 4 for Sorted Vowel Substitution, proposed by John V.:
=MAP(A2:A10,LAMBDA(x,LET(v,MID(x,SEQUENCE(LEN(x)),1),p,FIND(v,"aeiou"),e,ISERR(p),CONCAT(IF(e,v,INDEX(SORTBY(v,p),SCAN(0,e,LAMBDA(a,v,1+a-v))))))))
Excel solution 5 for Sorted Vowel Substitution, proposed by محمد حلمي:
=MAP(A2:A10,LAMBDA(a,LET(s,SEQUENCE(LEN(a)),d,MID(a,s,1),e,XMATCH(d,{"a","e","i","o","u"}),i,ISNUMBER(e),IFERROR(CONCAT(IFNA(XLOOKUP(s,FILTER(s,i),SORT(FILTER(d,i))),d)),a))))
Excel solution 6 for Sorted Vowel Substitution, proposed by محمد حلمي:
=MAP(A2:A10,LAMBDA(a,LET(s,SEQUENCE(20),n,MID(a,s,1),h,IFNA(XMATCH(n,{"a","e","i","o","u"}),),x,FILTER(s,h),
IFERROR(REDUCE(a,SEQUENCE(ROWS(x)),LAMBDA(v,d,REPLACE(v,INDEX(x,d),1,INDEX(SORT(FILTER(n,h)),d)))),a))))
Excel solution 7 for Sorted Vowel Substitution, proposed by محمد حلمي:
=MAP(A2:A10,LAMBDA(a,LET(s,SEQUENCE(
LEN(a)),d,MID(a,s,1),i,IFNA(XMATCH(d,{"a","e",
"i","o","u"}),),IFERROR(CONCAT(IFNA(XLOOKUP(s,FILTER(s,i),SORT(FILTER(d,i))),d)),a))))
Excel solution 8 for Sorted Vowel Substitution, proposed by Kris Jaganah:
=MAP(A2:A10,LAMBDA(v,LET(a,SEQUENCE(LEN(v)),b,MID(v,a,1),c,(b="a")+(b="e")+(b="i")+(b="o")+(b="u"),d,SCAN(0,a*c,LAMBDA(x,y,IF(y>0,1+x,x))),e,SORT(FILTER(b,c,"")),f,SEQUENCE(ROWS(e)),CONCAT(IFNA(XLOOKUP(c*d,f,e),b)))))
Excel solution 9 for Sorted Vowel Substitution, proposed by Julian Poeltl:
=MAP(A2:A10,LAMBDA(S,LET(SP,MID(S,SEQUENCE(LEN(S)),1),V,ISNUMBER(SEARCH(SP,"aeiou")),T,SCAN(0,V,LAMBDA(A,B,A+B)),CONCAT(IF(V,INDEX(SORT(FILTER(SP,V)),T),SP)))))
Excel solution 10 for Sorted Vowel Substitution, proposed by Timothée BLIOT:
=MAP(A2:A10, LAMBDA(z, LET(A, MID(z,SEQUENCE(LEN(z)),1),
B,{"a";"e";"i";"o";"u"}, D,MAP(A, LAMBDA(x, ISNUMBER(XMATCH(x,B)) )),
E, SCAN(0,SEQUENCE(ROWS(A)), LAMBDA(a,v, IF(INDEX(D,v),a+1,a) )),
F, MAP(SEQUENCE(ROWS(A)), LAMBDA(x, IF(x>1,IF(INDEX(E,x-1)=INDEX(E,x),0,INDEX(E,x)),INDEX(E,x)) )),
G, SORT(FILTER(A,D)),
CONCAT(MAP(SEQUENCE(ROWS(A)), LAMBDA(x, IF(INDEX(F,x)=0,INDEX(A,x),INDEX(G,INDEX(F,x))) )))) ))
Excel solution 11 for Sorted Vowel Substitution, proposed by Hussein SATOUR:
=MAP(A2:A10, LAMBDA(x, LET(a, MID(x,SEQUENCE(LEN(x)), 1),
b, {"a","e","i","o","u","y"}, c, ISNA(XMATCH(a,b)),
TEXTJOIN(SORT(FILTER(a, NOT(c))),0, TEXTSPLIT(CONCAT(IF(c, a, " ")), " ")))))
Excel solution 12 for Sorted Vowel Substitution, proposed by Oscar Mendez Roca Farell:
=MAP(A2:A10, LAMBDA(a, LET(_s, SEQUENCE(LEN(a)),_w, MID(a,_s,1),_f, FILTER(HSTACK(_w,_s), ISNUMBER(XMATCH(_w,{"a";"e";"i";"o";"u"}))), IFERROR(REDUCE(a, SEQUENCE(ROWS(_f)), LAMBDA(i, x, REPLACE(i, INDEX(_f, x, 2), 1, INDEX(ORDER(_f), x, 1)))), a))))
Excel solution 13 for Sorted Vowel Substitution, proposed by Sunny Baggu:
=MAP(
A2:A10,
LAMBDA(x,
LET(
_vow, {"a"; "e"; "i"; "o"; "u"},
_m, MID(x, SEQUENCE(LEN(x)), 1),
_seq, SEQUENCE(LEN(x)),
_loc1, XMATCH(_m, _vow),
_loc2, TOCOL(IFS(_loc1, _seq), 3),
_sc, SORT(TOCOL(IFS(_loc1, _m), 3)),
IFERROR(
REDUCE(
x,
SEQUENCE(ROWS(_loc2)),
LAMBDA(a, v, REPLACE(a, INDEX(_loc2, v, 1), 1, INDEX(_sc, v, 1)))
),
x
)
)
)
)
Excel solution 14 for Sorted Vowel Substitution, proposed by Julien Lacaze:
=LET(data,A2:A10,vowels,{"a";"e";"i";"o";"u";"y"},
MAP(data,LAMBDA(strings,LET(
split,MID(strings,SEQUENCE(LEN(strings)),1),
seq,SEQUENCE(ROWS(split)),
m,TOCOL(MAP(split,seq,LAMBDA(a,b,IF(OR(a=vowels),b,NA()))),3),
r,SORT(DROP(REDUCE("",split,LAMBDA(a,v,IF(OR(v=vowels),VSTACK(a,v),a))),1)),
CONCAT(MAP(seq,LAMBDA(
a,IF(OR(a=m),INDEX(r,XMATCH(a,m)),INDEX(split,a)))))))))
Excel solution 15 for Sorted Vowel Substitution, proposed by Giorgi Goderdzishvili:
=MAP(A2:A10,LAMBDA(x,LET(
str,x,
vow,{"a","e","i","o","u"},
chr, MID(str, SEQUENCE(,LEN(str)),1),
isvow,ISNUMBER(XMATCH(chr, vow,0)),
flt, SORT(FILTER(chr,isvow),,,TRUE),
sc, SCAN(0,--isvow, LAMBDA(x,y, x+y)),
IFERROR(CONCAT(IF(isvow, INDEX(flt,1,sc),chr)),str))))
Excel solution 16 for Sorted Vowel Substitution, proposed by Daniel Garzia:
=MAP(A2:A10,LAMBDA(w,LET(l,MID(w,SEQUENCE(LEN(w)),1),t,ISERR(SEARCH(l,"aeiou")),s,SORT(IF(t,"z",l)),CONCAT(IF(t,l,INDEX(s,SCAN(0,--ISNUMBER(XMATCH(l,s)),LAMBDA(a,b,a+b))))))))
Excel solution 17 for Sorted Vowel Substitution, proposed by Anup Kumar:
=BYROW(A2:A10,LAMBDA(wd,LET(
vw,{"a";"e";"I";"o";"u"},
sq,SEQUENCE(LEN(wd)),
orgtbl,HSTACK(sq,MID(wd,sq,1)),
vwtbl,FILTER(orgtbl,ISNUMBER(XMATCH(TAKE(orgtbl,,-1),vw))),
cntbl,FILTER(orgtbl,ISNA(XMATCH(TAKE(orgtbl,,-1),vw))),
nworder,HSTACK(TAKE(vwtbl,,1),SORT(TAKE(vwtbl,,-1))),
IFERROR(CONCAT(TAKE(SORT(VSTACK(cntbl,nworder)),,-1)),wd))))
Excel solution 18 for Sorted Vowel Substitution, proposed by Diarmuid Early:
=MAP(A2:A10,LAMBDA(a,
LET(seq,SEQUENCE(LEN(a)),
letters,MID(a,seq,1),
notVowel,ISERR(SEARCH(letters,"aeiou")),
step1,SORTBY(letters,IF(notVowel,seq,1000),,letters,),
step2,SORTBY(seq,notVowel,-1),
step3,SORTBY(step1,step2),
CONCAT(step3))))
The idea is:
1. Sort the letters so the vowels are at the end and sorted in order.
2. Sort a sequence 1 to # of letters according to whether the corresponding letters are vowels or consonants (with the consonants first).
3. 'Unsort' the vowels and consonants from (1) back into the right relative order using (2)
Excel solution 19 for Sorted Vowel Substitution, proposed by Amardeep Singh:
=MAP(A2:A10,LAMBDA(x,
LET(l,SEQUENCE(LEN(x)),
t,MID(x,l,1),
v,{"a","e","i","o","u"},
p,ISNA(XMATCH(t,v)),
ct,FILTER(TEXT(l,"00")&t,p,""),
vt,FILTER(TEXT(l,"00"),1-p,"")&SORT(FILTER(t,1-p,"")),
CONCAT(RIGHT(SORT(VSTACK(vt,ct)))))))
Solving the challenge of Sorted Vowel Substitution with Excel VBA
Excel VBA solution 1 for Sorted Vowel Substitution, proposed by Nicolas Micot:
VBA solution:
Option Base 1
Function f_trierVoyelles(ByVal texte As String) As String
Dim estVoyelle As Variant
Dim resultat As String
voyelles = Array("a", "e", "i", "o", "u", "y")
nb = Array(0, 0, 0, 0, 0, 0)
ReDim estVoyelle(1 To Len(texte))
For i = 1 To Len(texte)
lettre = Mid(texte, i, 1)
For x = 1 To UBound(voyelles, 1)
If voyelles(x) = lettre Then
nb(x) = nb(x) + 1
estVoyelle(i) = True
Exit For
End If
Next x
Next i
For i = 1 To Len(texte)
If estVoyelle(i) Then
For x = 1 To UBound(nb, 1)
If nb(x) > 0 Then
resultat = resultat & voyelles(x)
nb(x) = nb(x) - 1
Exit For
End If
Next x
Else
resultat = resultat & Mid(texte, i, 1)
End If
Next i
f_trierVoyelles = resultat
End Function
&&&
