Home » Sorted Vowel Substitution

Sorted Vowel Substitution

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
                    
                  

&&&

Leave a Reply