11.3.2011

מטריצות :)

כידוע לכם אני כותב לרוב במירק סקריפט ולמי שיצא לעבד עם התוכנה כניראה הבין שאין שם כלום XD אז אחרי דיונים כאילו ואחרים כתבתי את הפונקציה matrix על מנת לתת קלי נוסף למתכנתים וכו'
אני רוצה לציין שהפוסט הזה הוא הפוסט הראשון בסידרה די גדולה (אני מקווה) של פוסטים שיעשקו באחד מהמטרות שלי בחיים והיא לצור בינה אנושית מלחותית , תצחקו :) זה בראי . עכשיו נתחיל -

MLS:
//Matrix new name x y z
//Matrix close name
//Matrix move name x y z text
//echo -a $matrix(name).info
//echo -a $matrix(name,x,y,z)

alias Matrix {
  if ($prop == info) return $hget(Matrix,$1)
  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 | goto error }
      else {
        if ($26) { echo $color(info) -sa * Too many parameters: Matrix | goto error }
        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 | goto error }
            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 | goto error }
      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 | goto error }
    else {
      var %i = 1 , %Function = $replace($MatrixFunction(%x),0,$2) , %v1
      while (%i < %x) {
        %v1 = [ $ [ $+ [ $calc(%i + 2) ] ] ]
        ;%v1 = [ $ [ $+ [ $0 ] ] ]
        %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 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
}
קוד נורא יפה לטעמי למבד החלק של האלייס השני - עשיתי את זה בנסיון לפשט את הקוד כדי שיהיה יותר קל לקרוא ממינו אך לצערי רק סיבחתי :\ 
אז יש לנו מימוש של מטריצות , יש עד כמה דברים שהייתי רוצה לפרסם בנושא:
כפל בין שני מטריצות וחזרה של מטריצת ההכפלה.
MLS: 
mcasd <name1> <name2> <name3>
alias mcasd {
  Matrix new $3 $gettok($Matrix($2).info,1,32) $gettok($Matrix($1).info,2,32)
  var %x = 1 , %y = 1 , %z = 1 , %i = 1 , %sum = 0
  %x = 1
  while (%x <= $gettok($Matrix($1).info,2,32)) {
    %z = 1
    while (%z <= $gettok($Matrix($2).info,1,32)) {
      %y = 1
      while (%y <= $gettok($Matrix($1).info,1,32)) {
        %sum = $calc(%sum + ( $Matrix($1,%y,%x) * $Matrix($2,%z,%y) ))
        inc %y
      }
      Matrix move $3 %z %x %sum
      %sum = 0
      inc %z
    }
    inc %x
  }
}
מציג מטריצות בצורת טבלה
MLS:
alias showmatrix {
  var %x = 1 , %y , %text
  while (%x <= $gettok($matrix($1).info,2,32)) {
    %y = 1
    %text = $null
    while (%y <= $gettok($matrix($1).info,1,32)) {
      %text = %text $matrix($1,%y,%x)
      inc %y
    }
    echo -a @ %text
    inc %x
  }
}

אלי בהמשך יהיה מאמר על כפל מטריצות לכו תדעו :)
כל הזכיות שמורות ל Vendetta -  The Last Dimension

אין תגובות:

הוסף רשומת תגובה