from math import log
next_lvl_k = 1.2
exp_per_level = 1000
def experience_for_level(level, q=next_lvl_k):
# geometric progression b * (q ^ n - 1) / (q - 1)
return round(exp_per_level * (q ** level - 1) / (q - 1))
def calculate_level(exp, q=next_lvl_k):
lvl = int(log(1 + (exp / exp_per_level) * (q - 1), q))
exp_next_lvl = experience_for_level(lvl + 1)
if exp >= exp_next_lvl:
return lvl + 1, exp_next_lvl - exp
else:
return lvl, exp - experience_for_level(lvl)
print(calculate_level(0) == (0, 0))
print(calculate_level(999) == (0, 999))
print(calculate_level(1000) == (1, 0))
print(calculate_level(1024) == (1, 24))
print(calculate_level(2200) == (2, 0))
print(calculate_level(3640) == (3, 0))
print(calculate_level(5368) == (4, 0))
print(calculate_level(5400) == (4, 5400 - 5368))
ZnJvbSBtYXRoIGltcG9ydCBsb2cKCm5leHRfbHZsX2sgPSAxLjIKZXhwX3Blcl9sZXZlbCA9IDEwMDAKCmRlZiBleHBlcmllbmNlX2Zvcl9sZXZlbChsZXZlbCwgcT1uZXh0X2x2bF9rKToKICAgICMgZ2VvbWV0cmljIHByb2dyZXNzaW9uIGIgKiAocSBeIG4gLSAxKSAvIChxIC0gMSkKICAgIHJldHVybiByb3VuZChleHBfcGVyX2xldmVsICogKHEgKiogbGV2ZWwgLSAxKSAvIChxIC0gMSkpCiAgICAKZGVmIGNhbGN1bGF0ZV9sZXZlbChleHAsIHE9bmV4dF9sdmxfayk6CiAgICBsdmwgPSBpbnQobG9nKDEgKyAoZXhwIC8gZXhwX3Blcl9sZXZlbCkgKiAocSAtIDEpLCBxKSkKICAgIGV4cF9uZXh0X2x2bCA9IGV4cGVyaWVuY2VfZm9yX2xldmVsKGx2bCArIDEpCgogICAgaWYgZXhwID49IGV4cF9uZXh0X2x2bDoKICAgICAgICByZXR1cm4gbHZsICsgMSwgZXhwX25leHRfbHZsIC0gZXhwCiAgICBlbHNlOgogICAgICAgIHJldHVybiBsdmwsIGV4cCAtIGV4cGVyaWVuY2VfZm9yX2xldmVsKGx2bCkKICAgICAgICAKcHJpbnQoY2FsY3VsYXRlX2xldmVsKDApID09ICgwLCAwKSkKcHJpbnQoY2FsY3VsYXRlX2xldmVsKDk5OSkgPT0gKDAsIDk5OSkpCnByaW50KGNhbGN1bGF0ZV9sZXZlbCgxMDAwKSA9PSAoMSwgMCkpCnByaW50KGNhbGN1bGF0ZV9sZXZlbCgxMDI0KSA9PSAoMSwgMjQpKQpwcmludChjYWxjdWxhdGVfbGV2ZWwoMjIwMCkgPT0gKDIsIDApKQpwcmludChjYWxjdWxhdGVfbGV2ZWwoMzY0MCkgPT0gKDMsIDApKQpwcmludChjYWxjdWxhdGVfbGV2ZWwoNTM2OCkgPT0gKDQsIDApKQpwcmludChjYWxjdWxhdGVfbGV2ZWwoNTQwMCkgPT0gKDQsIDU0MDAgLSA1MzY4KSk=