Heronian triangles: Difference between revisions
Content added Content deleted
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: Fix link: Perl 6 --> Raku) |
(Add a Smalltalk (Squeak) solution) |
||
Line 4,312: | Line 4,312: | ||
7x65x68 140 210.0 |
7x65x68 140 210.0 |
||
3x148x149 300 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> |
</pre> |
||