/////////////////////////////////////////////////////////////////////////// // Copyright (C) 2011 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// // returns S = input \ delete list wasSubtractSubList(list input, list delete) { do { string tok = llList2String(delete, 0); list clean = input; do { if(llList2String(clean, 0) == tok) { integer idx = llListFindList(input, (list)tok); input = llDeleteSubList(input, idx, idx); } } while(clean = llDeleteSubList(clean, 0, 0)); } while(delete = llDeleteSubList(delete, 0, 0)); return input; } /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2011 Wizardry and Steamworks - License: GNU GPLv3 // /////////////////////////////////////////////////////////////////////////// // transposes a square matrix of ord columns list wasMatrixTranspose(list matrix, integer ord) { list result = []; integer mLength = llGetListLength(matrix); integer j = 0; do { integer i = j; do { result += llList2String(matrix, i); i += ord; } while(i0) jump found_notecard; llSetText("Drop a matrix inside me!", <0,1,0>, 1); return; @found_notecard; llSetText("Reading notecard...\nPlease wait...", <1,1,0>, 1); nName = llGetInventoryName(INVENTORY_NOTECARD, 0); nQuery = llGetNotecardLine(nName, nLine); } dataserver(key id, string data) { if(id != nQuery) return; if(data == EOF) { llSetText("Touch to compute!", <0,1,0>, 1); llRemoveInventory(nName); return; } if(data == "") jump next_line; list input = llParseString2List(data, [" "], []); matrix += input; columns = llGetListLength(input); @next_line; nQuery = llGetNotecardLine(nName, ++nLine); } touch_start(integer num) { if(llGetListLength(matrix) == 0) return; state compute; } changed(integer change) { if(change & CHANGED_INVENTORY) llResetScript(); } on_rez(integer num) { llResetScript(); } } state compute { state_entry() { llMessageLinked(LINK_THIS, 0, "start", NULL_KEY); llShout(0, "-------------------------------"); float det_m = wasDeterminant(matrix, columns); llShout(0, "Determinant is: " + (string)det_m); list adjugate_m = wasMatrixAdjugate(matrix, columns); llShout(0, "Adjugate is: " + llDumpList2String(adjugate_m, " ")); list inverse_m = wasMatrixInverse(adjugate_m, det_m); llShout(0, "Inverse matrix is: " + llDumpList2String(inverse_m, " ")); llShout(0, "-------------------------------"); llMessageLinked(LINK_THIS, 0, "stop", NULL_KEY); state default; } changed(integer change) { if(change & CHANGED_INVENTORY) llResetScript(); } }