Heronian triangles: Difference between revisions
Content deleted Content added
add swift |
→{{header|Racket}}: Much improved code, still generate html, but via scribble/html |
||
Line 1,181:
=={{header|Racket}}==
<lang>#lang at-exp racket
(require
;; Returns the area of a triangle iff the sides
;; integer; #f otherwise
(sqrt (* s (- s a) (- s b) (- s c)))) ; A = \sqrt{s(s-a)(s-b)(s-c)}▼
(define (heronian?-area a b c)
(let ((h (A a b c))) (and (integer? h) h))))▼
(and (= 1 (gcd a b c))
(
(and (integer? s) ; (s must be an integer for the area to b an integer)
(let-values ([[q r] (integer-sqrt/remainder ; (faster than sqrt)
(* s (- s a) (- s b) (- s c)))])
(and (zero? r) q)))))) ; (return only integer areas)
(define (generate-heronian-triangles max-side)
(for*/list ([c (in-range 1 (add1 max-side))]
;; datum-order can sort this for the tables (c is the max side length)
;; Order the triangles by first increasing area, then by increasing perimeter,
;; then by increasing maximum side lengths
(define (tri
(sort triangles (λ(t1 t2) (eq? '< (datum-order t1 t2)))))
`(table▼
(tr (th "#") (th "sides") (th "perimiter") (th "area")) "\n"▼
(define (
(tr (map th '("#" sides perimeter area))) "\n"
(for/list ([i (in-naturals 1)] [triangle (in-list triangles)])
(match-define (list area perimeter max-side sides) triangle)
▲ (tr (
(module+ main
(define ts (generate-heronian-triangles 200))
(
@; Show the first ten ordered triangles in a table of sides, perimeter,
▲ (p "number of primitive triangles found with perimeter "le" 200 = " ,(~a (length ts))) "\n"
}))</lang>
This program generates HTML, so the output is inline with the page, not in a <code><pre></code> block.
Line 1,242 ⟶ 1,232:
<div><p>number of primitive triangles found with perimeter ≤ 200 = 517</p>
<table><tr><th>#</th><th>sides</th><th>
<tr><td>1</td><td>
</tr><tr><td>2</td><td>
</tr><tr><td>3</td><td>
</tr><tr><td>4</td><td>
</tr><tr><td>5</td><td>
</tr><tr><td>6</td><td>
</tr><tr><td>7</td><td>
</tr><tr><td>8</td><td>
</tr><tr><td>9</td><td>
</tr><tr><td>10</td><td>
</tr></table>
<table><tr><th>#</th><th>sides</th><th>
<tr><td>1</td><td>
</tr><tr><td>2</td><td>
</tr><tr><td>3</td><td>
</tr><tr><td>4</td><td>
</tr><tr><td>5</td><td>
</tr><tr><td>6</td><td>
</tr></table></div>
|