Advertisement
Guest User

Untitled

a guest
Dec 8th, 2015
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.49 KB | None | 0 0
  1. import numpy as np
  2.  
  3. ops = {                                
  4.     "AND"   : lambda x,y: np.bitwise_and(x,y),      
  5.     "OR"    : lambda x,y: np.bitwise_or(x,y),      
  6.     "NOT"   : lambda x,y: np.invert(x),        
  7.     "RSHIFT": lambda x,y: np.right_shift(x,y),    
  8.     "LSHIFT": lambda x,y: np.left_shift(x,y),    
  9.     None    : lambda x,y: x
  10. }                                      
  11.  
  12. UIT = type(np.uint16(1))
  13.  
  14. def propagate(out, backlink):
  15.     if type(out) == UIT:
  16.         regs.update( {backlink: out} )
  17.  
  18. def procinput(x):
  19.     if x is None: return None
  20.     if not x.isdigit(): out = regs[x]() if not type(regs[x])==UIT else regs[x]
  21.     else: out = np.uint16(x)
  22.     return out
  23.  
  24.  
  25. def linkfunc(backlink, fromreg1, fromreg2, operator):
  26.     def func():
  27.         out = ops[operator]( procinput(fromreg1), procinput(fromreg2) )
  28.         propagate(out,backlink)
  29.         return out
  30.     return func
  31.  
  32. def main():
  33.     lines = [[ side.split() for side in line.strip().split("->")] for line in open("input7.dat","r").readlines()]
  34.  
  35.     regs = {}
  36.     for line in lines:
  37.         lside,rside = line
  38.         toreg = rside[0]
  39.         if   len(lside) == 1: fromreg1, fromreg2, operator = lside[0], None, None
  40.         elif len(lside) == 2: fromreg1, fromreg2, operator = lside[1], None, lside[0]
  41.         elif len(lside) == 3: fromreg1, fromreg2, operator = lside[0], lside[2], lside[1]
  42.         regs.update( {toreg : linkfunc( toreg, fromreg1, fromreg2, operator)} )
  43.  
  44.     print "Contents of register 'a' is: ", regs["a"]()
  45.  
  46. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement