import timeit
def check_password(pa, pb):
# we can find the precise length of the password
# by timing how much it take to return depending
# on the given password length.
if len(pa) != len(pb):
return False
# we can guess the password, one character a time, by
# timing each character guess, if the execution takes
# longer time, we went one iteration further and found the correct
# character.
for a, b in zip(pa, pb):
if a != b:
return False
return True
print("timing password length:")
print(timeit.timeit('check_password("0123456789", "xxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "xxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "xxxxxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "xxxxxxxxxxxxx")', globals=globals()))
print("timing amount of correct characters:")
print(timeit.timeit('check_password("0123456789", "xxxxxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "0xxxxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "01xxxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "012xxxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "0123xxxxxx")', globals=globals()))
print(timeit.timeit('check_password("0123456789", "01234xxxxx")', globals=globals()))
aW1wb3J0IHRpbWVpdAoKZGVmIGNoZWNrX3Bhc3N3b3JkKHBhLCBwYik6CiAgIyB3ZSBjYW4gZmluZCB0aGUgcHJlY2lzZSBsZW5ndGggb2YgdGhlIHBhc3N3b3JkCiAgIyBieSB0aW1pbmcgaG93IG11Y2ggaXQgdGFrZSB0byByZXR1cm4gZGVwZW5kaW5nCiAgIyBvbiB0aGUgZ2l2ZW4gcGFzc3dvcmQgbGVuZ3RoLgogIGlmIGxlbihwYSkgIT0gbGVuKHBiKToKICAgIHJldHVybiBGYWxzZQoKICAjIHdlIGNhbiBndWVzcyB0aGUgcGFzc3dvcmQsIG9uZSBjaGFyYWN0ZXIgYSB0aW1lLCBieQogICMgdGltaW5nIGVhY2ggY2hhcmFjdGVyIGd1ZXNzLCBpZiB0aGUgZXhlY3V0aW9uIHRha2VzCiAgIyBsb25nZXIgdGltZSwgd2Ugd2VudCBvbmUgaXRlcmF0aW9uIGZ1cnRoZXIgYW5kIGZvdW5kIHRoZSBjb3JyZWN0CiAgIyBjaGFyYWN0ZXIuCiAgZm9yIGEsIGIgaW4gemlwKHBhLCBwYik6CiAgICBpZiBhICE9IGI6CiAgICAgIHJldHVybiBGYWxzZQoKICByZXR1cm4gVHJ1ZQoKcHJpbnQoInRpbWluZyBwYXNzd29yZCBsZW5ndGg6IikKcHJpbnQodGltZWl0LnRpbWVpdCgnY2hlY2tfcGFzc3dvcmQoIjAxMjM0NTY3ODkiLCAieHh4IiknLCBnbG9iYWxzPWdsb2JhbHMoKSkpCnByaW50KHRpbWVpdC50aW1laXQoJ2NoZWNrX3Bhc3N3b3JkKCIwMTIzNDU2Nzg5IiwgInh4eHh4eHgiKScsIGdsb2JhbHM9Z2xvYmFscygpKSkKcHJpbnQodGltZWl0LnRpbWVpdCgnY2hlY2tfcGFzc3dvcmQoIjAxMjM0NTY3ODkiLCAieHh4eHh4eHh4eCIpJywgZ2xvYmFscz1nbG9iYWxzKCkpKQpwcmludCh0aW1laXQudGltZWl0KCdjaGVja19wYXNzd29yZCgiMDEyMzQ1Njc4OSIsICJ4eHh4eHh4eHh4eHh4IiknLCBnbG9iYWxzPWdsb2JhbHMoKSkpCgpwcmludCgidGltaW5nIGFtb3VudCBvZiBjb3JyZWN0IGNoYXJhY3RlcnM6IikKcHJpbnQodGltZWl0LnRpbWVpdCgnY2hlY2tfcGFzc3dvcmQoIjAxMjM0NTY3ODkiLCAieHh4eHh4eHh4eCIpJywgZ2xvYmFscz1nbG9iYWxzKCkpKQpwcmludCh0aW1laXQudGltZWl0KCdjaGVja19wYXNzd29yZCgiMDEyMzQ1Njc4OSIsICIweHh4eHh4eHh4IiknLCBnbG9iYWxzPWdsb2JhbHMoKSkpCnByaW50KHRpbWVpdC50aW1laXQoJ2NoZWNrX3Bhc3N3b3JkKCIwMTIzNDU2Nzg5IiwgIjAxeHh4eHh4eHgiKScsIGdsb2JhbHM9Z2xvYmFscygpKSkKcHJpbnQodGltZWl0LnRpbWVpdCgnY2hlY2tfcGFzc3dvcmQoIjAxMjM0NTY3ODkiLCAiMDEyeHh4eHh4eCIpJywgZ2xvYmFscz1nbG9iYWxzKCkpKQpwcmludCh0aW1laXQudGltZWl0KCdjaGVja19wYXNzd29yZCgiMDEyMzQ1Njc4OSIsICIwMTIzeHh4eHh4IiknLCBnbG9iYWxzPWdsb2JhbHMoKSkpCnByaW50KHRpbWVpdC50aW1laXQoJ2NoZWNrX3Bhc3N3b3JkKCIwMTIzNDU2Nzg5IiwgIjAxMjM0eHh4eHgiKScsIGdsb2JhbHM9Z2xvYmFscygpKSk=