Heronian triangles: Difference between revisions
Content added Content deleted
Ttmrichter (talk | contribs) m (→{{header|Logtalk}}: Cleaned up some redundancy.) |
Ttmrichter (talk | contribs) (→{{header|Logtalk}}: Rewrote the test code to be more comprehensible, adding comments where needed. Changed representation from a tuple to a fact for performance reasons.) |
||
Line 3,031:
<syntaxhighlight lang="logtalk">
:- object(test_triangle).
% define an alias for simpler output clauses
:- public([start/0]).
Line 3,038 ⟶ 3,041:
gather_primitive_heronians(Primitives),
list::length(Primitives, L),
▲ logtalk::print_message(information, heronian,
▲ 'There are ~w primitive Heronian triangles with sides under 200.~n'+[L]),
list::sort(
list::take(10, AreaSorted, Area10),
▲ @'The first ten found, ordered by area, are:\n'),
display_each_element(Area10),
list::sort(
list::take(10, PerimeterSorted, Perimeter10),
▲ @'The first ten found, ordered by perimeter, are:\n'),
display_each_element(Perimeter10),
bagof(Element,
▲ @'The list of those with an area of 210 is:\n'),
display_each_element(Area210).
% localized helper predicates
list::member(E, P),
E = t(_,_,_,N,_).
% display a single element in the provided format
format(F),
print(F+[A, B, C, Area, Perimeter]).
▲ F+[A, B, C, Area, Perimeter]).
% display each element in a list of elements, printing a header first
display_each_element(L) :-
loop::foreach(T, L, (
format('~|~` t~w~3+~` t~w~4+~` t~w~4+~` t~w~8+~` t~w~7+').
% collect all the primitive heronian triangles within the boundaries of the provided task
gather_primitive_heronians(Primitives) :-
bagof(
(t(A, B, C, Area, Perimeter)),
(
between(3, 200, A),
Line 3,087 ⟶ 3,092:
).
% order triangles by area first, falling back to sides when areas are equal
order_area(=, T, T) :- !.▼
% order triangles by perimeter first, falling back to sides when perimeters are equal
order_perimeter(<, (_,_,_,_,Perimeter1), (_,_,_,_,Perimeter2)) :- Perimeter1 < Perimeter2, !.▼
▲
% order triangles by side A, then B, then C
▲ order_sides(<, (A1,_,_,_,_), (A2,_,_,_,_)) :- A1 < A2, !.
order_by_sides(<, t(_,_,C1,_,_), t(_,_,C2,_,_)) :- C1 < C2, !.
:- end_object.
|