рд╕реВрддреНрд░ рдФрд░ рдЖрд▓рд╕реА рд╕рдВрдпреЛрдЬрдХ

рдлреЙрд░реНрдореВрд▓рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА


рдлрд┐рдирдЯреЗрдХ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рд╕рд░рд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдирд┐рдордп рджрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧреА рдпрд╛ рдирд╣реАрдВред рдпреЗ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдмрд╣реБрдд рдмрд╛рд░ рдмрджрд▓рддреА рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдирдП рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдореМрдЬреВрджрд╛ рд▓реЛрдЧреЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рдореБрджреНрд░рд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рдордп рджрд░ рджреЛ рд╕реЗ рдПрдХ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдХрдИ рд╣рдЬрд╛рд░ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕реВрдЪрдирд╛рдПрдВ рдорд┐рд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

def notify?(rate) when rate > 2.0, do: true def notify?(_), do: false 

рд╣рдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрднреА рдЬреЛрдбрд╝реА рдЧрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рд╛рдВ, Code.eval_string/3 рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдБрдЪ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рд▓рд╛рдирдд рд╕рдордп рд╣рд╛рд▓рдд рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рд╣рдо рд╣рд░ рд╕реЗрдХрдВрдб рд╡рд┐рднрд┐рдиреНрди рдореБрджреНрд░рд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 10,000 рдкрд╛рдареНрдпрдХреНрд░рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╛рд░реНрдореВрд▓реЗ рдХреЗ рд╕рд╛рде рдЖрдПред рдЫреЛрдЯреЗ formulae рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рддреНрдпреЗрдХ рджреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕реВрддреНрд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдирдмреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдкрд░рдорд╛рдгреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рдЕрдВрдзрд╛рдзреБрдВрдз рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╣рд░ рдЪреАрдЬ рдЬреЛ рдЧреНрд░рд╛рд╣рдХ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рд╡рд╣ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд▓рдВрдмреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЗ рд╕рд╛рде рдПрд░рд▓рд╛рдВрдЧ рдЖрднрд╛рд╕реА рдорд╢реАрди рдкрд░ рдкрд░рдорд╛рдгреБ рдбреАрдУрдПрд╕ рд╣рдорд▓реЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред рд╣рдо 0.01 рдорд╛рди рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдХрджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдзрд┐рдХрддрдо 200 рд╣рдЬрд╛рд░ рдкрд░рдорд╛рдгреБ рджреЗрддрд╛ рд╣реИред

рдЖрд▓рд╕реА рд╕рдВрдпреЛрдЬрдХ


рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреВрд░реНрд╡рдирд┐рд░реНрдорд┐рдд рд╕реВрддреНрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдирд┐рдордп рджрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдХреБрдЫ рд╕реАрдорд╛рд╡рд░реНрддреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдЪрд╛рдирдХ, рдЕрдореГрдд рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдПрдХ рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЦреИрд░, рдореИрдВрдиреЗ рд░реВрдмреА ( Array#combination рдФрд░ рдЪрдЪреЗрд░реЗ рднрд╛рдИ) рд╕реЗ рдЬреБрдЭрд╛рд░реВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓рдВрдмреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ред рд╕реВрдЪреА рдореЗрдВ рддреАрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдпреЛрдЬрди рдмрдВрдж рд╣реЛ рдЧрдпрд╛, рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди - рдкрд╣рд▓реЗ рднреАред

рдЦреИрд░, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА; рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд▓рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдпрд╣ рдирд┐рдХрд▓рд╛, рдФрд░ рдпрд╣ рдЙрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ред рдореИрдВ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреА рддрд░рд╣ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛

 list = ~w[abcde]a combinations = Stream.transform(Stream.with_index(list), :ok, fn {i1, idx1}, :ok -> {Stream.transform(Stream.with_index(list), :ok, fn {_, idx2}, :ok when idx2 <= idx1 -> {[], :ok} {i2, idx2}, :ok -> {Stream.transform(Stream.with_index(list), :ok, fn {_, idx3}, :ok when idx3 <= idx2 -> {[], :ok} {i3, idx3}, :ok -> {Stream.transform(Stream.with_index(list), :ok, fn {_, idx4}, :ok when idx4 <= idx3 -> {[], :ok} {i4, _idx4}, :ok -> {[[i1, i2, i3, i4]], :ok} end), :ok} end), :ok} end), :ok} end) 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рдПрдХ рдЬреНрдЮрд╛рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдПред рдареАрдХ рд╣реИ, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ overcomeable рд╣реИ: рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ, рд╣реИ рдирд╛?

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреИрдЯрд░реНрди рджреЗрдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдПрдХ рд╕рдлрд▓ рд╢рд╛рдЦрд╛ рдЬрд┐рд╕рд╕реЗ рд╣рдо рд╕реВрдЪреА рдХреЛ рдЧрд┐рд░рд╛рддреЗ рд╣реИрдВред рдЦрд╛рд▓реА рд╕реВрдЪреА рдХрд╛ рддреНрд╡рд░рд┐рдд рдирд┐рд╖реНрдХрд╛рд╕рдиред рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрдиред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░ рдХреЗ рд▓рд┐рдП рдПрдПрд╕рдЯреА рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм Kernel.SpecialForms.quote/2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Kernel.SpecialForms.quote/2 рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЕрдкрдирд╛рдпрд╛: рд╣рдо рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдирдЧреНрди рдПрдПрд╕рдЯреА рдХреЛ рдореВрд░реНрддрд┐рдХрд▓рд╛ рджреЗрдВрдЧреЗред

рдореИрдВрдиреЗ рдЗрд╕ рдХреЛрдб рдкрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ quote do: рдФрд░, рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдХреА рдЬрд╛рдВрдЪ рдХреАред рд╣рд╛рдВ, рдкреИрдЯрд░реНрди рд╣реИрдВред рдЕрдЪреНрдЫрд╛, рдЪрд▓рд┐рдПред

рддреЛ, рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдврд╛рдВрдЪрд╛ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 defmacrop mapper(from, to, fun), do: quote(do: Enum.map(Range.new(unquote(from), unquote(to)), unquote(fun))) @spec combinations(list :: list(), count :: non_neg_integer()) :: {Stream.t(), :ok} defmacro combinations(l, n) do Enum.reduce(n..1, {[mapper(1, n, &var/1)], :ok}, fn i, body -> stream_combination_transform_clause(i, l, body) end) end 

рдЕрдм рд╣рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдПрд╕рдЯреА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдордЬреЗрджрд╛рд░ рд╣реИ!

рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 def var(i), do: {:"i_#{i}", [], Elixir} def idx(i), do: {:"idx_#{i}", [], Elixir} 

рдПрдПрд╕рдЯреА рднреАрддрд░реА рдЯреБрдХрдбрд╝рд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп рд╕реЗ рдлрд╛рдбрд╝рд╛:

 def sink_combination_clause(i) when i > 1 do {:->, [], [ [ {:when, [], [ {тАЛ{:_, [], Elixir}, idx(i)}, :ok, {:<=, [context: Elixir, import: Kernel], [idx(i), idx(i - 1)]} ]} ], {[], :ok} ]} end 

рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдЯреБрдХрдбрд╝реЗ рдПрдХ рд╕рд╛рде:

 def sink_combination_clauses(1, body) do [{:->, [], [[{var(1), idx(1)}, :ok], body]}] end def sink_combination_clauses(i, body) when i > 1 do Enum.reverse([ {:->, [], [[{var(i), idx(i)}, :ok], body]} | Enum.map(2..i, &sink_combination_clause/1) ]) end 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдмрд╛рд╣рд░реА рдЖрд╡рд░рдг рдЪрд╛рд░реЛрдВ рдУрд░ред

 def stream_combination_transform_clause(i, l, body) do clauses = sink_combination_clauses(i, body) {тАЛ{тАЛ{:., [], [{:__aliases__, [alias: false], [:Stream]}, :transform]}, [], [ {тАЛ{:., [], [{:__aliases__, [alias: false], [:Stream]}, :with_index]}, [], [l]}, :ok, {:fn, [], clauses} ]}, :ok} end 

рд╕рднреА рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд▓рдЧрднрдЧ рдкрд╣рдЪрд╛рди рдХреЗ рд╕рд╛рде рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдПрдХрдорд╛рддреНрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЖрдВрддрд░рд┐рдХ рдХреЙрд▓ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╣реИред рдпрд╣ рдЖрд╕рд╛рди рдерд╛, рд╣реИ рдирд╛? рд╕рднреА рдХреЛрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрд╡реЗрджрди


рдЕрдЪреНрдЫрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд╕реБрдВрджрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЦреИрд░, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

 l = for c <- ?a..?z, do: <<c>> # letters list with {stream, :ok} <- Formulae.Combinators.Stream.permutations(l, 12), do: stream |> Stream.take_every(26) |> Enum.take(2) #тЗТ [["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"], # ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "l", "w"]] 

рдЕрдм рд╣рдо рдЧрдгрдирд╛ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзрд╛рд░рд╛ рд╕реЗ рд╕реАрдзреЗ Flow рднреА рдЦрд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдпрд╣ рдЕрднреА рднреА рдзреАрдорд╛ рдФрд░ рджреБрдЦрдж рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЬреЛ рд░рд╛рдд рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХрд╣реАрдВ рд▓рд┐рдЦ рджреЗрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрд▓рд┐рд╕реНрдЯрд┐рд░ рдореЗрдВ рдПрдПрд╕рдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рд╣реИрдВ - рдкреВрдЫреЗрдВ, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдПрдХ рдХреБрддреНрддрд╛ рдЦрд╛рдпрд╛ред

Source: https://habr.com/ru/post/hi477222/


All Articles