| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 |
- #pragma once
- const char* __BUILTINS_CODE = R"(
- def print(*args, sep=' ', end='\n'):
- s = sep.join([str(i) for i in args])
- __sys_stdout_write(s + end)
- def round(x, ndigits=0):
- assert ndigits >= 0
- if ndigits == 0:
- return x >= 0 ? int(x + 0.5) : int(x - 0.5)
- if x >= 0:
- return int(x * 10**ndigits + 0.5) / 10**ndigits
- else:
- return int(x * 10**ndigits - 0.5) / 10**ndigits
- def isinstance(obj, cls):
- assert type(cls) is type
- obj_t = type(obj)
- while obj_t is not None:
- if obj_t is cls:
- return True
- obj_t = obj_t.__base__
- return False
- def abs(x):
- return x < 0 ? -x : x
- def max(a, b):
- return a > b ? a : b
- def min(a, b):
- return a < b ? a : b
- def sum(iterable):
- res = 0
- for i in iterable:
- res += i
- return res
- def map(f, iterable):
- return [f(i) for i in iterable]
- def zip(a, b):
- return [(a[i], b[i]) for i in range(min(len(a), len(b)))]
- def reversed(iterable):
- a = list(iterable)
- return [a[i] for i in range(len(a)-1, -1, -1)]
- def sorted(iterable, key=None, reverse=False):
- if key is None:
- key = lambda x: x
- a = [key(i) for i in iterable]
- b = list(iterable)
- for i in range(len(a)):
- for j in range(i+1, len(a)):
- if (a[i] > a[j]) ^ reverse:
- a[i], a[j] = a[j], a[i]
- b[i], b[j] = b[j], b[i]
- return b
- ##### str #####
- str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
- def __str4split(self, sep):
- if sep == "":
- return list(self)
- res = []
- i = 0
- while i < len(self):
- if self[i:i+len(sep)] == sep:
- res.append(self[:i])
- self = self[i+len(sep):]
- i = 0
- else:
- i += 1
- res.append(self)
- return res
- str.split = __str4split
- del __str4split
- def __str4index(self, sub):
- for i in range(len(self)):
- if self[i:i+len(sub)] == sub:
- return i
- return -1
- str.index = __str4index
- del __str4index
- def __str4strip(self, chars=None):
- chars = chars or ' \t\n\r'
- i = 0
- while i < len(self) and self[i] in chars:
- i += 1
- j = len(self) - 1
- while j >= 0 and self[j] in chars:
- j -= 1
- return self[i:j+1]
- str.strip = __str4strip
- del __str4strip
- ##### list #####
- list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
- tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
- list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
- tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
- def __list4extend(self, other):
- for i in other:
- self.append(i)
- list.extend = __list4extend
- del __list4extend
- def __list4remove(self, value):
- for i in range(len(self)):
- if self[i] == value:
- del self[i]
- return True
- return False
- list.remove = __list4remove
- del __list4remove
- def __list4index(self, value):
- for i in range(len(self)):
- if self[i] == value:
- return i
- return -1
- list.index = __list4index
- del __list4index
- def __list4pop(self, i=-1):
- res = self[i]
- del self[i]
- return res
- list.pop = __list4pop
- del __list4pop
- def __list4__mul__(self, n):
- a = []
- for i in range(n):
- a.extend(self)
- return a
- list.__mul__ = __list4__mul__
- del __list4__mul__
- def __iterable4__eq__(self, other):
- if len(self) != len(other):
- return False
- for i in range(len(self)):
- if self[i] != other[i]:
- return False
- return True
- list.__eq__ = __iterable4__eq__
- tuple.__eq__ = __iterable4__eq__
- list.__ne__ = lambda self, other: not self.__eq__(other)
- tuple.__ne__ = lambda self, other: not self.__eq__(other)
- del __iterable4__eq__
- def __iterable4count(self, x):
- res = 0
- for i in self:
- if i == x:
- res += 1
- return res
- list.count = __iterable4count
- tuple.count = __iterable4count
- del __iterable4count
- def __iterable4__contains__(self, item):
- for i in self:
- if i == item:
- return True
- return False
- list.__contains__ = __iterable4__contains__
- tuple.__contains__ = __iterable4__contains__
- del __iterable4__contains__
- list.__new__ = lambda obj: [i for i in obj]
- # https://github.com/python/cpython/blob/main/Objects/dictobject.c
- class dict:
- def __init__(self, capacity=16):
- self._capacity = capacity
- self._a = [None] * self._capacity
- self._len = 0
-
- def __len__(self):
- return self._len
- def __probe(self, key):
- i = hash(key) % self._capacity
- while self._a[i] is not None:
- if self._a[i][0] == key:
- return True, i
- i = (i + 1) % self._capacity
- return False, i
- def __getitem__(self, key):
- ok, i = self.__probe(key)
- if not ok:
- raise KeyError(key)
- return self._a[i][1]
- def __contains__(self, key):
- ok, i = self.__probe(key)
- return ok
- def __setitem__(self, key, value):
- ok, i = self.__probe(key)
- if ok:
- self._a[i][1] = value
- else:
- self._a[i] = [key, value]
- self._len += 1
- if self._len > self._capacity * 0.8:
- self._capacity *= 2
- self.__rehash()
- def __delitem__(self, key):
- ok, i = self.__probe(key)
- if not ok:
- raise KeyError(key)
- self._a[i] = None
- self._len -= 1
- def __rehash(self):
- old_a = self._a
- self._a = [None] * self._capacity
- self._len = 0
- for kv in old_a:
- if kv is not None:
- self[kv[0]] = kv[1]
- def keys(self):
- return [kv[0] for kv in self._a if kv is not None]
- def values(self):
- return [kv[1] for kv in self._a if kv is not None]
- def items(self):
- return [kv for kv in self._a if kv is not None]
- def clear(self):
- self._a = [None] * self._capacity
- self._len = 0
- def update(self, other):
- for k, v in other.items():
- self[k] = v
- def copy(self):
- d = dict()
- for kv in self._a:
- if kv is not None:
- d[kv[0]] = kv[1]
- return d
- def __repr__(self):
- a = [repr(k)+': '+repr(v) for k,v in self.items()]
- return '{'+ ', '.join(a) + '}'
- def __json__(self):
- a = []
- for k,v in self.items():
- if type(k) is not str:
- raise TypeError('json keys must be strings, got ' + repr(k) )
- a.append(k.__json__()+': '+v.__json__())
- return '{'+ ', '.join(a) + '}'
- class set:
- def __init__(self, iterable=None):
- iterable = iterable or []
- self._a = dict()
- for item in iterable:
- self.add(item)
- def add(self, elem):
- self._a[elem] = None
-
- def discard(self, elem):
- if elem in self._a:
- del self._a[elem]
- def remove(self, elem):
- del self._a[elem]
-
- def clear(self):
- self._a.clear()
- def update(self,other):
- for elem in other:
- self.add(elem)
- return self
- def __len__(self):
- return len(self._a)
-
- def copy(self):
- return set(self._a.keys())
-
- def __and__(self, other):
- ret = set()
- for elem in self:
- if elem in other:
- ret.add(elem)
- return ret
-
- def __or__(self, other):
- ret = self.copy()
- for elem in other:
- ret.add(elem)
- return ret
- def __sub__(self, other):
- ret = set()
- for elem in self:
- if elem not in other:
- ret.add(elem)
- return ret
-
- def __xor__(self, other):
- ret = set()
- for elem in self:
- if elem not in other:
- ret.add(elem)
- for elem in other:
- if elem not in self:
- ret.add(elem)
- return ret
- def union(self, other):
- return self | other
- def intersection(self, other):
- return self & other
- def difference(self, other):
- return self - other
- def symmetric_difference(self, other):
- return self ^ other
-
- def __eq__(self, other):
- return self.__xor__(other).__len__() == 0
- def __ne__(self, other):
- return self.__xor__(other).__len__() != 0
-
- def isdisjoint(self, other):
- return self.__and__(other).__len__() == 0
-
- def issubset(self, other):
- return self.__sub__(other).__len__() == 0
-
- def issuperset(self, other):
- return other.__sub__(self).__len__() == 0
- def __contains__(self, elem):
- return elem in self._a
-
- def __repr__(self):
- if len(self) == 0:
- return 'set()'
- return '{'+ ', '.join(self._a.keys()) + '}'
-
- def __iter__(self):
- return self._a.keys().__iter__()
- )";
- const char* __RANDOM_CODE = R"(
- import time as _time
- __all__ = ['Random', 'seed', 'random', 'randint', 'uniform']
- def _int32(x):
- return int(0xffffffff & x)
- class Random:
- def __init__(self, seed=None):
- if seed is None:
- seed = int(_time.time() * 1000000)
- seed = _int32(seed)
- self.mt = [0] * 624
- self.mt[0] = seed
- self.mti = 0
- for i in range(1, 624):
- self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
-
- def extract_number(self):
- if self.mti == 0:
- self.twist()
- y = self.mt[self.mti]
- y = y ^ y >> 11
- y = y ^ y << 7 & 2636928640
- y = y ^ y << 15 & 4022730752
- y = y ^ y >> 18
- self.mti = (self.mti + 1) % 624
- return _int32(y)
-
- def twist(self):
- for i in range(0, 624):
- y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
- self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]
-
- if y % 2 != 0:
- self.mt[i] = self.mt[i] ^ 0x9908b0df
-
- def seed(self, x):
- assert type(x) is int
- self.mt = [0] * 624
- self.mt[0] = _int32(x)
- self.mti = 0
- for i in range(1, 624):
- self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
-
- def random(self):
- return self.extract_number() / 2 ** 32
-
- def randint(self, a, b):
- assert type(a) is int and type(b) is int
- assert a <= b
- return int(self.random() * (b - a + 1)) + a
-
- def uniform(self, a, b):
- assert type(a) is int or type(a) is float
- assert type(b) is int or type(b) is float
- if a > b:
- a, b = b, a
- return self.random() * (b - a) + a
- def shuffle(self, L):
- for i in range(len(L)):
- j = self.randint(i, len(L) - 1)
- L[i], L[j] = L[j], L[i]
- def choice(self, L):
- return L[self.randint(0, len(L) - 1)]
-
- _inst = Random()
- seed = _inst.seed
- random = _inst.random
- randint = _inst.randint
- uniform = _inst.uniform
- shuffle = _inst.shuffle
- choice = _inst.choice
- )";
|