You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
2.0 KiB
Python

start_password = "vzbxkghb"
# start_password = "abcdefgh"
print("Start password:", start_password)
def b26_to_int(input_string):
result = 0
exp = 1
for char in input_string[::-1]:
char_value = ord(char) - 97 # from 0 to 25
result += char_value * exp
exp *= 26
return result
def int_to_b26(input_number):
result = ""
while input_number:
quot, remainder = divmod(input_number, 26)
result += chr(remainder + 97)
input_number = quot
return result[::-1]
def increment_password(password):
return int_to_b26(b26_to_int(password) + 1).rjust(8, "a")
STRAIGHTS = [chr(x + 97) + chr(x + 98) + chr(x + 99) for x in range(24)]
def has_increasing_straight(password):
for straight in STRAIGHTS:
if straight in password:
return True
return False
def has_forbidden_letter(password):
for char in ["i", "o", "l"]:
if char in password:
return True
return False
PAIRS = [chr(x + 97) + chr(x + 97) for x in range(26)]
def contains_two_pairs(password):
count_pairs = 0
for pair in PAIRS:
if pair in password:
count_pairs += 1
if count_pairs >= 2:
return True
return False
def validate_password(password):
return (
has_increasing_straight(password)
and not has_forbidden_letter(password)
and contains_two_pairs(password)
)
# to_int = b26_to_int(start_password)
# print(start_password, to_int, int_to_b26(to_int))
# print(start_password, increment_password(start_password))
# for pwd in ["hijklmmn", "abbceffg", "abbcegjk", "abcdffaa", "ghjaabcc"]:
# print(pwd)
# print(validate_password(pwd))
# print()
# print(STRAIGHTS)
# print(PAIRS)
while not validate_password(start_password):
start_password = increment_password(start_password)
start_password = increment_password(start_password)
while not validate_password(start_password):
start_password = increment_password(start_password)
print(start_password)
# false guess: vzcaabcc