import sys as _sys import operator as _operator def print(*args, sep=' ', end='\n'): s = sep.join([str(i) for i in args]) _sys.stdout.write(s + end) def issubclass(cls, base): if type(cls) is not type: raise TypeError('issubclass() arg 1 must be a class') if type(base) is not type: raise TypeError('issubclass() arg 2 must be a class') while cls is not None: if cls is base: return True cls = cls.__base__ return False def _minmax_reduce(op, args, key): if key is None: if len(args) == 2: return args[0] if op(args[0], args[1]) else args[1] key = lambda x: x if len(args) == 0: raise TypeError('expected 1 arguments, got 0') if len(args) == 1: args = args[0] args = iter(args) res = next(args) if res is StopIteration: raise ValueError('args is an empty sequence') while True: i = next(args) if i is StopIteration: break if op(key(i), key(res)): res = i return res def min(*args, key=None): return _minmax_reduce(_operator.lt, args, key) def max(*args, key=None): return _minmax_reduce(_operator.gt, args, key) def all(iterable): for i in iterable: if not i: return False return True def any(iterable): for i in iterable: if i: return True return False def enumerate(iterable, start=0): n = start for elem in iterable: yield n, elem ++n def sum(iterable): res = 0 for i in iterable: res += i return res def map(f, iterable): for i in iterable: yield f(i) def filter(f, iterable): for i in iterable: if f(i): yield i def zip(a, b): a = iter(a) b = iter(b) while True: ai = next(a) bi = next(b) if ai is StopIteration or bi is StopIteration: break yield ai, bi def reversed(iterable): a = list(iterable) a.reverse() return a def sorted(iterable, key=None, reverse=False): a = list(iterable) a.sort(key=key, reverse=reverse) return a ##### str ##### def __f(self: str, *args, **kwargs) -> str: def tokenizeString(s: str): tokens = [] L, R = 0,0 mode = None curArg = 0 # lookingForKword = False while(R= 0 and self[j] in chars: --j return self[:j+1] str.rstrip = __f def __f(self, chars=None): chars = chars or ' \t\n\r' i = 0 while i < len(self) and self[i] in chars: ++i j = len(self) - 1 while j >= 0 and self[j] in chars: --j return self[i:j+1] str.strip = __f def __f(self, width: int): delta = width - len(self) if delta <= 0: return self return '0' * delta + self str.zfill = __f def __f(self, width: int, fillchar=' '): delta = width - len(self) if delta <= 0: return self assert len(fillchar) == 1 return fillchar * delta + self str.rjust = __f def __f(self, width: int, fillchar=' '): delta = width - len(self) if delta <= 0: return self assert len(fillchar) == 1 return self + fillchar * delta str.ljust = __f del __f def help(obj): if hasattr(obj, '__func__'): obj = obj.__func__ print(obj.__signature__) print(obj.__doc__) class classmethod: def __init__(self, f): self.f = f raise NotImplementedError def staticmethod(f): return f def complex(*args, **kwargs): import cmath return cmath.complex(*args, **kwargs) def long(*args, **kwargs): import _long return _long.long(*args, **kwargs) # builtin exceptions class SyntaxError(Exception): pass class IndentationError(SyntaxError): pass class StackOverflowError(Exception): pass class IOError(Exception): pass class NotImplementedError(Exception): pass class TypeError(Exception): pass class IndexError(Exception): pass class ValueError(Exception): pass class RuntimeError(Exception): pass class ZeroDivisionError(Exception): pass class NameError(Exception): pass class UnboundLocalError(Exception): pass class AttributeError(Exception): pass class ImportError(Exception): pass class AssertionError(Exception): pass class KeyError(Exception): def __init__(self, key=...): self.key = key if key is ...: super().__init__() else: super().__init__(repr(key)) def __str__(self): if self.key is ...: return '' return str(self.key) def __repr__(self): if self.key is ...: return 'KeyError()' return f'KeyError({self.key!r})'