Erlang рдкрд░ рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рд▓реЗрдЦ рдореЗрдВ рд╣рдо 10x10 рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдЯрд┐рдХ-рдЯреИрдХ-рдЯреЛ рдХрд╛ рдПрдХ рдЦреЗрд▓ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА (рд╡реНрдпрдХреНрддрд┐) рдПрдХ рдмреЙрдЯ (рдХрдВрдкреНрдпреВрдЯрд░) рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдХреЛ 3 рдкрд░рд┐рдгрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░рд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:

1) рдЦрд┐рд▓рд╛рдбрд╝реА рдЬреАрддрд╛
2) рдХрдВрдкреНрдпреВрдЯрд░ рдЬреАрддрд╛
3) рдбреНрд░рд╛

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

рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд▓реЛрд╣реЗ рдкрд░ рдХрд┐рдП рдЧрдП рдереЗ:

рд░реИрдо 4 рдЬреАрдмреА, рдЖрдИ 5, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕

рдЦреЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдмрд╛рдХреА рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЧрдИ рдереА):
рдХреНрд░реЛрдо 19.0.1084.56
рдПрдлрдПрдл 13.0.1
рд╕рдлрд╛рд░реА 5.1.6 (7534.56.5)
рдУрдкреЗрд░рд╛ 11.64

рдПрдХ рдЫреЛрдЯрд╛ рд╢рдмреНрджрдХреЛрд╖:

рд╕реВрдЪреА - рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
рдкреНрд░рддреАрдХ - рдПрдХ рдХреНрд░реЙрд╕ рдпрд╛ рдПрдХ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА;
рдПрдХ рд╕реЗрд▓, рдПрдХ рдмрд┐рдВрджреБ рдПрдХ рдЪрд╛рд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (рдПрдХреНрд╕; рд╡рд╛рдИ) рд╣реИ, рдЬрд╣рд╛рдВ 0 <рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ <= 10;
рджрд┐рд╢рд╛ - 4 рднрд┐рдиреНрдирддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА: рдХреНрд╖реИрддрд┐рдЬ, рдКрд░реНрдзреНрд╡рд╛рдзрд░, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд░реНрдг рдпрд╛ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд░реНрдг;
рдЕрдиреБрдХреНрд░рдо - 5 рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреАред

рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЛрд░реНрдЯ - 8000 рдХреЛ рд╕реБрдиреЗрдЧрд╛, рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЧреЗрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдХреНрд╖ (рдмреНрд░рд╛рдЙрдЬрд╝рд░) рдХреЛ рдЬреАрд╡рд┐рдд-рд╕реНрдерд╛рдпреА (рд╕реНрдерд╛рдпреА) рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдЕрдЬрд╛рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рд╕рднреА рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рдЕрдиреБрд░реЛрдз рдПрдХ рдХрдиреЗрдХреНрд╢рди (рд╕реЙрдХреЗрдЯ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗред рдЕрд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ *ред

* рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдЬрдмрд░рджрд╕реНрддреА рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ 1000 ajax рдХреЛ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдкрд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рддрд┐ рд╕рд░реНрд╡рд░ 50 рдЧреЗрдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХреЛрдб рдХрд╛ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

s(Port)-> spawn( fun () -> {ok, Socket} = gen_tcp:listen(Port, [list,{active, false},{packet, http}]), accept_loop(Socket) end). accept_loop(Socket) -> {ok, CSocket} = gen_tcp:accept(Socket), Pid = spawn( fun () -> client_socket() end), gen_tcp:controlling_process(CSocket, Pid), Pid ! {take_socket, Csocket}, % race condition accept_loop(Socket). client_socket() -> Socket = receive {take_socket, S} -> S end, client_loop(Socket, [], []). 


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


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

рдЖрдзрд╛рд░ рд╕реВрддреНрд░:

рдЬреА = рдПрдо + рдП * рдПрди

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

рдЕрдм рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:



рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд╛рд╕ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рдХреНрд░рдорд╢рдГ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

3 - рдпрджрд┐ рдХреЛрд╢рд┐рдХрд╛ рдХреЛрдгреАрдп рд╣реИ
5 - рдпрджрд┐ рд╕реЗрд▓ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпрд╛ рдЕрдВрддрд┐рдо рд╣реИ
8 - рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде

рдХреЛрдб рдЬреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

 get_all_empty_points([]) -> []; get_all_empty_points([Head | Tail]) -> lists:usort(get_nearby_points(Head) ++ get_all_empty_points(Tail)). %  get_nearby_points({X,Y}) when X =:= 1 andalso Y =:=1 -> [{X, Y+1}, {X+1, Y+1}, {X+1, Y}]; get_nearby_points({X,Y}) when X =:= 1 andalso Y =:=10 -> [{X+1, Y}, {X+1, Y-1}, {X, Y-1}]; get_nearby_points({X,Y}) when X =:= 10 andalso Y =:=10 -> [{X-1, Y}, {X-1, Y-1}, {X, Y-1}]; get_nearby_points({X,Y}) when X =:= 10 andalso Y =:=1 -> [{X, Y+1}, {X-1, Y+1}, {X-1, Y}]; %   X,Y get_nearby_points({X,Y}) when X =:= 1 -> [{X, Y-1}, {X+1, Y-1}, {X+1, Y}, {X+1, Y+1}, {X, Y+1}]; get_nearby_points({X,Y}) when Y =:= 10 -> [{X+1, Y}, {X+1, Y-1}, {X, Y-1}, {X-1, Y-1}, {X-1, Y}]; get_nearby_points({X,Y}) when X =:= 10 -> [{X, Y-1}, {X-1, Y-1}, {X-1, Y}, {X-1, Y+1}, {X, Y+1}]; get_nearby_points({X,Y}) when Y =:= 1 -> [{X-1, Y}, {X-1, Y+1}, {X, Y+1}, {X+1, Y+1}, {X+1, Y}]; %  get_nearby_points({X,Y}) -> [{X-1, Y+1}, {X, Y+1}, {X+1, Y+1}, {X+1,Y}, {X+1, Y-1}, {X, Y-1}, {X-1, Y-1}, {X-1, Y}]. 


рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХрджрдо рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдпрд╛ рдмреЙрдЯ рдХреА рдЪрд╛рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрджрд╛ рдЪрд╛рд▓ред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдкрд╛рд╕ рдХреА рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ, рдбреЙрдЯреНрд╕ рдЙрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП:



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

рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХреЗ рд╕рднреА рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдЕрдВрдд, рдЬреЛ рднреА рд╣реЛ) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреНрд╖реИрддрд┐рдЬ, рдКрд░реНрдзреНрд╡рд╛рдзрд░, рдкрд╣рд▓рд╛ рд╡рд┐рдХрд░реНрдг, рджреВрд╕рд░рд╛ рд╡рд┐рдХрд░реНрдг, рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рдбреЙрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ - рдкрд░рд┐рдгрд╛рдо рд╣рдореЗрдВ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:



рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб:

 generate_point (horizontal, {X, Y}) -> [{X2,Y} || X2<-lists:seq(X-4, X+4, 1), X2 > 0, X2 < 11]; generate_point (vertical, {X, Y}) -> [{X,Y2} || Y2<-lists:seq(Y-4, Y+4, 1), Y2 > 0, Y2 < 11]; generate_point (fdiagonal, {X, Y}) -> [{X2,Y2} || X2<-lists:seq(X-4, X+4, 1), Y2<-lists:seq(Y-4,Y+4, 1), X2 > 0, Y2 > 0, X2 < 11, Y2 < 11, X2-Y2 == XY]; generate_point (sdiagonal, {X, Y}) -> [{X2,Y2} || X2<-lists:seq(X-4, X+4, 1), Y2<-lists:seq(Y-4,Y+4, 1), X2 > 0, Y2 > 0, X2 < 11, Y2 < 11, X2+Y2 == X+Y]. 


рдЕрдм рд╣рдо рдХреНрд╖реИрддрд┐рдЬ рджрд┐рд╢рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рдЕрдиреНрдп рджрд┐рд╢рд╛рдУрдВ (рдКрд░реНрдзреНрд╡рд╛рдзрд░, рд╡рд┐рдХрд░реНрдг) рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛрдВрдЧреАред

5 рдЦрдВрдбреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реЗ рд╕рднреА рдЦрдВрдбреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕рдмрд╕реЗ рдЪрд░рдо рдмрд┐рдВрджреБ рдкрд╛рддреЗ рд╣реИрдВ, 5 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдПрдХ рдХрдХреНрд╖ рдореЗрдВ рдПрдХ рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рд╣рдо 4 рдФрд░ рдЦрдВрдбреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЖрдк рдиреЗрддреНрд░рд╣реАрди рдЪрд┐рддреНрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:



рдЙрдкрд░реЛрдХреНрдд рддрд╕реНрд╡реАрд░ рдореЗрдВ, рдХреЗрд╡рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВред рдЬрдм рд╣рдо 5 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдПрдХ рдЦрдВрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ 5 рдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

1) рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рд╡рд┐рдкрд░реАрдд рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рд╣реИ, рддреЛ рдЗрд╕ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рд╡рдЬрди рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
2) рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдЪрд┐рдиреНрд╣ рд╡рд╛рд▓рд╛ рд╕реЗрд▓ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд╛рдЙрдВрдЯрд░ рдорд╛рди 1 рд╕реЗ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
3) рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рд╡реИрд▓реНрдпреВ рдирд╣реАрдВ рдмрдврд╝рд╛рддреЗ рд╣реБрдП рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЪрд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред
4) рдпрджрд┐ 5 рд╡рд░реНрддрдорд╛рди рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдиреБрдХреНрд░рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рдЬрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдПрдХ рдмреЙрдЯ рджреНрд╡рд╛рд░рд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЗрд╕рдХрд╛ рд╡рдЬрди 10,000 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рд╡рдЬрди 1,000 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдмреЙрдЯ рдХреЛ рдЕрдкрдиреА рдЬреАрдд рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдирдХреА рд░рдХреНрд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВред
5) рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдХреА рд▓рдВрдмрд╛рдИ 1 рд╣реИ, рддреЛ рдЗрд╕реЗ 0 рдХреЗ рдмрд░рд╛рдмрд░ рдХрд░реЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рдХрд╛рд▓реНрдкрдирд┐рдХ рдЪрд╛рд▓ рд╣реИред

рдореВрд▓реНрдпрд╛рдВрдХрди рд╕рдорд╛рд░реЛрд╣ рд╕реВрддреНрд░:

рдПрд▓
рдШ = тИС рдХреЗ рд╕реА
рдореИрдВ = рез

рдПрд▓ рдиреЙрдирдЬреЗрд░реЛ рд╕реАрдХреНрд╡реЗрдВрд╕ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИ
рдХреЗ - рдЧреБрдгрд╛рдВрдХ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ - 3
рд╕реА, рдЕрдиреБрдХреНрд░рдо 2 рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдкреИрд░рд╛рдЧреНрд░рд╛рдл 2ред

рдЗрд╕реА рддрд░рд╣, рд╣рдо рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ: рдКрд░реНрдзреНрд╡рд╛рдзрд░, 2 рд╡рд┐рдХрд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рд╣рдо рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдордХрдХреНрд╖ рдореЗрдВ рд▓рд╛рдн рд╣реИ:

рдо, рди = рдШреЛрд░ + рдЧрд╡рд░ + рдЧрдлрджрд┐рдЧ + рдЧреНрд╕рджрд┐рдЧ

рдХреЛрдб рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:

 calculate_point_gravity(_, _, [], _) -> []; calculate_point_gravity(MovesX , MovesY, [Move | Rest], Aggress) -> PGravityX = calculate(generate_point(horizontal, Move), MovesX ++ [Move], MovesY, [], Move, 1000) + calculate(generate_point(vertical, Move), MovesX ++ [Move], MovesY, [], Move, 1000) + calculate(generate_point(fdiagonal, Move), MovesX ++ [Move], MovesY, [], Move, 1000) + calculate(generate_point(sdiagonal, Move), MovesX ++ [Move], MovesY, [], Move, 1000), PGravityY = calculate(generate_point(horizontal, Move), MovesY ++ [Move], MovesX, [], Move, 10000) + calculate(generate_point(vertical, Move), MovesY ++ [Move], MovesX, [], Move, 10000) + calculate(generate_point(fdiagonal, Move), MovesY ++ [Move], MovesX, [], Move, 10000) + calculate(generate_point(sdiagonal, Move), MovesY ++ [Move], MovesX, [], Move, 10000), PGravity = PGravityY + Aggress * PGravityX, [{PGravity, Move}] ++ calculate_point_gravity(MovesX, MovesY, Rest, Aggress). loop(_,_,_,0, Counter) -> Counter; loop([],_,_,_, Counter) -> Counter; loop(_,_,_,_, opponent_point_find) -> 0; loop([FC | RC], MovesX, MovesY, Num, Counter) -> Res = case exist_in_list(MovesX, FC) of true -> Counter + 1; %   false -> %    case exist_in_list(MovesY, FC) of true -> opponent_point_find; %     false -> Counter % ,  end end, loop(RC ,MovesX, MovesY, Num - 1, Res). calculate(CList, MovesX, MovesY, Current, BreakElement, W) when Current == BreakElement -> 0; calculate(CList, MovesX, MovesY, Current, BreakElement, W) -> Res = loop(CList, MovesX, MovesY, 5, 0) NewRes = case Res of opponent_point_find -> 0; 0 -> 0; 1 -> 0; % 1   5 -> W; %    5, _ -> math:pow(3, Res) %      end, [Head | Rest] = CList, NewRes + calculate(Rest, MovesX, MovesY, Head, BreakElement, W). 


рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЧрдгрдирд╛ рдФрд░ рдЧрдгрдирд╛_ рдмрд┐рдВрджреБ_ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг, рдкреВрдВрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдкреНрд░рджрд░реНрд╢рди рдпрд╛ рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирдЧрдгреНрдп рд╣реИред

рдЬрдм рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджрдХреНрд╖рддрд╛ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреА рд╣реИ, рддреЛ рд╣рдо рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЪреБрдирддреЗ рд╣реИрдВ:

 lists:max(calculate_point_gravity(PlayerMovesX , PlayerMovesY, AllVariants, Agress)). 

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

рдирд┐рд░реАрдХреНрд╖рдг


рдХреЛрдИ рднреА рдЦреЗрд▓ рджреЛ рдкрдХреНрд╖реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдирд╛ рдЕрд░реНрде рдЦреЛ рджреЗрддрд╛ рд╣реИ: рд╡рд┐рдЬреЗрддрд╛ рдФрд░ рд╣рд╛рд░рдиреЗ рд╡рд╛рд▓рд╛, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдбреНрд░реЙ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдкред

рдЕрдм рдЬреАрддрдиреЗ рд╡рд╛рд▓реЗ рдЪреЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдмрд╛рд░реА рдХреЗ рдмрд╛рдж рдЪреЗрдХ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдореЛрдбрд╝ рдХреЗ рдХреНрд░рдо рдореЗрдВ 3 рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ: рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рдЬреАрдд, рдмреЙрдЯ рдХреА рдЬреАрдд, рдбреНрд░рд╛, рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдореЗрдВ 2 рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, 1 - рдЦрд┐рд▓рд╛рдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдП рдЧрдП рд╕рднреА рдХрджрдо, 2 - рдЕрдВрддрд┐рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдЪрд╛рд▓ред



рдореВрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЪрд┐рддреНрд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ 8 рдХрд┐рд░рдгреЗрдВ рд╣реИрдВ, рдпрд╣ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рдХрд╛рд░рдг рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ) - рд╡рд░реНрддрдорд╛рди рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, 4 рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓рд╛ред рджреЛрдиреЛрдВ рднрд╛рдЧреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпреЛрдЧ 5 рд╣реИ, рддреЛ рдЬреАрддрдиреЗ рдХрд╛ рдХреНрд░рдо рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╛рдХреА


рдФрд░ рд╣рд╛рдВ, рдбреЗрдореЛ:

http://88.198.65.2:8000/

рдЦреЗрд▓ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЧрддрд┐рд╢реАрд▓ рд╣реИ, рдЗрд╕реЗ рдЕрдЧрд▓реА рдЪрд╛рд▓ рддрдХ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ - 0.8, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рдирд╛рдИ рдХрд╛рд░рдХ - рдмреЙрдЯ рдПрдХ рд░рдХреНрд╖рд╛рддреНрдордХ рд░рдгрдиреАрддрд┐ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХрдо - рд╣рдорд▓рд╛ рдХрд░рдиреЗ рдХреА рд░рдгрдиреАрддрд┐, рдореИрдВ рдЖрдкрдХреЛ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдмреЙрдЯ рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЗрд▓рддрд╛ рд╣реИ [0.5] , рез]ред

рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдкреАрдЫреЗ рд╣реИрдВ, рдпрд╛ рдЬрд┐рдирдХрд╛ рдкреЛрд░реНрдЯ 8000 рдмрдВрдж рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рдЧреЗрдо рдХреЛ рдкреЛрд░реНрдЯ 80 рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

Github'e - github.com/Tremax/eTicTacToe рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕реНрд░реЛрдд

рдореИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рддреБрдЪреНрдЫ рд╣реИред

рд╕рдВрджрд░реНрдн

algolist.manual.ru/games/fiveinarow.php

рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

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


All Articles