소스 검색

реализовал функции для сетов и конвертеры

p.kushnir 10 년 전
부모
커밋
aec26b3e89
9개의 변경된 파일142개의 추가작업 그리고 176개의 파일을 삭제
  1. 0 100
      lib/nons.dart
  2. 14 0
      lib/tri/conv.dart
  3. 0 0
      lib/tri/fib.dart
  4. 4 4
      lib/tri/int.dart
  5. 1 0
      lib/tri/mathe.dart
  6. 78 0
      lib/tri/nons.dart
  7. 0 0
      lib/tri/tri.dart
  8. 37 70
      lib/tri/trits.dart
  9. 8 2
      web/main.dart

+ 0 - 100
lib/nons.dart

@@ -1,100 +0,0 @@
-part of tri;
-
-class Nons {
-  /*
-   *  
-  PROCEDURE NonsW (x: Word; OUT n: INTEGER; VAR m: ARRAY OF LONGINT);
-    VAR i: INTEGER; sign, r, s: LONGINT;
-  BEGIN
-    ASSERT((x<=maxWord) & (x>=minWord), 20); 
-    sign:=ENTIER(Math.Sign(x));
-    r:=ABS(x); i:=0;
-    IF sign#0 THEN
-      REPEAT
-        s:=r MOD 9;
-        r:=r DIV 9;
-        IF s > 4 THEN 
-          INC(r);
-          m[i]:=s-9;
-        ELSE m[i]:=s END;
-        INC(i);
-      UNTIL r<9;
-      IF r>4 THEN 
-        m[i]:=r-9; m[i+1]:=1; INC(i, 2)
-      ELSE m[i]:=r; INC(i) END;
-    END;
-    n:=i;
-    WHILE i>0 DO
-      DEC(i);
-      m[i]:=sign*m[i]
-    END;
-  END NonsW;
-  
-  PROCEDURE Dump9*(x: Word; OUT vs: ARRAY OF CHAR);
-    VAR i: INTEGER; n: INTEGER; m: ARRAY 14 OF LONGINT;
-  BEGIN
-    i:=0; WHILE i<LEN(m) DO m[i]:=0; INC(i) END;
-    NonsW(x, n, m);
-    i:=n; IF i>0 THEN vs:='' ELSE vs:='0' END;
-    WHILE i>0 DO
-      DEC(i);
-      CASE SHORT(m[i]) OF
-        -4: vs:=vs$ + 'W' + 0X|
-        -3: vs:=vs$ + 'X' + 0X|
-        -2: vs:=vs$ + 'Y' + 0X|
-        -1: vs:=vs$ + 'Z' + 0X|
-        0: vs:=vs$ + '0' + 0X|
-        1: vs:=vs$ + '1' + 0X|
-        2: vs:=vs$ + '2' + 0X|
-        3: vs:=vs$ + '3' + 0X|
-        4: vs:=vs$ + '4' + 0X|
-      ELSE HALT(0) END;
-    END;
-  END Dump9;
-  
-  PROCEDURE Ord9(IN nons: ARRAY OF LONGINT): Word;
-    VAR i: INTEGER; x: REAL; res: Word;
-  BEGIN
-    x:=nons[0];
-    FOR i:=1 TO LEN(nons)-1 DO
-      x:=x+(nons[i]*ENTIER(Math.IntPower(9, i)));
-    END;
-    res:=ENTIER(x);
-  RETURN res
-  END Ord9;
-  
-  PROCEDURE Load9* (IN vs: ARRAY OF CHAR): Word;
-    VAR i, j: INTEGER; m: ARRAY 14 OF LONGINT;
-  BEGIN
-    i:=LEN(vs$); j:=0;
-    WHILE i>0 DO
-      DEC(i); 
-      CASE CAP(vs[i]) OF
-        'Z': m[j]:=-1 |
-        'Y': m[j]:=-2 |
-        'X': m[j]:=-3 |
-        'W': m[j]:=-4
-      ELSE 
-        CASE vs[i] OF
-          '0': m[j]:=0 |
-          '1': m[j]:=1 |
-          '2': m[j]:=2 |
-          '3': m[j]:=3 |
-          '4': m[j]:=4 
-        ELSE HALT(0) END;
-      END;
-      INC(j)
-    END;
-    WHILE j<LEN(m) DO m[j]:=0; INC(j) END;
-  RETURN Ord9(m)
-  END Load9;
-  
-   */
-  static String intToString(int27 i) {
-
-  }
-
-  static int27 parse(String s) {
-
-  }
-}

+ 14 - 0
lib/tri/conv.dart

@@ -0,0 +1,14 @@
+part of tri;
+
+List<tryte>splitInt27(int27 x){
+  List ret = new List(3);
+  ret[0] = short((x << 18) >> 18);
+  ret[1] = short((x << 9) >> 18);
+  ret[2] = short(x >> 18);
+  return ret;
+}
+
+int27 mergeTryteList(List<tryte> x){
+  if(x.length!=3) throw new ArgumentError();
+  return long(x[0]) + (x[1] << 9) + (x[2] << 18);
+}

+ 0 - 0
lib/fib.dart → lib/tri/fib.dart


+ 4 - 4
lib/int.dart → lib/tri/int.dart

@@ -100,12 +100,12 @@ class tryte extends tri_num {
     return new tryte(-this._code);
   }
 
-  tryte operator <<(int x) {
-    return short((new Bits(this) << x).toInt27());
+  int27 operator <<(int x) {
+    return (new Bits(this) << x).toInt27();
   }
 
-  tryte operator >>(int x) {
-    return short((new Bits(this) >> x).toInt27());
+  int27 operator >>(int x) {
+    return (new Bits(this) >> x).toInt27();
   }
 }
 

+ 1 - 0
lib/mathe.dart → lib/tri/mathe.dart

@@ -7,6 +7,7 @@ part 'int.dart';
 part 'trits.dart';
 part 'nons.dart';
 part 'fib.dart';
+part 'conv.dart';
 
 /*
  * циклическое отрицание x + 1 (по модулю 3)

+ 78 - 0
lib/tri/nons.dart

@@ -0,0 +1,78 @@
+part of tri;
+
+/*
+ * конвертер в девятиричную строку
+ */
+class Nons {
+  static String intToString(int27 _x) {
+    List<int> m = new List(27);
+    int x = _x.toInt();
+    int sign = x.sign;
+    int r = x.abs();
+    int i = 0;
+    if (sign != 0) {
+      do {
+        int s = r % 9;
+        r = r ~/ 9;
+        if (s > 4) {
+          r++;
+          m[i] = s - 9;
+        } else {
+          m[i] = s;
+        }
+        i++;
+      } while (!(r < 9));
+      if (r > 4) {
+        m[i] = r - 9;
+        m[i + 1] = 1;
+        i = i + 2;
+      } else {
+        m[i] = r;
+        i++;
+      }
+    }  
+    String ret = "";
+    if(i==0) ret = "0";
+    else{
+      do {
+            i--;
+            switch(m[i]){
+              case -4: ret = ret+"W"; break;
+              case -3: ret = ret+"X"; break;
+              case -2: ret = ret+"Y"; break;
+              case -1: ret = ret+"Z"; break;
+              case 0: ret = ret+"0"; break;
+              case 1: ret = ret+"1"; break;
+              case 2: ret = ret+"2"; break;
+              case 3: ret = ret+"3"; break;
+              case 4: ret = ret+"4"; break;
+            }
+          } while (i != 0);
+    }
+    return ret;
+  }
+
+  static int27 parse(String ls) {
+    if(ls.length == 0) return new int27(0);
+    List<int> m = new List();
+    String s = ls.toUpperCase();
+    for(int i = s.length-1; i>=0; i--){
+      switch(s[i]){
+        case "0": m.add(0); break;
+        case "1": m.add(1); break;
+        case "2": m.add(2); break;
+        case "3": m.add(3); break;
+        case "4": m.add(4); break;
+        case "W": m.add(-4); break;
+        case "X": m.add(-3); break;
+        case "Y": m.add(-2); break;
+        case "Z": m.add(-1); break;
+      }
+    }
+    int ret = m[0];
+    for(int i = 1; i<m.length; i++){
+      ret = ret+(m[i]*pow(9, i));
+    }
+    return new int27(ret);
+  }
+}

+ 0 - 0
lib/tri.dart → lib/tri/tri.dart


+ 37 - 70
lib/trits.dart → lib/tri/trits.dart

@@ -33,85 +33,48 @@ class Bits {
     return ret;
   }
 
-  /*
-   *  PROCEDURE (VAR s: Set) And* (t: Set), NEW;
-    VAR i: Tryte; z: Set; a, b: TRiscTern.Trilean;
-  BEGIN
-    i:=1; z.Reset;
-    WHILE i<28 DO
-      a:=s.In(i); b:=t.In(i);
-      a:=TRiscTern.And(a, b);
-      IF TRiscTern.True(a) THEN z.Incl(i)
-      ELSIF TRiscTern.False(a) THEN z.Incl(SHORT(-i))
-      END;
-      INC(i);
-    END;
-    s.neg:=z.neg;
-    s.pos:=z.pos;
-  END And;
-  
-  PROCEDURE (VAR s: Set) Or* (t: Set), NEW;
-    VAR i: Tryte; z: Set; a, b: TRiscTern.Trilean;
-  BEGIN
-    i:=1; z.Reset;
-    WHILE i<28 DO
-      a:=s.In(i); b:=t.In(i);
-      a:=TRiscTern.Or(a, b);
-      IF TRiscTern.True(a) THEN z.Incl(i)
-      ELSIF TRiscTern.False(a) THEN z.Incl(SHORT(-i))
-      END;
-      INC(i);
-    END;
-    s.neg:=z.neg;
-    s.pos:=z.pos;
-  END Or;
-  
-  PROCEDURE (VAR s: Set) Sub* (t: Set), NEW;
-    VAR i: Tryte; z: Set; a, b: TRiscTern.Trilean;
-  BEGIN
-    i:=1; z.Reset;
-    WHILE i<28 DO
-      a:=s.In(i); b:=t.In(i);
-      a:=TRiscTern.And(a, TRiscTern.Not(b));
-      IF TRiscTern.True(a) THEN z.Incl(i)
-      ELSIF TRiscTern.False(a) THEN z.Incl(SHORT(-i))
-      END;
-      INC(i);
-    END;
-    s.neg:=z.neg;
-    s.pos:=z.pos;
-  END Sub;
-  
-  PROCEDURE (VAR s: Set) Div* (t: Set), NEW;
-    VAR i: Tryte; z: Set; a, b: TRiscTern.Trilean;
-  BEGIN
-    i:=1; z.Reset;
-    WHILE i<28 DO
-      a:=s.In(i); b:=t.In(i);
-      a:=TRiscTern.Not(TRiscTern.Eq(a, b));
-      IF TRiscTern.True(a) THEN z.Incl(i)
-      ELSIF TRiscTern.False(a) THEN z.Incl(SHORT(-i))
-      END;
-      INC(i);
-    END;
-    s.neg:=z.neg;
-    s.pos:=z.pos;
-  END Div;
-   */
   Bits operator +(Bits that) {
-
+    Bits ret = new Bits._new();
+    for (int i = 1; i < 28; i++) {
+      Tril x = this[i] | that[i];
+      if (x != NULL) {
+        ret = ret.incl(x.toInt * i);
+      }
+    }
+    return ret;
   }
 
   Bits operator *(Bits that) {
-
+    Bits ret = new Bits._new();
+    for (int i = 1; i < 28; i++) {
+      Tril x = this[i] & that[i];
+      if (x != NULL) {
+        ret = ret.incl(x.toInt * i);
+      }
+    }
+    return ret;
   }
 
   Bits operator -(Bits that) {
-
+    Bits ret = new Bits._new();
+    for (int i = 1; i < 28; i++) {
+      Tril x = this[i] & ~that[i];
+      if (x != NULL) {
+        ret = ret.incl(x.toInt * i);
+      }
+    }
+    return ret;
   }
 
   Bits operator /(Bits that) {
-
+    Bits ret = new Bits._new();
+    for (int i = 1; i < 28; i++) {
+      Tril x = ~eq(this[i], that[i]);
+      if (x != NULL) {
+        ret = ret.incl(x.toInt * i);
+      }
+    }
+    return ret;
   }
 
   Bits extract(int from, int to) {
@@ -205,7 +168,11 @@ class Bits {
   Bits.fromInt27(int27 x) {
     _fill(x.toInt(), 27);
   }
-
+  
+  List<Tril> toList(){
+    return _trits.toList();
+  }
+  
   @override
   String toString() {
     String ret = "";

+ 8 - 2
web/main.dart

@@ -1,5 +1,5 @@
 import 'package:unittest/unittest.dart';
-import 'package:tri/mathe.dart';
+import 'package:tri/tri/mathe.dart';
 
 void main() {
   print("$TRUE, $NULL, $FALSE");
@@ -36,8 +36,14 @@ void main() {
     expect(int27.max, equals(new Bits(int27.max).toInt27()));
     expect(new Bits(new tryte(1)) << 5, equals((new Bits(new tryte(1)) << 18) >> 13));
     expect(new int27(1) << 5, equals((new int27(1) << 18) >> 13));
-    expect(new tryte(1) << 5, isNot(equals((new tryte(1) << 18) >> 13)));
+    expect(new tryte(1) << 5, isNot(equals(short(new tryte(1) << 18) >> 13)));
     expect(new Bits(new tryte(5))[1], equals(~(new Bits(new tryte(-5))[1])));
     expect(new Bits(new tryte(0)).incl(5).incl(8).incl(-1).excl(-1), equals(new Bits(new tryte(0)).incl(5).join(new Bits(new tryte(0)).incl(8))));
   });
+  
+  test("conv", (){
+    expect(Nons.intToString(new int27(2342)), equals("32Z2"));
+    expect(Nons.parse("32Z2"), equals(new int27(2342)));
+    expect(mergeTryteList(splitInt27(new int27(4323352435))), equals(new int27(4323352435)));
+  });
 }