Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import time
- import random
- import curses
- # + num -> prime factors list
- # + frac -> irreducible frac
- # ?+ pause button
- # ?+ save scores
- TIME = 1000
- # The timer class
- class Timer():
- def __init__(self):
- pass
- # self.target = time.time() + 5
- def init(self, duration):
- self.target = time.time() + duration
- def add_five(self):
- self.target += 5
- def get_left(self):
- return int(self.target - time.time())
- def curses_clearline(scr, ln):
- y, x = scr.getyx()
- scr.move(ln, 0)
- scr.clrtoeol()
- scr.move(y, x)
- DIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', \
- '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G']
- def intposnot(number, radix):
- n = int(number)
- r = int(radix)
- assert (r <= 16)
- if n == 0:
- return "0"
- s = ""
- while (n > 0):
- s = DIGITS[n % r] + s
- n //= r
- return s
- NI_NSIZE = 0
- NI_RADIX = 1
- NI_PARAM3 = 2
- NI_DISPTIME = 3
- # The main program
- stdscr = curses.initscr()
- stdscr.nodelay(True)
- curses.noecho()
- t = Timer()
- q = False
- op = '+'
- nsize = 3
- radix = 2*5
- param3 = 0
- input_display_duration = 0
- # ^ formula display duration (for forcing to keep the input in mind).
- dr = [0, 0]
- sr = [0, 0]
- num_input_mode = NI_NSIZE
- # This is the main loop done in curses, but you can implement it with
- # a GUI toolkit or any other method you wish.
- while not q:
- if op == '=':
- radix2 = param3
- if radix2 < 2:
- radix2 = 2
- n1 = random.randint(0, radix ** nsize - 1)
- hl_left = "#{}->#{}: ".format(DIGITS[radix], DIGITS[param3])
- hl_val = "{}".format(intposnot(n1, radix))
- else:
- if param3 == 0:
- size2 = nsize
- else:
- size2 = param3
- if not (op == '-' and nsize == 1):
- n1 = random.randint(2, radix ** nsize - 1)
- n2 = random.randint(2, radix ** size2 - 1)
- else:
- n1 = random.randint(radix, radix * 2 - 1)
- n2 = random.randint(2, radix - 1)
- if op == '^' or op == '_':
- n2 = param3
- if n2 < 2:
- n2 = 2
- elif (op == '-' or op == '/') and n1 < n2:
- n1, n2 = n2, n1
- hl_left = "#{}: ".format(DIGITS[radix])
- if (op == '!'):
- hl_val = "{}!".format(intposnot(n1, radix))
- else:
- hl_val = "{} " + op + " {}"
- hl_val = hl_val.format(intposnot(n1, radix), intposnot(n2, radix))
- if sr[0] > 0:
- hl_right = " | success: %d / %d = %.3f; mean time: %.3fs"
- hl_right %= (sr[1], sr[0], float(sr[1]) / sr[0], dr[1] / dr[0])
- else:
- hl_right = ""
- # stdscr.hline(0, 0, ' ', 64)
- curses_clearline(stdscr, 0)
- stdscr.addstr(0, 0, hl_left + hl_val + hl_right)
- input_display_end_time = input_display_duration + time.time()
- t.init(TIME)
- d = time.time()
- while True:
- left = t.get_left()
- if left <= 0:
- break
- if input_display_duration > 0 and time.time() >= input_display_end_time:
- curses_clearline(stdscr, 0)
- stdscr.addstr(0, 0, hl_left + op.ljust(len(hl_val), ' ') + hl_right)
- stdscr.addstr(1, 0, '%s sec\n' % str(left).zfill(3))
- c = stdscr.getch()
- if c == ord('i'):
- t.add_five()
- elif c == ord('x'):
- break
- elif c == ord('q'):
- q = True
- break
- d = time.time() - d
- dr[1] += d
- dr[0] += 1
- curses_clearline(stdscr, 1)
- if op == '=':
- v = intposnot(n1, radix2)
- elif op == '+':
- v = intposnot(n1 + n2, radix)
- elif op == '-':
- v = intposnot(n1 - n2, radix)
- elif op == '*':
- v = intposnot(n1 * n2, radix)
- elif op == '/':
- v = "[" + intposnot(n1 / n2, radix) \
- + ", " + intposnot(n1 % n2, radix) + "]"
- elif op == '^':
- v = intposnot(n1 ** n2, radix)
- elif op == '_':
- rt = int(n1 ** (1. / n2))
- v = "[" + intposnot(rt, radix) \
- + ", " + intposnot(n1 - rt ** n2, radix) + "]"
- elif op == '!':
- n2 = 1
- while n1 > 1:
- n2 *= n1
- n1 -= 1
- v = intposnot(n2, radix)
- elif op == '~':
- # gcd(n1, n2)
- if n1 < n2:
- n1, n2 = n2, n1
- while True:
- r = n1 % n2
- if r == 0:
- break
- n1, n2 = n2, r
- v = intposnot(n2, radix)
- curses_clearline(stdscr, 0)
- stdscr.addstr(0, 0, hl_left + hl_val + hl_right)
- stdscr.addstr(1, 0, " = {} | {}s | mean: {}s\n".format( \
- v, '%.3f' % d, '%.3f' % (dr[1] / dr[0])))
- t.init(16)
- while True:
- if t.get_left() <= 0:
- break
- c = stdscr.getch()
- if c in (ord('+'), ord('-'), ord('*'), ord('/'), ord('^'), \
- ord('_'), ord('!'), ord('~'), ord('=')):
- op = chr(c)
- elif c in range(0x100) and chr(c) in DIGITS:
- val = DIGITS.index(chr(c))
- if num_input_mode == NI_NSIZE and val > 0:
- nsize = val
- elif num_input_mode == NI_RADIX and val > 0:
- radix = val
- elif num_input_mode == NI_PARAM3:
- param3 = val
- elif num_input_mode == NI_DISPTIME:
- input_display_duration = val
- elif c == ord(','):
- num_input_mode = NI_NSIZE
- elif c == ord(':'):
- num_input_mode = NI_RADIX
- elif c == ord(';'):
- num_input_mode = NI_PARAM3
- elif c == ord('&'):
- num_input_mode = NI_DISPTIME
- elif c == ord('r'):
- dr = [0, 0]
- sr = [0, 0]
- break
- elif c == ord('c'):
- sr[0] += 1
- sr[1] += 1
- break
- elif c == ord('w'):
- sr[0] += 1
- break
- elif c == ord('x'):
- break
- elif c == ord('q'):
- q = True
- break
- # Final operations start here
- stdscr.keypad(0)
- curses.echo()
- curses.endwin()
- # print '\nTime is up!\n'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement