# mencalc.py

Aug 7th, 2018
80
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. import time
2. import random
3. import curses
4.
5. # + num -> prime factors list
6. # + frac -> irreducible frac
7.
8. # ?+ pause button
9. # ?+ save scores
10.
11. TIME = 1000
12.
13. # The timer class
14. class Timer():
15.     def __init__(self):
16.         pass
17. #        self.target = time.time() + 5
18.     def init(self, duration):
19.         self.target = time.time() + duration
21.         self.target += 5
22.     def get_left(self):
23.         return int(self.target - time.time())
24.
25. def curses_clearline(scr, ln):
26.     y, x = scr.getyx()
27.     scr.move(ln, 0)
28.     scr.clrtoeol()
29.     scr.move(y, x)
30.
31. DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', \
32.           '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
33.
35.     n = int(number)
37.     assert (r <= 16)
38.     if n == 0:
39.         return "0"
40.     s = ""
41.     while (n > 0):
42.         s = DIGITS[n % r] + s
43.         n //= r
44.     return s
45.
46. NI_NSIZE    = 0
48. NI_PARAM3   = 2
49. NI_DISPTIME = 3
50.
51. # The main program
52. stdscr = curses.initscr()
53. stdscr.nodelay(True)
54. curses.noecho()
55. t = Timer()
56. q = False
57. op = '+'
58. nsize = 3
60. param3 = 0
61. input_display_duration = 0
62. # ^ formula display duration (for forcing to keep the input in mind).
63. dr = [0, 0]
64. sr = [0, 0]
65. num_input_mode = NI_NSIZE
66. # This is the main loop done in curses, but you can implement it with
67. # a GUI toolkit or any other method you wish.
68. while not q:
69.     if op == '=':
73.         n1 = random.randint(0, radix ** nsize - 1)
74.         hl_left = "#{}->#{}:  ".format(DIGITS[radix], DIGITS[param3])
76.     else:
77.         if param3 == 0:
78.             size2 = nsize
79.         else:
80.             size2 = param3
81.         if not (op == '-' and nsize == 1):
82.             n1 = random.randint(2, radix ** nsize - 1)
83.             n2 = random.randint(2, radix ** size2 - 1)
84.         else:
86.             n2 = random.randint(2, radix - 1)
87.         if op == '^' or op == '_':
88.             n2 = param3
89.             if n2 < 2:
90.                 n2 = 2
91.         elif (op == '-' or op == '/') and n1 < n2:
92.             n1, n2 = n2, n1
94.         if (op == '!'):
96.         else:
97.             hl_val = "{} " + op + " {}"
99.     if sr[0] > 0:
100.         hl_right = "  |  success: %d / %d = %.3f; mean time: %.3fs"
101.         hl_right %= (sr[1], sr[0], float(sr[1]) / sr[0], dr[1] / dr[0])
102.     else:
103.         hl_right = ""
104. #    stdscr.hline(0, 0, ' ', 64)
105.     curses_clearline(stdscr, 0)
106.     stdscr.addstr(0, 0, hl_left + hl_val + hl_right)
107.     input_display_end_time = input_display_duration + time.time()
108.     t.init(TIME)
109.     d = time.time()
110.     while True:
111.         left = t.get_left()
112.         if left <= 0:
113.             break
114.         if input_display_duration > 0 and time.time() >= input_display_end_time:
115.             curses_clearline(stdscr, 0)
116.             stdscr.addstr(0, 0, hl_left + op.ljust(len(hl_val), ' ') + hl_right)
117.         stdscr.addstr(1, 0, '%s sec\n' % str(left).zfill(3))
118.         c = stdscr.getch()
119.         if c == ord('i'):
121.         elif c == ord('x'):
122.             break
123.         elif c == ord('q'):
124.             q = True
125.             break
126.     d = time.time() - d
127.     dr[1] += d
128.     dr[0] += 1
129.     curses_clearline(stdscr, 1)
130.     if op == '=':
132.     elif op == '+':
133.         v = intposnot(n1 + n2, radix)
134.     elif op == '-':
135.         v = intposnot(n1 - n2, radix)
136.     elif op == '*':
137.         v = intposnot(n1 * n2, radix)
138.     elif op == '/':
139.         v = "[" + intposnot(n1 / n2, radix) \
140.           + ", " + intposnot(n1 % n2, radix) + "]"
141.     elif op == '^':
142.         v = intposnot(n1 ** n2, radix)
143.     elif op == '_':
144.         rt = int(n1 ** (1. / n2))
145.         v = "[" + intposnot(rt, radix) \
146.           + ", " + intposnot(n1 - rt ** n2, radix) + "]"
147.     elif op == '!':
148.         n2 = 1
149.         while n1 > 1:
150.             n2 *= n1
151.             n1 -= 1
153.     elif op == '~':
154.         # gcd(n1, n2)
155.         if n1 < n2:
156.             n1, n2 = n2, n1
157.         while True:
158.             r = n1 % n2
159.             if r == 0:
160.                 break
161.             n1, n2 = n2, r
163.     curses_clearline(stdscr, 0)
164.     stdscr.addstr(0, 0, hl_left + hl_val + hl_right)
165.     stdscr.addstr(1, 0, "   = {}  |  {}s  |  mean: {}s\n".format( \
166.                         v, '%.3f' % d, '%.3f' % (dr[1] / dr[0])))
167.     t.init(16)
168.     while True:
169.         if t.get_left() <= 0:
170.             break
171.         c = stdscr.getch()
172.         if c in (ord('+'), ord('-'), ord('*'), ord('/'), ord('^'), \
173.                  ord('_'), ord('!'), ord('~'), ord('=')):
174.             op = chr(c)
175.         elif c in range(0x100) and chr(c) in DIGITS:
176.             val = DIGITS.index(chr(c))
177.             if num_input_mode == NI_NSIZE and val > 0:
178.                 nsize = val
179.             elif num_input_mode == NI_RADIX and val > 0:
181.             elif num_input_mode == NI_PARAM3:
182.                 param3 = val
183.             elif num_input_mode == NI_DISPTIME:
184.                 input_display_duration = val
185.         elif c == ord(','):
186.             num_input_mode = NI_NSIZE
187.         elif c == ord(':'):
189.         elif c == ord(';'):
190.             num_input_mode = NI_PARAM3
191.         elif c == ord('&'):
192.             num_input_mode = NI_DISPTIME
193.         elif c == ord('r'):
194.             dr = [0, 0]
195.             sr = [0, 0]
196.             break
197.         elif c == ord('c'):
198.             sr[0] += 1
199.             sr[1] += 1
200.             break
201.         elif c == ord('w'):
202.             sr[0] += 1
203.             break
204.         elif c == ord('x'):
205.             break
206.         elif c == ord('q'):
207.             q = True
208.             break
209. # Final operations start here