Advertisement
outoftime

System modeling

Feb 10th, 2013
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1. import argparse, sys, random, time
  2. from functools import wraps
  3.  
  4. class Eint(int):
  5.     def __init__(self, number):
  6.         super(Eint, self).__init__(number)
  7.         self.digits = []
  8.         for i in range(0,6):
  9.             self.digits.append(number % 10)
  10.             number /= 10
  11.         self.digits.reverse()
  12.  
  13. class Checker(object):
  14.     def __init__(self):
  15.         self.lucky_tests = [self.__lucky_test_0]
  16.         self.special_tests = [
  17.             self.__special_test_0,
  18.             self.__special_test_1,
  19.             self.__special_test_2,
  20.             self.__special_test_3,
  21.             self.__special_test_4,
  22.             self.__special_test_5,
  23.             self.__special_test_6,
  24.             self.__special_test_7,
  25.             self.__special_test_8,
  26.             self.__special_test_9
  27.         ]
  28.         self.n = 10
  29.  
  30.     def __check_test_list(self, number, test_list):
  31.         for index, test in enumerate(test_list):
  32.             if test(number): return True
  33.         return False
  34.  
  35.     def is_lucky(self, number):
  36.         return self.__check_test_list(number, self.lucky_tests)
  37.  
  38.     def is_special(self, number):
  39.         return self.__check_test_list(number, self.special_tests[9:])
  40.  
  41.     def __lucky_test_0(self, n):
  42.         return sum(n.digits[3:]) == sum(n.digits[:3]) == self.n
  43.  
  44.     def __special_test_0(self, n):
  45.         for i in range(0,6):
  46.             if n.digits.count(n.digits[i]) > 1: return False
  47.         return True
  48.  
  49.     def __special_test_1(self, n):
  50.         for i in range(0,4):
  51.             if n.digits[i:i+3].count(n.digits[i]) == 3: return True
  52.         return False
  53.  
  54.     def __special_test_2(self, n):
  55.         for i in range(0,6):
  56.             if n.digits.count(n.digits[i]) > 3: return True
  57.         return False
  58.  
  59.     def __special_test_3(self, n):
  60.         return abs(sum(n.digits[3:]) - sum(n.digits[:3])) == 1
  61.  
  62.     def __special_test_4(self, n):
  63.         for i in range(0,5):
  64.             if n.digits[i] >= n.digits[i+1]: return False
  65.         return True
  66.  
  67.     def __special_test_5(self, n):
  68.         for i in range(0,5):
  69.             if n.digits[i] < n.digits[i+1]: return False
  70.         return True
  71.  
  72.     def __special_test_6(self, n):
  73.         for i in range(0,5):
  74.             if n.digits[i] == '1' and n.digits[i+1] == '3': return True
  75.         return False
  76.  
  77.     def __special_test_7(self, n):
  78.         return sum(n.digits[3:]) == 13 or sum(n.digits[:3]) == 13
  79.  
  80.     def __special_test_8(self, n):
  81.         for i in range(0,6):
  82.             if n.digits[i] & 1 == 0: return False
  83.         return True
  84.  
  85.     def __special_test_9(self, n):
  86.         for i in range(0,6):
  87.             if n.digits[i] & 1 == 1 or n.digits[i] == 0: return False
  88.         return True
  89.  
  90. class timed(object):
  91.     def __init__(self, desc):
  92.         self.desc = desc
  93.  
  94.     def __call__(self, func):
  95.         @wraps(func)
  96.         def wrapper(*args, **kwargs):
  97.             start = time.time()
  98.             ret = func(*args, **kwargs)
  99.             print self.desc.format(time.time() - start)
  100.             return ret
  101.  
  102.         return wrapper
  103.  
  104. def counter(generator):
  105.     @wraps(generator)
  106.     def wrapper(iterations=1000000):
  107.         s, l, c = 0, 0, Checker()
  108.         for i in range(0, iterations):
  109.             n = generator(i)
  110.             s += int(c.is_special(n))
  111.             l += int(c.is_lucky(n))
  112.         print 'Special: {0:.6f}, lucky: {1:.6f}'.format(s / 1000000.00, l / 1000000.0)
  113.  
  114.     return wrapper
  115.  
  116. @timed('Determination processing time: {0:.4f}')
  117. @counter
  118. def determinate(i):
  119.     return Eint(i)
  120.  
  121. @timed('Imitation processing time: {0:.4f}')
  122. @counter
  123. def imitation(i):
  124.     return Eint(random.randint(0,999999))
  125.  
  126. def minimum():
  127.     pass # TODO: implement
  128.  
  129. def main(argv):
  130.     p = argparse.ArgumentParser('Lab #1')
  131.     s = p.add_subparsers(dest='model')
  132.     d = s.add_parser('d')
  133.     i = s.add_parser('i')
  134.     i.add_argument('-n', '--number', dest='n', type=int, nargs='?', help='number of tickets')
  135.     p = p.parse_args()
  136.  
  137.     if p.model == 'd': determinate()
  138.     elif p.model == 'i':
  139.         if p.n is None: minimum()
  140.         else: imitation(p.n)
  141.  
  142. if __name__ == '__main__':
  143.     main(sys.argv)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement