Initial commit
This commit is contained in:
commit
2898a6bd38
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Codewars solutions in python
|
||||||
|
|
||||||
|
## Quickstart
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ pip install git+https://github.com/codewars/python-test-framework.git#egg=codewars_test
|
||||||
|
```
|
68
function_overloading/overload.py
Normal file
68
function_overloading/overload.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# https://www.codewars.com/kata/5f24315eff32c4002efcfc6a
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
|
||||||
|
# https://docs.python.org/3.8/reference/datamodel.html#customizing-class-creation
|
||||||
|
# https://snarky.ca/unravelling-pythons-classes/
|
||||||
|
# https://gist.github.com/tmr232/c7214d62607ba1fc0e0a2e82d7e041cd
|
||||||
|
class DispatchProxy:
|
||||||
|
def __init__(self, name):
|
||||||
|
self.registry = {}
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
def register(self, f):
|
||||||
|
print(f"register {inspect.signature(f)}")
|
||||||
|
argcount = f.__code__.co_argcount
|
||||||
|
self.registry[argcount] = f
|
||||||
|
"""
|
||||||
|
def decorator(func):
|
||||||
|
argcount = f.__code__.co_argcount
|
||||||
|
self.registry[argcount] = f
|
||||||
|
return func
|
||||||
|
return decorator
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __call__(self, *args):
|
||||||
|
argcount = len(args) + 1 # add 1 because the first argument of a method is "self"
|
||||||
|
if argcount in self.registry:
|
||||||
|
resolved = self.registry[argcount]
|
||||||
|
print(f"resolved: {resolved.__name__}{inspect.signature(resolved)}")
|
||||||
|
return resolved(self, *args)
|
||||||
|
else:
|
||||||
|
raise AttributeError(f"No matching function for args: {args}")
|
||||||
|
|
||||||
|
|
||||||
|
class MyNamespace(dict):
|
||||||
|
def __getitem__(self, key):
|
||||||
|
#(f"get {key}")
|
||||||
|
return super().__getitem__(key)
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
#sign = inspect.signature(value) if callable(value) else value
|
||||||
|
#print(f"set {key} {value}")
|
||||||
|
|
||||||
|
# already exists => overload
|
||||||
|
is_method = callable(value) and not value.__name__.startswith("__")
|
||||||
|
|
||||||
|
if is_method and key in self:
|
||||||
|
m = self[key]
|
||||||
|
if not isinstance(m, DispatchProxy):
|
||||||
|
m = DispatchProxy(self)
|
||||||
|
m.register(self[key])
|
||||||
|
m.register(value)
|
||||||
|
super().__setitem__(key, m)
|
||||||
|
else:
|
||||||
|
super().__setitem__(key, value)
|
||||||
|
|
||||||
|
|
||||||
|
class Meta(type):
|
||||||
|
@classmethod
|
||||||
|
def __prepare__(cls, name, bases):
|
||||||
|
return MyNamespace()
|
||||||
|
|
||||||
|
def __new__(cls, name, bases, dct):
|
||||||
|
x = super().__new__(cls, name, bases, dct)
|
||||||
|
return x
|
||||||
|
|
||||||
|
def __init__(self, name, bases, attrs):
|
||||||
|
super(Meta, self).__init__(name, bases, attrs)
|
160
function_overloading/tests.py
Normal file
160
function_overloading/tests.py
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
import codewars_test as test
|
||||||
|
from overload import Meta
|
||||||
|
|
||||||
|
cng_msg = 'Dont change the properties of class.'
|
||||||
|
sld_work = 'Function overloading should work.'
|
||||||
|
|
||||||
|
|
||||||
|
@test.describe('Python Recipes #1 : Function Overloading')
|
||||||
|
def _():
|
||||||
|
|
||||||
|
# implement meta class -----
|
||||||
|
|
||||||
|
def build(): # returning class to regenerate accordingly.
|
||||||
|
|
||||||
|
class Overload(metaclass=Meta):
|
||||||
|
|
||||||
|
CLS_VAR = 42
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.a = 1
|
||||||
|
self.no = 'This is "No parameter" function.'
|
||||||
|
self.single = 'This is "Single parameter" function'
|
||||||
|
self.two = 'This is "Two parameter" function'
|
||||||
|
self.three = 'This is "Three parameter" function'
|
||||||
|
|
||||||
|
def foo(self):
|
||||||
|
return self.no
|
||||||
|
|
||||||
|
def foo(self, x):
|
||||||
|
return self.single + ':' + str(x)
|
||||||
|
|
||||||
|
def foo(self, x, y):
|
||||||
|
return self.two + ':' + str(x) + ',' + str(y)
|
||||||
|
|
||||||
|
def foo(self, x, y, z):
|
||||||
|
return self.three + ':' + str(x) + ',' + str(y) + ',' + str(z)
|
||||||
|
|
||||||
|
def extra(self):
|
||||||
|
return 'This is extra method.'
|
||||||
|
|
||||||
|
return Overload
|
||||||
|
|
||||||
|
@test.describe('Sample tests')
|
||||||
|
def _():
|
||||||
|
|
||||||
|
overload = build()
|
||||||
|
obj = overload()
|
||||||
|
|
||||||
|
|
||||||
|
@test.it('Verifying access')
|
||||||
|
def _():
|
||||||
|
test.assert_equals(obj.a, 1, cng_msg)
|
||||||
|
test.assert_equals(obj.no, 'This is "No parameter" function.', cng_msg)
|
||||||
|
test.assert_equals(obj.single, 'This is "Single parameter" function', cng_msg)
|
||||||
|
test.assert_equals(obj.two, 'This is "Two parameter" function', cng_msg)
|
||||||
|
test.assert_equals(obj.three, 'This is "Three parameter" function', cng_msg)
|
||||||
|
test.assert_equals(obj.extra(), 'This is extra method.', cng_msg)
|
||||||
|
test.assert_equals(obj.CLS_VAR, 42, cng_msg)
|
||||||
|
|
||||||
|
@test.it('Verifying overloading feature')
|
||||||
|
def _():
|
||||||
|
test.assert_equals(obj.foo(), 'This is "No parameter" function.', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1), 'This is "Single parameter" function:1', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1,2), 'This is "Two parameter" function:1,2', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1,2,3), 'This is "Three parameter" function:1,2,3', sld_work)
|
||||||
|
|
||||||
|
@test.it('Verifying overloading feature after adding new methods :1')
|
||||||
|
def _():
|
||||||
|
|
||||||
|
def foo(self, a, b, c, d):
|
||||||
|
return self.a + a + b + c + d
|
||||||
|
|
||||||
|
def foo1(self, a, b):
|
||||||
|
return 'Overwritten'
|
||||||
|
|
||||||
|
overload.foo = foo
|
||||||
|
|
||||||
|
|
||||||
|
test.assert_equals(obj.foo(), 'This is "No parameter" function.', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1), 'This is "Single parameter" function:1', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1,2), 'This is "Two parameter" function:1,2', sld_work)
|
||||||
|
test.assert_equals(obj.foo(1,2,3), 'This is "Three parameter" function:1,2,3', sld_work)
|
||||||
|
|
||||||
|
test.assert_equals(obj.foo(1,2,3,4), 11, sld_work)
|
||||||
|
|
||||||
|
overload.foo = foo1
|
||||||
|
test.assert_equals(obj.foo(1,2), 'Overwritten', sld_work)
|
||||||
|
|
||||||
|
|
||||||
|
@test.it('Verifying overloading feature after adding new methods :2')
|
||||||
|
def _():
|
||||||
|
|
||||||
|
def boo1(self):
|
||||||
|
return self.a
|
||||||
|
|
||||||
|
def boo2(self, a):
|
||||||
|
return self.a + a
|
||||||
|
|
||||||
|
def unique(self, a, b):
|
||||||
|
return a + b
|
||||||
|
|
||||||
|
overload.boo = boo1
|
||||||
|
overload.boo = boo2
|
||||||
|
obj.nothing = '123'
|
||||||
|
overload.unique = unique
|
||||||
|
|
||||||
|
test.assert_equals(obj.boo(), 1, sld_work)
|
||||||
|
test.assert_equals(obj.boo(1), 2, sld_work)
|
||||||
|
test.assert_equals(obj.unique(1, 2), 3, sld_work)
|
||||||
|
test.assert_equals(obj.nothing, '123', sld_work)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@test.describe('Verify the absence of unwanted sharing of methods between different classes')
|
||||||
|
def _():
|
||||||
|
class Unshare(metaclass=Meta):
|
||||||
|
def foo(self,a,b): return 'unshared!'
|
||||||
|
|
||||||
|
unsh=Unshare()
|
||||||
|
@test.it('The new foo function in Unshare class should be used')
|
||||||
|
def _():
|
||||||
|
test.assert_equals(unsh.foo(1,2), 'unshared!')
|
||||||
|
|
||||||
|
@test.it('Previous implementations of "foo" in other classes shouldn\'t be visible from a freshly built class')
|
||||||
|
def _():
|
||||||
|
test.expect_error("Your function didn't raise any exception", lambda: unsh.foo(1), Exception)
|
||||||
|
test.expect_error("Your function should raise AttributeError", lambda: unsh.foo(1), AttributeError)
|
||||||
|
|
||||||
|
@test.it('Previous method with the same signature in other classes shouldn\'t be affected')
|
||||||
|
def _():
|
||||||
|
test.assert_equals(obj.foo(1,2), 'Overwritten')
|
||||||
|
|
||||||
|
|
||||||
|
@test.it('Class level variables are still working as expected')
|
||||||
|
def _():
|
||||||
|
def over(): obj.CLS_VAR=-42
|
||||||
|
def write(): obj.HAHA=msg
|
||||||
|
|
||||||
|
test.expect_no_error("Class level variables can be overriden", over)
|
||||||
|
test.assert_equals(obj.CLS_VAR, -42, "Class variable Overload.CLS_VAR hasn't been overriden")
|
||||||
|
|
||||||
|
msg = 'This is another class variable'
|
||||||
|
test.expect_no_error("New class level variables can be defined", write)
|
||||||
|
test.assert_equals(obj.HAHA, msg, "New class level variables can be defined and accessed")
|
||||||
|
|
||||||
|
|
||||||
|
@test.it('Undefined methods or variables should raise AttributeError')
|
||||||
|
def _():
|
||||||
|
test.expect_error('Undefined attributes/mehtods should raise AttributeError',
|
||||||
|
lambda: overload.NEW_CLS_VAR, AttributeError)
|
||||||
|
test.expect_error('Undefined attributes/mehtods should raise AttributeError',
|
||||||
|
lambda: obj.ABCD, AttributeError)
|
||||||
|
test.expect_error('Undefined attributes/mehtods should raise AttributeError',
|
||||||
|
lambda: obj.randomFuncName(), AttributeError)
|
||||||
|
|
||||||
|
|
||||||
|
@test.it('undefined overloaded methods (wrong number of arguments should raise AttributeError)')
|
||||||
|
def _():
|
||||||
|
test.expect_error('Undefined attributes/mehtods should raise AttributeError',
|
||||||
|
lambda: overload.foo(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), AttributeError)
|
BIN
prime_streaming/Scripts/python.exe
Normal file
BIN
prime_streaming/Scripts/python.exe
Normal file
Binary file not shown.
BIN
prime_streaming/Scripts/pythonw.exe
Normal file
BIN
prime_streaming/Scripts/pythonw.exe
Normal file
Binary file not shown.
41
prime_streaming/helper.py
Normal file
41
prime_streaming/helper.py
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
from threading import Thread
|
||||||
|
import functools
|
||||||
|
|
||||||
|
def timeout(timeout):
|
||||||
|
def deco(func):
|
||||||
|
@functools.wraps(func)
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
res = [Exception('function [%s] timeout [%s seconds] exceeded!' % (func.__name__, timeout))]
|
||||||
|
def newFunc():
|
||||||
|
try:
|
||||||
|
res[0] = func(*args, **kwargs)
|
||||||
|
except Exception as e:
|
||||||
|
res[0] = e
|
||||||
|
t = Thread(target=newFunc)
|
||||||
|
t.daemon = True
|
||||||
|
try:
|
||||||
|
t.start()
|
||||||
|
t.join(timeout)
|
||||||
|
except Exception as je:
|
||||||
|
print ('error starting thread')
|
||||||
|
raise je
|
||||||
|
ret = res[0]
|
||||||
|
if isinstance(ret, BaseException):
|
||||||
|
raise ret
|
||||||
|
return ret
|
||||||
|
return wrapper
|
||||||
|
return deco
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
@timeout(timeout=5)
|
||||||
|
def long_running_function():
|
||||||
|
import time
|
||||||
|
time.sleep(10)
|
||||||
|
return "Function completed successfully"
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = long_running_function()
|
||||||
|
print(result)
|
||||||
|
except TimeoutError as e:
|
||||||
|
print(e)
|
5
prime_streaming/pyvenv.cfg
Normal file
5
prime_streaming/pyvenv.cfg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
home = C:\Python312
|
||||||
|
include-system-site-packages = false
|
||||||
|
version = 3.12.0
|
||||||
|
executable = C:\Python312\python.exe
|
||||||
|
command = C:\Python312\python.exe -m venv C:\Users\GASSERTH\source\bidouilles\codewars\prime_streaming
|
58
prime_streaming/stream.py
Normal file
58
prime_streaming/stream.py
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def sieve_np(limit):
|
||||||
|
if limit < 2:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Create a boolean array "is_prime" and initialize all entries as True
|
||||||
|
is_prime = np.ones(limit + 1, dtype=bool)
|
||||||
|
is_prime[0:2] = False # 0 and 1 are not prime numbers
|
||||||
|
|
||||||
|
for p in range(2, int(limit**0.5) + 1):
|
||||||
|
if is_prime[p]:
|
||||||
|
# Use array slicing to mark all multiples of p as not prime
|
||||||
|
is_prime[p**2 : limit + 1 : p] = False
|
||||||
|
|
||||||
|
# Create a list of prime numbers using NumPy's where function
|
||||||
|
primes = np.where(is_prime)[0]
|
||||||
|
return primes.tolist()
|
||||||
|
|
||||||
|
def sieve(max_n):
|
||||||
|
s = [True] * (max_n + 1)
|
||||||
|
p = 2
|
||||||
|
while p**2 <= max_n:
|
||||||
|
if s[p]:
|
||||||
|
for i in range(p**2, max_n + 1, p):
|
||||||
|
s[i] = False
|
||||||
|
p += 1
|
||||||
|
|
||||||
|
primes = [p for p in range(2, max_n + 1) if s[p]]
|
||||||
|
return primes
|
||||||
|
|
||||||
|
|
||||||
|
def sieve_of_eratosthenes(limit):
|
||||||
|
if limit < 2:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# Create a boolean array "prime[0..limit]" and initialize all entries as True
|
||||||
|
prime = [True] * (limit + 1)
|
||||||
|
prime[0] = prime[1] = False # 0 and 1 are not prime numbers
|
||||||
|
|
||||||
|
p = 2
|
||||||
|
while p**2 <= limit:
|
||||||
|
if prime[p]:
|
||||||
|
# Update all multiples of p starting from p^2
|
||||||
|
prime[p**2 : limit + 1 : p] = [False] * len(prime[p**2 : limit + 1 : p])
|
||||||
|
p += 1
|
||||||
|
|
||||||
|
# Create a list of prime numbers
|
||||||
|
primes = [p for p in range(2, limit + 1) if prime[p]]
|
||||||
|
return primes
|
||||||
|
|
||||||
|
|
||||||
|
class Primes:
|
||||||
|
primes = sieve(25_000_000)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def stream():
|
||||||
|
yield from Primes.primes
|
34
recover_secret/recover_secret.py
Normal file
34
recover_secret/recover_secret.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# https://www.codewars.com/kata/53f40dff5f9d31b813000774/train/python
|
||||||
|
# Recover a secret string from random triplets
|
||||||
|
def recoverSecret(triplets):
|
||||||
|
transposed = list(zip(*triplets))
|
||||||
|
sets = [set(x) for x in transposed]
|
||||||
|
return sets
|
||||||
|
return (sets[0],
|
||||||
|
sets[1] - sets[0],
|
||||||
|
sets[2] - sets[1] - sets[0])
|
||||||
|
|
||||||
|
test_data = [[['t','u','p'], ['w','h','i'], ['t','s','u'], ['a','t','s'], ['h','a','p'], ['t','i','s'], ['w','h','s']],
|
||||||
|
[['t', 's', 'f'], ['a', 's', 'u'], ['m', 'a', 'f'], ['a', 'i', 'n'], ['s', 'u', 'n'], ['m', 'f', 'u'], ['a', 't', 'h'], ['t', 'h', 'i'], ['h', 'i', 'f'], ['m', 'h', 'f'], ['a', 'u', 'n'], ['m', 'a', 't'], ['f', 'u', 'n'], ['h', 's', 'n'], ['a', 'i', 's'], ['m', 's', 'n'], ['m', 's', 'u']],
|
||||||
|
[['t', 's', 'f'], ['a', 's', 'u'], ['m', 'a', 'f'], ['a', 'i', 'n'], ['s', 'u', 'n'], ['m', 'f', 'u'], ['a', 't', 'h'], ['t', 'h', 'i'], ['h', 'i', 'f'], ['m', 'h', 'f'], ['a', 'u', 'n'], ['m', 'a', 't'], ['f', 'u', 'n'], ['h', 's', 'n'], ['a', 'i', 's'], ['m', 's', 'n'], ['m', 's', 'u']],
|
||||||
|
[['g', 'a', 's'], ['o', 'g', 's'], ['c', 'n', 't'], ['c', 'o', 'n'], ['a', 't', 's'], ['g', 'r', 't'], ['r', 't', 's'], ['c', 'r', 'a'], ['g', 'a', 't'], ['n', 'g', 's'], ['o', 'a', 's']]]
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# tests
|
||||||
|
triplets = [['t','u','p'], ['w','h','i'], ['t','s','u'], ['a','t','s'], ['h','a','p'], ['t','i','s'], ['w','h','s']]
|
||||||
|
res = recoverSecret(triplets)
|
||||||
|
#assert res == "whatisup"
|
||||||
|
|
||||||
|
triplets = [['t', 's', 'f'], ['a', 's', 'u'], ['m', 'a', 'f'], ['a', 'i', 'n'], ['s', 'u', 'n'], ['m', 'f', 'u'], ['a', 't', 'h'], ['t', 'h', 'i'], ['h', 'i', 'f'], ['m', 'h', 'f'], ['a', 'u', 'n'], ['m', 'a', 't'], ['f', 'u', 'n'], ['h', 's', 'n'], ['a', 'i', 's'], ['m', 's', 'n'], ['m', 's', 'u']]
|
||||||
|
res = recoverSecret(triplets)
|
||||||
|
#assert res == "mathisfun"
|
||||||
|
|
||||||
|
triplets = [['g', 'a', 's'], ['o', 'g', 's'], ['c', 'n', 't'], ['c', 'o', 'n'], ['a', 't', 's'], ['g', 'r', 't'], ['r', 't', 's'], ['c', 'r', 'a'], ['g', 'a', 't'], ['n', 'g', 's'], ['o', 'a', 's']]
|
||||||
|
res = recoverSecret(triplets)
|
||||||
|
#assert res == "congrats"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
11
sum_strings/solution.py
Normal file
11
sum_strings/solution.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# https://www.codewars.com/kata/5324945e2ece5e1f32000370/
|
||||||
|
|
||||||
|
def sum_strings(s1, s2):
|
||||||
|
res = ""
|
||||||
|
carry = 0
|
||||||
|
s1, s2 = s1.zfill(len(s2)), s2.zfill(len(s1))
|
||||||
|
for d1, d2 in zip(s1[::-1], s2[::-1]):
|
||||||
|
carry, total = divmod(int(d1) + int(d2) + carry, 10)
|
||||||
|
res += str(total)
|
||||||
|
|
||||||
|
return (str(carry) + res[::-1]).lstrip('0') or '0'
|
93
sum_strings/tests.py
Normal file
93
sum_strings/tests.py
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import random
|
||||||
|
import codewars_test as test
|
||||||
|
from string import digits
|
||||||
|
from solution import sum_strings
|
||||||
|
|
||||||
|
|
||||||
|
def rand_str_num():
|
||||||
|
return ''.join(
|
||||||
|
random.choice(digits)
|
||||||
|
for _ in range(random.randint(0, 1000))
|
||||||
|
)
|
||||||
|
|
||||||
|
def __this_is_the_sol(x, y):
|
||||||
|
out, ret = '', 0
|
||||||
|
|
||||||
|
for c_x, c_y in zip(x.zfill(len(y))[::-1], y.zfill(len(x))[::-1]):
|
||||||
|
ret, d = divmod(int(c_x) + int(c_y) + ret, 10)
|
||||||
|
out += str(d)
|
||||||
|
|
||||||
|
out = f"{out}{'1' * ret}"[::-1] or '0'
|
||||||
|
return out if len(out) < 2 else out.lstrip('0')
|
||||||
|
|
||||||
|
|
||||||
|
@test.describe('Basic tests')
|
||||||
|
def test_examples():
|
||||||
|
|
||||||
|
@test.it('Example tests')
|
||||||
|
def basic_tests():
|
||||||
|
test.assert_equals(sum_strings("1", "1"), "2")
|
||||||
|
test.assert_equals(sum_strings("123", "456"), "579")
|
||||||
|
|
||||||
|
@test.it('Fixed tests')
|
||||||
|
def basic_test():
|
||||||
|
test.assert_equals(sum_strings("10", "20"), "30")
|
||||||
|
test.assert_equals(sum_strings("200", "100"), "300")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("99", "1"), "100")
|
||||||
|
test.assert_equals(sum_strings("42", "69"), "111")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("2999", "302"), "3301")
|
||||||
|
test.assert_equals(sum_strings("800", "9567"), "10367")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("00103", "08567"), "8670")
|
||||||
|
test.assert_equals(sum_strings("0", "0"), "0")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("0", "5"), "5")
|
||||||
|
test.assert_equals(sum_strings("5", "0"), "5")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("0", ""), "0")
|
||||||
|
test.assert_equals(sum_strings("", ""), "0")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("9999", ""), "9999")
|
||||||
|
test.assert_equals(sum_strings("", "9999"), "9999")
|
||||||
|
|
||||||
|
test.assert_equals(sum_strings("9999999999999999", "1"), "10000000000000000")
|
||||||
|
test.assert_equals(sum_strings("1", "9999999999999999"), "10000000000000000")
|
||||||
|
|
||||||
|
test.assert_equals(
|
||||||
|
sum_strings(
|
||||||
|
"712569312664357328695151392",
|
||||||
|
"8100824045303269669937"
|
||||||
|
),
|
||||||
|
"712577413488402631964821329",
|
||||||
|
)
|
||||||
|
|
||||||
|
test.assert_equals(
|
||||||
|
sum_strings(
|
||||||
|
"50095301248058391139327916261",
|
||||||
|
"81055900096023504197206408605"
|
||||||
|
),
|
||||||
|
"131151201344081895336534324866"
|
||||||
|
)
|
||||||
|
|
||||||
|
@test.it('Random tests')
|
||||||
|
def basic_test():
|
||||||
|
x = rand_str_num()
|
||||||
|
y = rand_str_num()
|
||||||
|
|
||||||
|
for _ in range(100):
|
||||||
|
test.assert_equals(
|
||||||
|
sum_strings(x, y),
|
||||||
|
__this_is_the_sol(x, y)
|
||||||
|
)
|
||||||
|
|
||||||
|
@test.it('Is it fast enough?')
|
||||||
|
def basic_test():
|
||||||
|
x = str(random.randint(10, 99)) * random.randint(1_000_000, 1_100_000)
|
||||||
|
y = str(random.randint(10, 99)) * random.randint(1_000_000, 1_100_000)
|
||||||
|
|
||||||
|
test.expect(
|
||||||
|
sum_strings(x, y) == __this_is_the_sol(x, y),
|
||||||
|
"big test failed"
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user