Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module(solution).
- -compile(export_all).
- rotate({A0,A1},{B0,B1},{C0,C1}) ->
- (B0-A0)*(C1-B1)-(B1-A1)*(C0-B0).
- find_start_point({A,B},[]) -> {A,B};
- find_start_point({A,B},[{C,D}|Points]) ->
- if (A < C orelse B < D) -> find_start_point({A,B},Points);
- (A >= C orelse B >= D) -> find_start_point({C,D},Points)
- end.
- main() ->
- {ok,File}=file:open("test_case",read),
- {ok,Prom}=file:read_line(File),
- [Count,_]=string:split(Prom,"\n"),
- io:format("~s~n",[Count]),
- {ok,Bin}=file:read_file("test_case"),
- [First|Pairs]=binary:split(Bin,[<<"\n">>],[global]),
- Data=parse_bin(Pairs,[]),
- file:close(File),
- main(Data).
- main([{A,B}|Points]) ->
- StartPoint=find_start_point({A,B},Points),
- io:format("SP = ~p~n",[StartPoint]),
- jarvis(StartPoint,lists:reverse([{A,B}|Points])).
- parse_bin([],List) ->
- List;
- parse_bin([Pair|Tail],List) ->
- if Pair == <<>> ->
- parse_bin([],List);
- Pair /= <<>> ->
- [A,B]=binary:split(Pair,[<<" ">>],[global]),
- parse_bin(Tail,[{binary_to_integer(A),binary_to_integer(B)}|List]) end.
- jarvis(StartPoint,All) ->
- NewList=lists:sort(fun(X,Y)-> Rot=rotate(StartPoint,Y,X), if Rot<0 -> true; Rot>0 -> false; Rot==0 -> false end end,lists:delete(StartPoint,All)),
- prom(NewList,[lists:last(lists:reverse(NewList)),StartPoint]).
- prom([{Fx,Fy}|List],[{Ax,Ay},{Bx,By}|Tail]) ->
- marvis(List,[{Ax,Ay},{Bx,By}|Tail]).
- marvis([],[{Ax,Ay},{Bx,By}|Tail]) ->
- Perim=perim({Ax,Ay},lists:last(Tail)),
- perimetr([{Ax,Ay},{Bx,By}|Tail],Perim);
- marvis([{Fx,Fy}|List],[{Ax,Ay},{Bx,By}|Tail]) ->
- Rot=rotate({Bx,By},{Ax,Ay},{Fx,Fy}),
- if Rot < 0 -> marvis([{Fx,Fy}|List], [{Bx,By}|Tail]);
- Rot > 0 -> marvis(List, [{Fx,Fy},{Ax,Ay},{Bx,By}|Tail]);
- Rot =:= 0 -> marvis(List, [{Ax,Ay},{Bx,By}|Tail])
- end.
- perimetr([{_,_}],Perim) ->
- io:format("~p~n",[Perim]);
- perimetr([{Ax,Ay},{Bx,By}|Tail],Perim) ->
- N = perim({Ax,Ay},{Bx,By}),
- perimetr([{Bx,By}|Tail],Perim+N).
- perim({Ax,Ay},{Bx,By}) ->
- math:sqrt(math:pow(Bx-Ax,2)+math:pow(By-Ay,2)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement