builtins.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. #pragma once
  2. const char* kBuiltinsCode = R"(
  3. def print(*args, sep=' ', end='\n'):
  4. s = sep.join([str(i) for i in args])
  5. __sys_stdout_write(s + end)
  6. def round(x, ndigits=0):
  7. assert ndigits >= 0
  8. if ndigits == 0:
  9. return x >= 0 ? int(x + 0.5) : int(x - 0.5)
  10. if x >= 0:
  11. return int(x * 10**ndigits + 0.5) / 10**ndigits
  12. else:
  13. return int(x * 10**ndigits - 0.5) / 10**ndigits
  14. def isinstance(obj, cls):
  15. assert type(cls) is type
  16. obj_t = type(obj)
  17. while obj_t is not None:
  18. if obj_t is cls:
  19. return True
  20. obj_t = obj_t.__base__
  21. return False
  22. def abs(x):
  23. return x < 0 ? -x : x
  24. def max(a, b):
  25. return a > b ? a : b
  26. def min(a, b):
  27. return a < b ? a : b
  28. def all(iterable):
  29. for i in iterable:
  30. if not i:
  31. return False
  32. return True
  33. def any(iterable):
  34. for i in iterable:
  35. if i:
  36. return True
  37. return False
  38. def enumerate(iterable, start=0):
  39. n = start
  40. for elem in iterable:
  41. yield n, elem
  42. n += 1
  43. def sum(iterable):
  44. res = 0
  45. for i in iterable:
  46. res += i
  47. return res
  48. def map(f, iterable):
  49. for i in iterable:
  50. yield f(i)
  51. def zip(a, b):
  52. for i in range(min(len(a), len(b))):
  53. yield (a[i], b[i])
  54. def reversed(iterable):
  55. a = list(iterable)
  56. a.reverse()
  57. return a
  58. def sorted(iterable, reverse=False):
  59. a = list(iterable)
  60. a.sort(reverse=reverse)
  61. return a
  62. ##### str #####
  63. str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
  64. def __str4split(self, sep):
  65. if sep == "":
  66. return list(self)
  67. res = []
  68. i = 0
  69. while i < len(self):
  70. if self[i:i+len(sep)] == sep:
  71. res.append(self[:i])
  72. self = self[i+len(sep):]
  73. i = 0
  74. else:
  75. i += 1
  76. res.append(self)
  77. return res
  78. str.split = __str4split
  79. del __str4split
  80. def __str4index(self, sub):
  81. for i in range(len(self)):
  82. if self[i:i+len(sub)] == sub:
  83. return i
  84. return -1
  85. str.index = __str4index
  86. del __str4index
  87. def __str4strip(self, chars=None):
  88. chars = chars or ' \t\n\r'
  89. i = 0
  90. while i < len(self) and self[i] in chars:
  91. i += 1
  92. j = len(self) - 1
  93. while j >= 0 and self[j] in chars:
  94. j -= 1
  95. return self[i:j+1]
  96. str.strip = __str4strip
  97. del __str4strip
  98. ##### list #####
  99. list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
  100. tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
  101. list.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  102. tuple.__json__ = lambda self: '[' + ', '.join([i.__json__() for i in self]) + ']'
  103. def __qsort(a: list, L: int, R: int):
  104. if L >= R: return;
  105. mid = a[(R+L)//2];
  106. i, j = L, R
  107. while i<=j:
  108. while a[i]<mid: i+=1
  109. while a[j]>mid: j-=1
  110. if i<=j:
  111. a[i], a[j] = a[j], a[i]
  112. i+=1
  113. j-=1
  114. __qsort(a, L, j)
  115. __qsort(a, i, R)
  116. def __list4sort(self, reverse=False):
  117. __qsort(self, 0, len(self)-1)
  118. if reverse:
  119. self.reverse()
  120. list.sort = __list4sort
  121. del __list4sort
  122. def __list4extend(self, other):
  123. for i in other:
  124. self.append(i)
  125. list.extend = __list4extend
  126. del __list4extend
  127. def __list4remove(self, value):
  128. for i in range(len(self)):
  129. if self[i] == value:
  130. del self[i]
  131. return True
  132. return False
  133. list.remove = __list4remove
  134. del __list4remove
  135. def __list4index(self, value):
  136. for i in range(len(self)):
  137. if self[i] == value:
  138. return i
  139. return -1
  140. list.index = __list4index
  141. del __list4index
  142. def __list4pop(self, i=-1):
  143. res = self[i]
  144. del self[i]
  145. return res
  146. list.pop = __list4pop
  147. del __list4pop
  148. def __iterable4__eq__(self, other):
  149. if len(self) != len(other):
  150. return False
  151. for i in range(len(self)):
  152. if self[i] != other[i]:
  153. return False
  154. return True
  155. list.__eq__ = __iterable4__eq__
  156. tuple.__eq__ = __iterable4__eq__
  157. list.__ne__ = lambda self, other: not self.__eq__(other)
  158. tuple.__ne__ = lambda self, other: not self.__eq__(other)
  159. del __iterable4__eq__
  160. def __iterable4count(self, x):
  161. res = 0
  162. for i in self:
  163. if i == x:
  164. res += 1
  165. return res
  166. list.count = __iterable4count
  167. tuple.count = __iterable4count
  168. del __iterable4count
  169. def __iterable4__contains__(self, item):
  170. for i in self:
  171. if i == item:
  172. return True
  173. return False
  174. list.__contains__ = __iterable4__contains__
  175. tuple.__contains__ = __iterable4__contains__
  176. del __iterable4__contains__
  177. list.__new__ = lambda obj: [i for i in obj]
  178. # https://github.com/python/cpython/blob/main/Objects/dictobject.c
  179. class dict:
  180. def __init__(self, capacity=12):
  181. self._capacity = capacity
  182. self._a = [None] * self._capacity
  183. self._len = 0
  184. def __len__(self):
  185. return self._len
  186. def __probe(self, key):
  187. i = hash(key) % self._capacity
  188. while self._a[i] is not None:
  189. if self._a[i][0] == key:
  190. return True, i
  191. i = (i + 1) % self._capacity
  192. return False, i
  193. def __getitem__(self, key):
  194. ok, i = self.__probe(key)
  195. if not ok:
  196. raise KeyError(repr(key))
  197. return self._a[i][1]
  198. def __contains__(self, key):
  199. ok, i = self.__probe(key)
  200. return ok
  201. def __setitem__(self, key, value):
  202. ok, i = self.__probe(key)
  203. if ok:
  204. self._a[i][1] = value
  205. else:
  206. self._a[i] = [key, value]
  207. self._len += 1
  208. if self._len > self._capacity * 0.67:
  209. self._capacity *= 2
  210. self.__rehash()
  211. def __delitem__(self, key):
  212. ok, i = self.__probe(key)
  213. if not ok:
  214. raise KeyError(repr(key))
  215. self._a[i] = None
  216. self._len -= 1
  217. def __rehash(self):
  218. old_a = self._a
  219. self._a = [None] * self._capacity
  220. self._len = 0
  221. for kv in old_a:
  222. if kv is not None:
  223. self[kv[0]] = kv[1]
  224. def get(self, key, default=None):
  225. ok, i = self.__probe(key)
  226. if ok:
  227. return self._a[i][1]
  228. return default
  229. def keys(self):
  230. for kv in self._a:
  231. if kv is not None:
  232. yield kv[0]
  233. def values(self):
  234. for kv in self._a:
  235. if kv is not None:
  236. yield kv[1]
  237. def items(self):
  238. for kv in self._a:
  239. if kv is not None:
  240. yield kv
  241. def clear(self):
  242. self._a = [None] * self._capacity
  243. self._len = 0
  244. def update(self, other):
  245. for k, v in other.items():
  246. self[k] = v
  247. def copy(self):
  248. d = dict()
  249. for kv in self._a:
  250. if kv is not None:
  251. d[kv[0]] = kv[1]
  252. return d
  253. def __repr__(self):
  254. a = [repr(k)+': '+repr(v) for k,v in self.items()]
  255. return '{'+ ', '.join(a) + '}'
  256. def __json__(self):
  257. a = []
  258. for k,v in self.items():
  259. if type(k) is not str:
  260. raise TypeError('json keys must be strings, got ' + repr(k) )
  261. a.append(k.__json__()+': '+v.__json__())
  262. return '{'+ ', '.join(a) + '}'
  263. class set:
  264. def __init__(self, iterable=None):
  265. iterable = iterable or []
  266. self._a = dict()
  267. for item in iterable:
  268. self.add(item)
  269. def add(self, elem):
  270. self._a[elem] = None
  271. def discard(self, elem):
  272. if elem in self._a:
  273. del self._a[elem]
  274. def remove(self, elem):
  275. del self._a[elem]
  276. def clear(self):
  277. self._a.clear()
  278. def update(self,other):
  279. for elem in other:
  280. self.add(elem)
  281. return self
  282. def __len__(self):
  283. return len(self._a)
  284. def copy(self):
  285. return set(self._a.keys())
  286. def __and__(self, other):
  287. ret = set()
  288. for elem in self:
  289. if elem in other:
  290. ret.add(elem)
  291. return ret
  292. def __or__(self, other):
  293. ret = self.copy()
  294. for elem in other:
  295. ret.add(elem)
  296. return ret
  297. def __sub__(self, other):
  298. ret = set()
  299. for elem in self:
  300. if elem not in other:
  301. ret.add(elem)
  302. return ret
  303. def __xor__(self, other):
  304. ret = set()
  305. for elem in self:
  306. if elem not in other:
  307. ret.add(elem)
  308. for elem in other:
  309. if elem not in self:
  310. ret.add(elem)
  311. return ret
  312. def union(self, other):
  313. return self | other
  314. def intersection(self, other):
  315. return self & other
  316. def difference(self, other):
  317. return self - other
  318. def symmetric_difference(self, other):
  319. return self ^ other
  320. def __eq__(self, other):
  321. return self.__xor__(other).__len__() == 0
  322. def __ne__(self, other):
  323. return self.__xor__(other).__len__() != 0
  324. def isdisjoint(self, other):
  325. return self.__and__(other).__len__() == 0
  326. def issubset(self, other):
  327. return self.__sub__(other).__len__() == 0
  328. def issuperset(self, other):
  329. return other.__sub__(self).__len__() == 0
  330. def __contains__(self, elem):
  331. return elem in self._a
  332. def __repr__(self):
  333. if len(self) == 0:
  334. return 'set()'
  335. return '{'+ ', '.join([repr(i) for i in self._a.keys()]) + '}'
  336. def __iter__(self):
  337. return self._a.keys()
  338. )";
  339. const char* kRandomCode = R"(
  340. def shuffle(L):
  341. for i in range(len(L)):
  342. j = randint(i, len(L) - 1)
  343. L[i], L[j] = L[j], L[i]
  344. def choice(L):
  345. return L[randint(0, len(L) - 1)]
  346. )";