Display a linear combination: Difference between revisions

From Rosetta Code
Content added Content deleted
m (added task name to header, don't know why TOC doesn't show)
(Undo revision 213536 by Craigd (talk) pretty sure that is not necessary. The TOC shows up only with more header entries.)
Line 1: Line 1:
{{draft task|Display a linear combination}}
{{draft task}}


The purpose of this task is to display a finite [[wp:linear combination|linear combination]] in an infinite vector basis <math>(e_0, e_1,\ldots)</math>.
The purpose of this task is to display a finite [[wp:linear combination|linear combination]] in an infinite vector basis <math>(e_0, e_1,\ldots)</math>.

Revision as of 22:04, 12 October 2015

Display a linear combination is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

The purpose of this task is to display a finite linear combination in an infinite vector basis .

Write a function that, when given a finite list of scalars , creates a string representing the linear combination

Your output must comply to the following rules:

  • you don't show null terms, unless the whole combination is null. For instance while the output "0" is fine, "e(0) + 0*e(3)" or "0 + e(1)" are wrong.
  • you don't show scalars when they are equal to one or minus one. For instance the string "1*e(3)" is wrong.
  • you don't prefix by '-' if it follows a preceding term. Instead you use subtraction. Thus "e(4) - e(5)" is correct while "e(4) + -e(5)" is wrong.

Show here output for the following lists of scalars:

1)   1, 2, 3
2)   0, 1, 2, 3
3)   1, 0, 3, 4
4)   1, 2, 0
5)   0, 0, 0
6)   0
7)   1, 1, 1
8)   -1, -1, -1
9)   -1, -2, 0, -3
10)  -1

Perl 6

<lang perl6>sub linear-combination(@coeff) {

   (@coeff Z=> map { "e($_)" }, 1 .. *)\
   .grep(+*.key)\
   .map({ .key ~ '*' ~ .value })\
   .join('+')\
   .subst('+-', '-', :g)\
   .subst(/<|w>1\*/, , :g)
       || '0'

}

say linear-combination($_) for [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>
Output:
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)

zkl

Translation of: Perl 6

<lang zkl>fcn linearCombination(coeffs){

  [1..].zipWith(fcn(n,c){ if(c==0) "" else "%s*e(%s)".fmt(c,n) },coeffs)
     .filter().concat("+").replace("+-","-").replace("1*","")
  or 0

}</lang> <lang zkl>T(T(1,2,3),T(0,1,2,3),T(1,0,3,4),T(1,2,0),T(0,0,0),T(0),T(1,1,1),T(-1,-1,-1),

 T(-1,-2,0,-3),T(-1),T)

.pump(Console.println,linearCombination);</lang>

Output:
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)
0