יוצר: Vendetta
גירסא: 2.5
תיאור: אלייס האפשר ליצג מטריצה מסדר גודל לא מגבל במירק
הפעלה:
קוד: בחר הכל
//Matrix <new/move/close> <name> x y z t q ....
$Matrix(<name>,x,y,z,q,....)
דרישות: תמיכה ב $isid
קוד:
קוד: בחר הכל
alias Matrix {
var %checkid = 0
if ($isid == $false) %checkid = 1
if (%checkid == 1) {
if ($1 == new) {
tokenize 32 $2-
if (!$3) echo $color(info) -sa * Too few parameters: Matrix
else {
if ($26) echo $color(info) -sa * Too many parameters: Matrix
else {
if ($window($+(@,$1))) {
hdel -w Matrix $1
window -c $+(@,$1)
}
var %x = 2 , %sum = 1 , %all
while ([ $ [ $+ [ %x ] ] ]) {
%all = %all $v1
%sum = $calc(%sum * $v1)
if ($v1 !isnum) { echo $color(info) -sa * Index mast be a number: Matrix | halt }
inc %x
}
window -h $+(@,$1)
%x = 1
while (%x <= %sum) { echo $+(@,$1) 0 | inc %x }
hadd -m Matrix $1 %all
}
}
}
if ($1 == close) {
hdel -w Matrix $1
window -c $+(@,$1)
}
if ($1 == move) %checkid = 2
}
if (%checkid == 2) || (%checkid == 0) {
if (%checkid == 2) tokenize 32 $2-
else tokenize 32 $1-
var %x = $0 , %n , %text , %info , %i = 1
%info = $hget(Matrix,$1)
while ($gettok(%info,%i,32)) {
if ([ $ [ $+ [ $calc(%i + 1) ] ] ] > $v1) { echo $color(info) -sa * Deviation from the limit: Matrix | halt }
inc %i
}
%text = [ $ [ $+ [ %x ] ] ]
dec %x
if (%checkid == 2) dec %x
if (%x !== $numtok(%info,32)) echo $color(info) -sa * Discrepancy between the number of indexes in the matrix and what is introduced: Matrix
else {
var %i = 1 , %Function = $replace($MatrixFunction(%x),0,$2) , %v1
while (%i < %x) {
%v1 = [ $ [ $+ [ $calc(%i + 2) ] ] ]
%Function = $replace(%Function,$chr($calc(%i + 64)),$gettok(%info,%i,32),$chr($calc(%i + 161)),%v1)
inc %i
}
if (%checkid == 2) rline $+(@,$1) $calc(%Function) %text
else return $line($+(@,$1),$calc(%Function))
}
}
}
alias -l MatrixFunction {
if ($1 > 1) {
var %x 1 , %all , %save
while (%x < $1) {
%all = %all $chr($calc(%x + 64)) %save * ( $chr($calc(%x + 161)) - 1 ) +
%save = %save * $chr($calc(%x + 64))
inc %x
}
}
return %all 0
}
קוד דוגמה:
קוד: בחר הכל
מילוי מטריצה של 10על10 בעלת 100 מקומות בלוח הכפל והחזרה של המספר שהוכנס למקום 5 על 8 של המטריצה
alias checkMatrix {
Matrix new check 10 10
var %x = 1 , %y = 1
while (%x <= 10) {
%y = 1
while (%y <= 10) {
Matrix move check %x %y $calc(%y * %x)
inc %y
}
inc %x
}
echo -a @@ $Matrix(check,8,5)
Matrix check close
}
כמו כל הקודים שלי בתקופה האחרונה הקוד בה לצורך לימוד יותר מאשר לצורך עזרה למתכנתים בפתירת בעיות בעזרתו , לכן השתדלתי לכתוב בצורה מפורטת כמה שיותר בלי להתחשב כלל ביעילות וכו'.
במידה ויש באג כזה או אחר השמח לשמוע לא בדקתי באגים מאז גירסה 1
הערה* הקוד מוגבל למשהו בסביבות ה20 מימדים מינוס פלוס , כדי להקל על הקראה שלו פיצלתי חלק מימנו לעד אלייס מה שגורם להגבלה מסויימת.