builtins.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. #pragma once
  2. const char* __BUILTINS_CODE = R"(
  3. def len(x):
  4. return x.__len__()
  5. str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
  6. def __str4split(self, sep):
  7. if sep == "":
  8. return list(self)
  9. res = []
  10. i = 0
  11. while i < len(self):
  12. if self[i:i+len(sep)] == sep:
  13. res.append(self[:i])
  14. self = self[i+len(sep):]
  15. i = 0
  16. else:
  17. i += 1
  18. res.append(self)
  19. return res
  20. str.split = __str4split
  21. del __str4split
  22. def __str4index(self, sub):
  23. for i in range(len(self) - len(sub) + 1):
  24. if self[i:i+len(sub)] == sub:
  25. return i
  26. return -1
  27. str.index = __str4index
  28. del __str4index
  29. list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
  30. tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
  31. list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  32. tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  33. def __list4extend(self, other):
  34. for i in other:
  35. self.append(i)
  36. list.extend = __list4extend
  37. del __list4extend
  38. def __list4__mul__(self, n):
  39. a = []
  40. for i in range(n):
  41. a.extend(self)
  42. return a
  43. list.__mul__ = __list4__mul__
  44. del __list4__mul__
  45. def __iterable4__eq__(self, other):
  46. if len(self) != len(other):
  47. return False
  48. for i in range(len(self)):
  49. if self[i] != other[i]:
  50. return False
  51. return True
  52. list.__eq__ = __iterable4__eq__
  53. tuple.__eq__ = __iterable4__eq__
  54. del __iterable4__eq__
  55. def __iterable4__contains__(self, item):
  56. for i in self:
  57. if i == item:
  58. return True
  59. return False
  60. list.__contains__ = __iterable4__contains__
  61. tuple.__contains__ = __iterable4__contains__
  62. del __iterable4__contains__
  63. list.__new__ = lambda obj: [i for i in obj]
  64. # https://github.com/python/cpython/blob/main/Objects/dictobject.c
  65. class dict:
  66. def __init__(self):
  67. self._capacity = 8
  68. self._a = [None] * self._capacity
  69. self._len = 0
  70. def __len__(self):
  71. return self._len
  72. def __probe(self, key):
  73. i = hash(key) % self._capacity
  74. while self._a[i] is not None:
  75. if self._a[i][0] == key:
  76. return True, i
  77. i = ((5*i) + 1) % self._capacity
  78. return False, i
  79. def __getitem__(self, key):
  80. ok, i = self.__probe(key)
  81. if not ok:
  82. raise KeyError(key)
  83. return self._a[i][1]
  84. def __contains__(self, key):
  85. ok, i = self.__probe(key)
  86. return ok
  87. def __setitem__(self, key, value):
  88. ok, i = self.__probe(key)
  89. if ok:
  90. self._a[i][1] = value
  91. else:
  92. self._a[i] = [key, value]
  93. self._len += 1
  94. if self._len > self._capacity * 0.6:
  95. self.__resize_2x()
  96. def __delitem__(self, key):
  97. ok, i = self.__probe(key)
  98. if not ok:
  99. raise KeyError(key)
  100. self._a[i] = None
  101. self._len -= 1
  102. def __resize_2x(self):
  103. old_a = self._a
  104. self._capacity *= 2
  105. self._a = [None] * self._capacity
  106. self._len = 0
  107. for kv in old_a:
  108. if kv is not None:
  109. self[kv[0]] = kv[1]
  110. def keys(self):
  111. return [kv[0] for kv in self._a if kv is not None]
  112. def values(self):
  113. return [kv[1] for kv in self._a if kv is not None]
  114. def items(self):
  115. return [kv for kv in self._a if kv is not None]
  116. def copy(self):
  117. d = dict()
  118. for kv in self._a:
  119. if kv is not None:
  120. d[kv[0]] = kv[1]
  121. return d
  122. def __repr__(self):
  123. a = [repr(k)+': '+repr(v) for k,v in self.items()]
  124. return '{'+ ', '.join(a) + '}'
  125. def __json__(self):
  126. a = []
  127. for k,v in self.items():
  128. if type(k) is not str:
  129. raise TypeError('json keys must be strings, got ' + repr(k) )
  130. a.append(k.__json__()+': '+v.__json__())
  131. return '{'+ ', '.join(a) + '}'
  132. def round(x):
  133. if x >= 0:
  134. return int(x + 0.5)
  135. else:
  136. return int(x - 0.5)
  137. def max(a, b):
  138. if a > b:
  139. return a
  140. return b
  141. def min(a, b):
  142. if a < b:
  143. return a
  144. return b
  145. def sum(iterable):
  146. res = 0
  147. for i in iterable:
  148. res += i
  149. return res
  150. def map(f, iterable):
  151. return [f(i) for i in iterable]
  152. def zip(a, b):
  153. return [(a[i], b[i]) for i in range(min(len(a), len(b)))]
  154. )";
  155. const char* __RANDOM_CODE = R"(
  156. import time as _time
  157. __all__ = ['Random', 'seed', 'random', 'randint', 'uniform']
  158. def _int32(x):
  159. return int(0xffffffff & x)
  160. class Random:
  161. def __init__(self, seed=None):
  162. if seed is None:
  163. seed = int(_time.time() * 1000000)
  164. seed = _int32(seed)
  165. self.mt = [0] * 624
  166. self.mt[0] = seed
  167. self.mti = 0
  168. for i in range(1, 624):
  169. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  170. def extract_number(self):
  171. if self.mti == 0:
  172. self.twist()
  173. y = self.mt[self.mti]
  174. y = y ^ y >> 11
  175. y = y ^ y << 7 & 2636928640
  176. y = y ^ y << 15 & 4022730752
  177. y = y ^ y >> 18
  178. self.mti = (self.mti + 1) % 624
  179. return _int32(y)
  180. def twist(self):
  181. for i in range(0, 624):
  182. y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
  183. self.mt[i] = (y >> 1) ^ self.mt[(i + 397) % 624]
  184. if y % 2 != 0:
  185. self.mt[i] = self.mt[i] ^ 0x9908b0df
  186. def seed(self, x):
  187. assert type(x) is int
  188. self.mt = [0] * 624
  189. self.mt[0] = _int32(x)
  190. self.mti = 0
  191. for i in range(1, 624):
  192. self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
  193. def random(self):
  194. return self.extract_number() / 2 ** 32
  195. def randint(self, a, b):
  196. assert type(a) is int and type(b) is int
  197. assert a <= b
  198. return int(self.random() * (b - a + 1)) + a
  199. def uniform(self, a, b):
  200. assert type(a) is int or type(a) is float
  201. assert type(b) is int or type(b) is float
  202. if a > b:
  203. a, b = b, a
  204. return self.random() * (b - a) + a
  205. def shuffle(self, L):
  206. for i in range(len(L)):
  207. j = self.randint(i, len(L) - 1)
  208. L[i], L[j] = L[j], L[i]
  209. def choice(self, L):
  210. return L[self.randint(0, len(L) - 1)]
  211. _inst = Random()
  212. seed = _inst.seed
  213. random = _inst.random
  214. randint = _inst.randint
  215. uniform = _inst.uniform
  216. shuffle = _inst.shuffle
  217. choice = _inst.choice
  218. )";