Display a linear combination: Difference between revisions

From Rosetta Code
Content added Content deleted
(we don't really need decimal numbers)
(Perl 6 solution)
Line 24: Line 24:
9) -1, -2, 0, -3
9) -1, -2, 0, -3
10) -1</pre>
10) -1</pre>

=={{header|Perl 6}}==
<lang perl6>my @examples =

sub linear-combination(@coeff) {
my @terms = @coeff Z=> map { "e($_)" }, 1 .. *;

@terms.=grep(+*.key);

return '0' unless @terms;

my $result = join '+',
map { .key ~ '*' ~ .value },
@terms;

$result ~~ s:g/'+-'/-/;
$result ~~ s:g/<|w>1\*//;
return $result;
}

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>
{{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>

Revision as of 20:43, 11 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>my @examples =

sub linear-combination(@coeff) {

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

}

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)