Advertisement
Guest User

Untitled

a guest
Jan 11th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 7.92 KB | None | 0 0
  1. module main;
  2.  
  3. import std.stdio;
  4. import std.string;
  5. import std.conv;
  6. import std.file;
  7. import std.ascii;
  8.  
  9. enum Operation {
  10. EMPTY, VALUE, IS, AND, OR, LSHIFT, RSHIFT, NOT
  11. }
  12.  
  13. class Node {
  14.     Node[] deps;
  15.     Operation operation;
  16.     string name;
  17.     ushort value;
  18.     bool   computed = false;
  19.  
  20.     this() {
  21.         value = 0;
  22.     }
  23.  
  24.     this(ushort val) {
  25.         value = val;
  26.         operation = Operation.VALUE;
  27.         computed = true;
  28.     }
  29.  
  30.     this(string nm) {
  31.         name = nm.idup;
  32.         operation = Operation.EMPTY;
  33.     }
  34.  
  35.     this(string nm, Operation oper) {
  36.         name = nm.idup;
  37.         operation = oper;
  38.     }
  39.  
  40.     void setOperation(Operation op) {
  41.         operation = op;
  42.     }
  43.  
  44. //TODO
  45.     void print() {
  46.         switch(operation) {
  47.             case Operation.AND:
  48.                 write(name);
  49.                 write("{");
  50.                 deps[0].print();
  51.                 write("} AND {");
  52.                 deps[1].print();
  53.                 write("}");
  54.                 break;
  55.             case Operation.OR:
  56.                 write(name);
  57.                 write("{");
  58.                 deps[0].print();
  59.                 write("} OR {");
  60.                 deps[1].print();
  61.                 write("}");
  62.                 break;
  63.             case Operation.NOT:
  64.                 write(name);
  65.                 write("{");
  66.                 write("NOT {");
  67.                 deps[0].print();
  68.                 write("}}");
  69.                 break;
  70.             case Operation.LSHIFT:
  71.                 write(name);
  72.                 write("{");
  73.                 deps[0].print();
  74.                 write("} << {");
  75.                 deps[1].print();
  76.                 write("}");
  77.                 break;
  78.             case Operation.RSHIFT:
  79.                 write(name);
  80.                 write("{");
  81.                 deps[0].print();
  82.                 write("} >> {");
  83.                 deps[1].print();
  84.                 write("}");
  85.                 break;
  86.             case Operation.IS:
  87.                 write(name);
  88.                 write("{");
  89.                 deps[0].print();
  90.                 write("}");
  91.                 break;
  92.             case Operation.VALUE:
  93.                 write(getValue());
  94.                 break;
  95.             default:
  96.                 writeln("NO OPERATION!");
  97.                 break;
  98.         }
  99.     }
  100.  
  101.     string getName() {
  102.         return name;
  103.     }
  104.  
  105.     ushort getValue() {
  106.         return value;
  107.     }
  108.  
  109.     string getString() {
  110.         string result;
  111.         if(operation == Operation.VALUE)
  112.             result = to!string(value);
  113.         else
  114.             result = name;
  115.         return result;
  116.     }
  117.  
  118.     void addDep(Node dep) {
  119.         deps = deps ~ dep;
  120.     }
  121.  
  122.     ushort getResult() {
  123.         ushort x, y, result = 0;
  124.         if (computed) {
  125.             result = value;
  126.         }
  127.         else {
  128.         switch(operation) {
  129.             case Operation.AND:
  130.             case Operation.OR:
  131.             case Operation.RSHIFT:
  132.             case Operation.LSHIFT:
  133.                 x = deps[0].getResult();
  134.                 y = deps[1].getResult();
  135.                 switch(operation) {
  136.                     case Operation.AND:
  137.                         result = x & y;
  138.                         break;
  139.                     case Operation.OR:
  140.                         result = x | y;
  141.                         break;
  142.                     case Operation.LSHIFT:
  143.                         result = cast(ushort)(x << y);
  144.                         break;
  145.                     case Operation.RSHIFT:
  146.                         result = cast(ushort)(x >>> y);
  147.                         break;
  148.                     default:
  149.                         break;
  150.                 }
  151.                 value = result;
  152.                 computed = true;
  153.                 break;
  154.             case Operation.NOT:
  155.                 x = deps[0].getResult();
  156.                 result = ~x;
  157.                 value = result;
  158.                 computed = true;
  159.                 break;
  160.             case Operation.IS:
  161.                 result = deps[0].getResult();
  162.                 value = result;
  163.                 computed = true;
  164.                 break;
  165.             case Operation.VALUE:
  166.                 result = value;
  167.                 break;
  168.             default:
  169.                 writeln("EMPTY!");
  170.                 break;
  171.             }
  172.         }
  173.         return result;
  174.     }
  175. }
  176.  
  177.  
  178.  
  179. int main(string[] args)
  180. {
  181.     Node[] nodes;
  182.     nodes.length = 0;
  183.  
  184.     Node contains(string name) {
  185.         foreach(Node node; nodes) {
  186.             if(cmp(node.getName(), name) == 0)
  187.                 return node;
  188.         }
  189.         return null;
  190.     }
  191.  
  192.     void addParameter(Node node, string param) {
  193.         Node nodeChild;
  194.         if(isDigit(param[0])) {
  195.             nodeChild = new Node(to!ushort(param));
  196.             node.addDep(nodeChild);
  197.         } else {
  198.             nodeChild = contains(param);
  199.             if (nodeChild is null) {
  200.                 writeln("..creating new child1, name = " ~ param);
  201.                 nodeChild = new Node(param);
  202.                 nodes = nodes ~ nodeChild;
  203.             }
  204.             node.addDep(nodeChild);
  205.         }
  206.     }
  207.  
  208.     void parse(string str) {
  209.         Node node, nodeChild1, nodeChild2;
  210.         auto lexems = split(str);
  211.         writeln(lexems);
  212.         string name, expr, param1, param2;
  213.  
  214.         foreach(k, word; lexems) {
  215.             if (cmp(word, "->") == 0) {
  216.                 name = lexems[k+1];
  217.                 writeln("name: "~ name);
  218.  
  219.                 node = contains(name);
  220.                 if (node is null) {
  221.                     writeln("..creating new..");
  222.                     node = new Node(name);
  223.                     nodes = nodes ~ node;
  224.                 }
  225.  
  226.                 if (lexems.length > 3) {
  227.                     expr = lexems[k-2];
  228.  
  229.                     if(cmp(expr, "AND") == 0){
  230.                         node.setOperation(Operation.AND);
  231.                         param1 = lexems[k-3];
  232.                         param2 = lexems[k-1];
  233.                         addParameter(node, param1);
  234.                         addParameter(node, param2);
  235.  
  236.                     }
  237.                     else if(cmp(expr, "OR") == 0) {
  238.                         node.setOperation(Operation.OR);
  239.                         param1 = lexems[k-3];
  240.                         param2 = lexems[k-1];
  241.                         addParameter(node, param1);
  242.                         addParameter(node, param2);
  243.                     }
  244.                     else if(cmp(expr, "NOT") == 0) {
  245.                         node.setOperation(Operation.NOT);
  246.                         param1 = lexems[k-1];
  247.                         addParameter(node, param1);
  248.                     }
  249.  
  250.                     else if(cmp(expr, "LSHIFT") == 0) {
  251.                         node.setOperation(Operation.LSHIFT);
  252.                         param1 = lexems[k-3];
  253.                         param2 = lexems[k-1];
  254.                         addParameter(node, param1);
  255.                         addParameter(node, param2);
  256.                     }
  257.  
  258.                     else if(cmp(expr, "RSHIFT") == 0) {
  259.                         node.setOperation(Operation.RSHIFT);
  260.                         param1 = lexems[k-3];
  261.                         param2 = lexems[k-1];
  262.                         addParameter(node, param1);
  263.                         addParameter(node, param2);
  264.                     }
  265.                 }
  266.                 else {
  267.                     param1 = lexems[k-1];
  268.                     node.setOperation(Operation.IS);
  269.                     addParameter(node, param1);
  270.                 }
  271.             }
  272.         }
  273.     }
  274.  
  275.     foreach(char[] line; File("input3.txt").byLine()) {
  276.         string s = line.dup;
  277.         parse(s);
  278.     }
  279.  
  280.     writeln("===");
  281.     foreach(Node n; nodes) {
  282.         if(cmp(n.getName(), "a") == 0)
  283.         {
  284.             writeln();
  285.             writeln("a = " ~ to!string(n.getResult()));
  286.             break;
  287.         }
  288.     }
  289.  
  290.  
  291.     return 0;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement