Heronian triangles: Difference between revisions
Content deleted Content added
m →{{header|REXX}}: removed code to it's proper place alphabetically. |
|||
Line 420: | Line 420: | ||
(7, 65, 68) perim: 140 area: 210 |
(7, 65, 68) perim: 140 area: 210 |
||
(3, 148, 149) perim: 300 area: 210</pre> |
(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}}== |
=={{header|REXX}}== |
||
Line 591: | Line 508: | ||
5 area: 210 perimeter: 140 sides: 7 65 68 |
5 area: 210 perimeter: 140 sides: 7 65 68 |
||
6 area: 210 perimeter: 300 sides: 3 148 149 |
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> |
</pre> |
||