Display a linear combination: Difference between revisions
Content added Content deleted
(J draft) |
(=={{header|Racket}}== implementation added) |
||
Line 96: | Line 96: | ||
-e(1) - e(2) - e(3) |
-e(1) - e(2) - e(3) |
||
-e(1) - 2*e(2) - 3*e(4) |
-e(1) - 2*e(2) - 3*e(4) |
||
-e(1)</pre> |
|||
=={{header|Racket}}== |
|||
<lang racket>#lang racket/base |
|||
(require racket/match racket/string) |
|||
(define (linear-combination->string es) |
|||
(let inr ((es es) (i 1) (rv "")) |
|||
(match* (es rv) |
|||
[((list) "") "0"] |
|||
[((list) rv) rv] |
|||
[((list (? zero?) t ...) rv) |
|||
(inr t (add1 i) rv)] |
|||
[((list n t ...) rv) |
|||
(define ±n |
|||
(match* (n rv) |
|||
;; zero is handled above |
|||
[(1 "") ""] |
|||
[(1 _) "+"] |
|||
[(-1 _) "-"] |
|||
[((? positive? n) (not "")) (format "+~a*" n)] |
|||
[(n _) (format "~a*" n)])) |
|||
(inr t (add1 i) (string-append rv ±n "e("(number->string i)")"))]))) |
|||
(for-each |
|||
(compose displayln linear-combination->string) |
|||
'((1 2 3) |
|||
(0 1 2 3) |
|||
(1 0 3 4) |
|||
(1 2 0) |
|||
(0 0 0) |
|||
(0) |
|||
(1 1 1) |
|||
(-1 -1 -1) |
|||
(-1 -2 0 -3) |
|||
(-1))) |
|||
</lang> |
|||
{{out}} |
|||
<pre>e(1)+2*e(2)+3*e(3) |
|||
e(2)+2*e(3)+3*e(4) |
|||
e(1)+3*e(3)+4*e(4) |
|||
e(1)+2*e(2) |
|||
0 |
|||
0 |
|||
e(1)+e(2)+e(3) |
|||
-e(1)-e(2)-e(3) |
|||
-e(1)-2*e(2)-3*e(4) |
|||
-e(1)</pre> |
-e(1)</pre> |
||