Heronian triangles: Difference between revisions

→‎{{header|Ruby}}: mostly cosmetic; made valid? a class method.
(→‎{{header|Ruby}}: Added Ruby)
(→‎{{header|Ruby}}: mostly cosmetic; made valid? a class method.)
Line 424:
<lang ruby>Triangle = Struct.new(:a, :b, :c) do
include Comparable
 
def valid?
def self.valid?(a,b,c) # class method
short, middle, long = sides[a, b, c].sort
short + middle > long
end
 
def valid?sides
@sides ||= [a, b, c].sort
end
 
Line 433 ⟶ 438:
end
 
def areasemiperimeter
s@semiperimeter ||= perimeter/2.0
Math.sqrt(s*(s - a)*(s - b)*(s - c))
end
 
def sidesarea
@sidess ||= [a, b, c].sortsemiperimeter
@area ||= Math.sqrt(s*(s - a)*(s - b)*(s - c))
end
 
def heronian?
aarea == area.to_i
a == a.to_i
end
 
def <=>(other)
[area, perimeter, sides] <=> [other.area, other.perimeter, other.sides]
end
 
Line 462 ⟶ 466:
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
 
prim_heronianssorted = prim_triangles.select{|triangle| triangle.valid? (&& triangle.:heronian?}).sort
sorted = prim_heronians.sort
 
puts "Primitive heronian triangles with sides upto #{max}: #{sorted.size}"
puts "\n#{'sides'.ljust(10)}nsides \tperim.\tarea"
sorted.first(10).each{|tr| puts tr }
puts "\nTriangles with an area of: #{area}"
Line 500 ⟶ 503:
3x148x149 300 210.0
</pre>
 
=={{header|zkl}}==
{{trans|Python}}
1,149

edits