4.2Kпросмотров
20 октября 2025 г.
Score: 4.6K
Магия List.Zip или свёртка числовой последовательности
#АнатомияФункций – List.Zip Всем привет!
В чат подкинули задачку по превращению текста вот такой последовательности:
"1,2,4,5,7,10,12,22,23,24,25"
вот в такую:
"1,2,4,5,7,10,12,22...25" Обратная задача решается элементарно, но вот прямая…
Родился вот такой вариант:
f=(txt)=>[ a = List.Buffer(List.Transform(Text.Split(txt,","),Number.From)), b = List.Zip({{null}&List.RemoveLastN(a),a,List.Skip(a)}), c = List.Buffer(List.Transform(b,(x)=>if x{2}-x{0}=2 then "..." else Text.From(x{1}))), d= Text.Replace(Text.Combine(List.Transform(List.Zip({c,List.Skip(c)}),(x)=>if x{0}=x{1} then null else x{0}),","),",...,","...")
][d]
Потом был примотан аккумулятор:
f=(txt)=>[ g=(s,c)=>s&(if c{2}-c{0}=2 then "" else Text.From(c{1})&(if c{3}-c{1}=2 then "..." else if c{2}=null then "" else ",")), a = List.Buffer(List.Transform(Text.Split(txt,","),Number.From)), b = List.Zip({{null}&List.RemoveLastN(a),a,List.Skip(a),List.Skip(a,2)}), c = List.Accumulate(b,"",g) ][c]
Потом и без аккумулятора оказалось неплохо:
f=(txt)=>[ g=(x)=> if x{2}-x{0}=2 then "" else x{4}& (if x{3}-x{1}=2 then "..." else if x{2}=null then "" else ","), a = List.Buffer(Text.Split(txt,",")), b = List.Buffer(List.Transform(a,Number.From)), c = List.Zip({{null}&List.RemoveLastN(b),b,List.Skip(b),List.Skip(b,2),a}), d = Text.Combine(List.Transform(c,g))][d]
Особенно если упаковать в IIFE:
f=(txt)=>((a)=>((b)=>Text.Combine(List.Transform(List.Zip({{null}&List.RemoveLastN(b),b,List.Skip(b),List.Skip(b,2),a}),(x)=>if x{2}-x{0}=2 then "" else x{4}& (if x{3}-x{1}=2 then "..." else if x{2}=null then "" else ","))))(List.Buffer(List.Transform(a,Number.From))))(List.Buffer(Text.Split(txt,",")))
Последний вариант, разумеется, самый шустрый ))) Детальный разбор смотрим на ютубе, рутубе, ну а исходники, как всегда, давно лежат на спонсоре. Лайк, коммент, подписка приветствуются ))) Надеюсь, было полезно.
Всех благ!
@buchlotnik