Heronian triangles: Difference between revisions

m
→‎{{header|REXX}}: removed code to it's proper place alphabetically.
m (→‎{{header|REXX}}: removed code to it's proper place alphabetically.)
Line 420:
(7, 65, 68) perim: 140 area: 210
(3, 148, 149) perim: 300 area: 210</pre>
 
=={{header|Ruby}}==
<lang ruby>Triangle = Struct.new(:a, :b, :c) do
include Comparable
 
def self.valid?(a,b,c) # class method
short, middle, long = [a, b, c].sort
short + middle > long
end
 
def sides
@sides ||= [a, b, c].sort
end
 
def perimeter
@perimeter ||= a + b + c
end
 
def semiperimeter
@semiperimeter ||= perimeter/2.0
end
 
def area
s = semiperimeter
@area ||= Math.sqrt(s*(s - a)*(s - b)*(s - c))
end
 
def heronian?
area == area.to_i
end
 
def <=>(other)
[area, perimeter, sides] <=> [other.area, other.perimeter, other.sides]
end
 
def to_s
"#{sides.join("x").ljust(10)}\t#{perimeter}\t#{area}"
end
end
 
max, area = 200, 210
prim_triangles = []
1.upto(max) do |a|
a.upto(max) do |b|
b.upto(max) do |c|
next if a.gcd(b).gcd(c) > 1
prim_triangles << Triangle.new(a, b, c) if Triangle.valid?(a, b, c)
end
end
end
 
sorted = prim_triangles.select(&:heronian?).sort
 
puts "Primitive heronian triangles with sides upto #{max}: #{sorted.size}"
puts "\nsides \tperim.\tarea"
sorted.first(10).each{|tr| puts tr }
puts "\nTriangles with an area of: #{area}"
sorted.select{|tr| tr.area == area}.each{|tr| puts tr }
</lang>
{{out}}
<pre>
Primitive heronian triangles with sides upto 200: 517
 
sides perim. area
3x4x5 12 6.0
5x5x6 16 12.0
5x5x8 18 12.0
4x13x15 32 24.0
5x12x13 30 30.0
9x10x17 36 36.0
3x25x26 54 36.0
7x15x20 42 42.0
10x13x13 36 60.0
8x15x17 40 60.0
 
Triangles with an area of: 210
17x25x28 70 210.0
20x21x29 70 210.0
12x35x37 84 210.0
17x28x39 84 210.0
7x65x68 140 210.0
3x148x149 300 210.0
</pre>
 
=={{header|REXX}}==
Line 591 ⟶ 508:
5 area: 210 perimeter: 140 sides: 7 65 68
6 area: 210 perimeter: 300 sides: 3 148 149
</pre>
 
=={{header|Ruby}}==
<lang ruby>Triangle = Struct.new(:a, :b, :c) do
include Comparable
 
def self.valid?(a,b,c) # class method
short, middle, long = [a, b, c].sort
short + middle > long
end
 
def sides
@sides ||= [a, b, c].sort
end
 
def perimeter
@perimeter ||= a + b + c
end
 
def semiperimeter
@semiperimeter ||= perimeter/2.0
end
 
def area
s = semiperimeter
@area ||= Math.sqrt(s*(s - a)*(s - b)*(s - c))
end
 
def heronian?
area == area.to_i
end
 
def <=>(other)
[area, perimeter, sides] <=> [other.area, other.perimeter, other.sides]
end
 
def to_s
"#{sides.join("x").ljust(10)}\t#{perimeter}\t#{area}"
end
end
 
max, area = 200, 210
prim_triangles = []
1.upto(max) do |a|
a.upto(max) do |b|
b.upto(max) do |c|
next if a.gcd(b).gcd(c) > 1
prim_triangles << Triangle.new(a, b, c) if Triangle.valid?(a, b, c)
end
end
end
 
sorted = prim_triangles.select(&:heronian?).sort
 
puts "Primitive heronian triangles with sides upto #{max}: #{sorted.size}"
puts "\nsides \tperim.\tarea"
sorted.first(10).each{|tr| puts tr }
puts "\nTriangles with an area of: #{area}"
sorted.select{|tr| tr.area == area}.each{|tr| puts tr }
</lang>
{{out}}
<pre>
Primitive heronian triangles with sides upto 200: 517
 
sides perim. area
3x4x5 12 6.0
5x5x6 16 12.0
5x5x8 18 12.0
4x13x15 32 24.0
5x12x13 30 30.0
9x10x17 36 36.0
3x25x26 54 36.0
7x15x20 42 42.0
10x13x13 36 60.0
8x15x17 40 60.0
 
Triangles with an area of: 210
17x25x28 70 210.0
20x21x29 70 210.0
12x35x37 84 210.0
17x28x39 84 210.0
7x65x68 140 210.0
3x148x149 300 210.0
</pre>