Add tasks for all the new languages

This commit is contained in:
Tina Müller 2016-12-05 23:44:36 +01:00
parent 9dc3c2bb62
commit bba7bfd280
13208 changed files with 134745 additions and 0 deletions

View file

@ -0,0 +1,32 @@
function ToReducedRowEchelonForm(sequence M)
integer lead = 1,
rowCount = length(M),
columnCount = length(M[1]),
i
for r=1 to rowCount do
if lead>=columnCount then exit end if
i = r
while M[i][lead]=0 do
i += 1
if i=rowCount then
i = r
lead += 1
if lead=columnCount then exit end if
end if
end while
-- nb M[i] is assigned before M[r], which matters when i=r:
{M[r],M[i]} = {sq_div(M[i],M[i][lead]),M[r]}
for j=1 to rowCount do
if j!=r then
M[j] = sq_sub(M[j],sq_mul(M[j][lead],M[r]))
end if
end for
lead += 1
end for
return M
end function
? ToReducedRowEchelonForm(
{ { 1, 2, -1, -4 },
{ 2, 3, -1, -11 },
{ -2, 0, -3, 22 } })

View file

@ -0,0 +1,59 @@
func rref (Array m) {
m.is_empty && return;
var (lead, rows, cols) = (0, m.len, m[0].len);
rows.range.each { |r|
lead >= cols && return m;
var i = r;
while (!m[i][lead]) {
++i == rows || next;
i = r;
++lead == cols && return m;
}
m[i, r] = m[r, i];
var lv = m[r][lead];
m[r] = (m[r] »/» lv);
rows.range.each { |n|
n == r && next;
m[n] = (m[n] »-« (m[r] «*« m[n][lead]))
}
++lead;
}
return m
}
func say_it (message, array) {
say "\n#{message}";
array.each { |row|
say row.map { |n| " %5s" % n.as_rat }.join
}
}
var M = [
[ # base test case
[ 1, 2, -1, -4 ],
[ 2, 3, -1, -11 ],
[ -2, 0, -3, 22 ],
],
[ # mix of number styles
[ 3, 0, -3, 1 ],
[ .5, 3/2, -3, -2 ],
[ .2, 4/5, -1.6, .3 ],
],
[ # degenerate case
[ 1, 2, 3, 4, 3, 1],
[ 2, 4, 6, 2, 6, 2],
[ 3, 6, 18, 9, 9, -6],
[ 4, 8, 12, 10, 12, 4],
[ 5, 10, 24, 11, 15, -4],
],
];
M.each { |matrix|
say_it('Original Matrix', matrix);
say_it('Reduced Row Echelon Form Matrix', rref(matrix));
say '';
}

View file

@ -0,0 +1,40 @@
var lead = 0
var rowCount = eCount
var columnCount = mCount
for (var r = 0; r < rowCount; ++r) {
if (columnCount <= lead) {
break
}
var i = r
while (matrix[i][lead] == 0) {
++i
if (i == rowCount) {
i = r
++lead
if (columnCount == lead) {
--lead
break
}
}
}
for (var j = 0; j < columnCount; ++j) {
var temp = matrix[r][j]
matrix[r][j] = matrix[i][j]
matrix[i][j] = temp
}
var div = matrix[r][lead]
if (div != 0) {
for (var j = 0; j < columnCount; ++j) {
matrix[r][j] /= div
}
}
for (var j = 0; j < rowCount; ++j) {
if (j != r) {
var sub = matrix[j][lead]
for (var k = 0; k < columnCount; ++k) {
matrix[j][k] -= (sub * matrix[r][k])
}
}
}
++lead
}

View file

@ -0,0 +1,90 @@
CLOSE DATABASES ALL
LOCAL lnRows As Integer, lnCols As Integer, lcSafety As String
LOCAL ARRAY matrix[1]
lcSafety = SET("Safety")
SET SAFETY OFF
CLEAR
CREATE CURSOR results (c1 B(6), c2 B(6), c3 B(6), c4 B(6))
CREATE CURSOR curs1(c1 I, c2 I, c3 I, c4 I)
INSERT INTO curs1 VALUES (1,2,-1,-4)
INSERT INTO curs1 VALUES (2,3,-1,-11)
INSERT INTO curs1 VALUES (-2,0,-3,22)
lnRows = RECCOUNT() && 3
lnCols = FCOUNT() && 4
SELECT * FROM curs1 INTO ARRAY matrix
IF RREF(@matrix, lnRows, lnCols)
SELECT results
APPEND FROM ARRAY matrix
BROWSE NORMAL IN SCREEN
ENDIF
SET SAFETY &lcSafety
FUNCTION RREF(mat, tnRows As Integer, tnCols As Integer) As Boolean
LOCAL lnPivot As Integer, i As Integer, r As Integer, j As Integer, ;
p As Double. llResult As Boolean, llExit As Boolean
llResult = .T.
llExit = .F.
lnPivot = 1
FOR r = 1 TO tnRows
IF lnPivot > tnCols
EXIT
ENDIF
i = r
DO WHILE mat[i,lnPivot] = 0
i = i + 1
IF i = tnRows
i = r
lnPivot = lnPivot + 1
IF lnPivot > tnCols
llExit = .T.
EXIT
ENDIF
ENDIF
ENDDO
IF llExit
EXIT
ENDIF
ASwapRows(@mat, i, r)
p = mat[r,lnPivot]
IF p # 0
FOR j = 1 TO tnCols
mat[r,j] = mat[r,j]/p
ENDFOR
ELSE
? "Divison by zero."
llResult = .F.
EXIT
ENDIF
FOR i = 1 TO tnRows
IF i # r
p = mat[i,lnPivot]
FOR j = 1 TO tnCols
mat[i,j] = mat[i,j] - mat[r,j]*p
ENDFOR
ENDIF
ENDFOR
lnPivot = lnPivot + 1
ENDFOR
RETURN llResult
ENDFUNC
PROCEDURE ASwapRows(arr, tnRow1 As Integer, tnRow2 As Integer)
*!* Interchange rows tnRow1 and tnRow2 of array arr.
LOCAL n As Integer
n = ALEN(arr,2)
LOCAL ARRAY tmp[1,n]
STORE 0 TO tmp
ACPY2(@arr, @tmp, tnRow1, 1)
ACPY2(@arr, @arr, tnRow2, tnRow1)
ACPY2(@tmp, @arr, 1, tnRow2)
ENDPROC
PROCEDURE ACPY2(m1, m2, tnSrcRow As Integer, tnDestRow As Integer)
*!* Copy m1[tnSrcRow,*] to m2[tnDestRow,*]
*!* m1 and m2 must have the same number of columns.
LOCAL n As Integer, e1 As Integer, e2 As Integer
n = ALEN(m1,2)
e1 = AELEMENT(m1,tnSrcRow,1)
e2 = AELEMENT(m2,tnDestRow,1)
ACOPY(m1, m2, e1, n, e2)
ENDPROC