Heronian triangles: Difference between revisions

Content deleted Content added
m →‎{{header|REXX}}: localized a subroutine variable, changed whitespace in the program and output.
→‎{{header|Ruby}}: corrects the definition of the Triangle ( Struct-> class ) and output.
Line 767: Line 767:


=={{header|Ruby}}==
=={{header|Ruby}}==
<lang ruby>Triangle = Struct.new(:a, :b, :c) do
<lang ruby>class Triangle
include Comparable

def self.valid?(a,b,c) # class method
def self.valid?(a,b,c) # class method
short, middle, long = [a, b, c].sort
short, middle, long = [a, b, c].sort
short + middle > long
short + middle > long
end
end

def sides
attr_reader :sides, :perimeter, :area
@sides ||= [a, b, c].sort
def initialize(a,b,c)
@sides = [a, b, c].sort
@perimeter = a + b + c
s = @perimeter / 2.0
@area = Math.sqrt(s * (s - a) * (s - b) * (s - c))
end
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?
def heronian?
area == area.to_i
area == area.to_i
end
end

def <=>(other)
def <=>(other)
[area, perimeter, sides] <=> [other.area, other.perimeter, other.sides]
[area, perimeter, sides] <=> [other.area, other.perimeter, other.sides]
end
end

def to_s
def to_s
"#{sides.join("x").ljust(10)}\t#{perimeter}\t#{area}"
"%-11s%6d%8.1f" % [sides.join('x'), perimeter, area]
end
end
end
end
Line 819: Line 809:


puts "Primitive heronian triangles with sides upto #{max}: #{sorted.size}"
puts "Primitive heronian triangles with sides upto #{max}: #{sorted.size}"
puts "\nsides \tperim.\tarea"
puts "\nsides perim. area"
sorted.first(10).each{|tr| puts tr }
puts sorted.first(10).map(&:to_s)
puts "\nTriangles with an area of: #{area}"
puts "\nTriangles with an area of: #{area}"
sorted.select{|tr| tr.area == area}.each{|tr| puts tr }
sorted.each{|tr| puts tr if tr.area == area}</lang>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Primitive heronian triangles with sides upto 200: 517
Primitive heronian triangles with sides upto 200: 517


sides perim. area
sides perim. area
3x4x5 12 6.0
3x4x5 12 6.0
5x5x6 16 12.0
5x5x6 16 12.0
5x5x8 18 12.0
5x5x8 18 12.0
4x13x15 32 24.0
4x13x15 32 24.0
5x12x13 30 30.0
5x12x13 30 30.0
9x10x17 36 36.0
9x10x17 36 36.0
3x25x26 54 36.0
3x25x26 54 36.0
7x15x20 42 42.0
7x15x20 42 42.0
10x13x13 36 60.0
10x13x13 36 60.0
8x15x17 40 60.0
8x15x17 40 60.0


Triangles with an area of: 210
Triangles with an area of: 210
17x25x28 70 210.0
17x25x28 70 210.0
20x21x29 70 210.0
20x21x29 70 210.0
12x35x37 84 210.0
12x35x37 84 210.0
17x28x39 84 210.0
17x28x39 84 210.0
7x65x68 140 210.0
7x65x68 140 210.0
3x148x149 300 210.0
3x148x149 300 210.0
</pre>
</pre>