Number.Mod, List.Positions или реализуем код Вижинера

#АнатомияФункций - Number.Mod, List.Positions



Всем привет!

Вчера решали задачу по построению таблицы со сдвигами, но выяснилось, что это требовалось для кодирования информации. Так вот – для кодирования таблица вообще не нужна, нужны только номера, остатки и всякое такое. Поэтому вот код:

(tbl,key,cr)=>

let

lst=List.Buffer({"А".."Е","Ё","Ж".."Я","а".."е","ё","ж".."я","A".."Z","a".."z","0".."9"," ",",",".",":","-"}),

c=if cr=0 then 1 else -1,



d=Record.FromList(List.Positions(lst),lst),

e=List.Buffer(List.Transform(Text.ToList(key),(x)=>Record.Field(d,x))),

n=List.Count(lst),



f=(x)=>if x is text then [a=Text.ToList(x),b=Text.Combine(List.Transform(List.Zip({a,List.Positions(a)}),g))][b] else x,

g=(x)=>lst{Number.Mod(n+Record.Field(d,x{0})+c*(e{Number.Mod(x{1},List.Count(e))}+1),n)},



to=Table.TransformColumns(tbl,{},f)

in

to


А что тут к чему – смотрим на ютубе



Важно – поменял в коде проверку условия – проверяем не null, а именно наличие текста.



Лайк, коммент, подписка приветствуются )))



Надеюсь, было полезно.

Всех благ!

@buchlotnik