Heronian triangles: Difference between revisions

Add a Smalltalk (Squeak) solution
m (→‎{{header|Perl}}: Fix link: Perl 6 --> Raku)
(Add a Smalltalk (Squeak) solution)
Line 4,312:
7x65x68 140 210.0
3x148x149 300 210.0
</pre>
 
=={{header|Smalltalk (Squeak)}}==
<lang Smalltalk>
perimeter := [:triangle | triangle reduce: #+].
 
squaredArea := [:triangle |
| s |
s := (perimeter value: triangle) / 2.
triangle inject: s into: [:a2 :edge | s - edge * a2]].
 
isPrimitive := [:triangle | (triangle reduce: #gcd:) = 1].
 
isHeronian := [:triangle | (squaredArea value: triangle) sqrt isInteger].
 
heroGenerator := Generator on: [:generator |
1 to: 200 do: [:i |
i to: 200 do: [:j |
j to: (i+j-1 min: 200) do: [:k |
| triangle |
triangle := {i. j. k}.
((isPrimitive value: triangle) and: [isHeronian value: triangle])
ifTrue: [generator nextPut: triangle]]]]].
 
heronians := heroGenerator contents.
sorter := perimeter ascending , squaredArea ascending , #third ascending , #second ascending , #first ascending.
sorted := heronians sorted: sorter.
area210 := sorted select: [:triangle | (squaredArea value: triangle) = 210 squared].
 
header := [:title |
Transcript cr; cr; nextPutAll: title; cr.
#(peri area a b c) do: [:s | Transcript nextPutAll: s; tab]].
tabulate := [:t |
Transcript cr.
Transcript print: (perimeter value: t); tab.
Transcript print: (squaredArea value: t) sqrt.
t reverseDo: [:edge | Transcript tab; print: edge].].
 
Transcript cr; print: heronians size; nextPutAll: ' heronians triangles of side <= 200 where found'.
header value: 'first 10 sorted by perimeter, then area, the largest side'.
(sorted first: 10) do: tabulate.
header value: 'heronians of area 210'.
area210 do: tabulate.
 
Transcript flush.
</lang>
{{out}}
<pre>
517 heronians triangles of side <= 200 where found
 
first 10 sorted by perimeter, then area, the largest side
peri area a b c
12 6 5 4 3
16 12 6 5 5
18 12 8 5 5
30 30 13 12 5
32 24 15 13 4
36 36 17 10 9
36 60 13 13 10
40 60 17 15 8
42 42 20 15 7
42 84 15 14 13
 
heronians of area 210
peri area a b c
70 210 28 25 17
70 210 29 21 20
84 210 37 35 12
84 210 39 28 17
140 210 68 65 7
300 210 149 148 3
</pre>
 
Anonymous user