mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
64 lines
1.4 KiB
Python
64 lines
1.4 KiB
Python
from __future__ import print_function
|
|
import string
|
|
|
|
letters = [c for c in string.ascii_lowercase]
|
|
|
|
password = "hxbxwxba"
|
|
|
|
forbidden = set([letters.index(c) for c in "iol"])
|
|
passwordCode = [letters.index(c) for c in password]
|
|
|
|
def convert(password):
|
|
return [letters.index(c) for c in password]
|
|
|
|
def isOk(password):
|
|
hasStreak = False
|
|
prev = -2
|
|
streak = 1
|
|
same = 0
|
|
sameChar = None
|
|
for x in password:
|
|
if x in forbidden:
|
|
return False
|
|
|
|
if x == prev + 1:
|
|
streak += 1
|
|
if streak >= 3:
|
|
hasStreak = True
|
|
else:
|
|
streak = 1
|
|
|
|
if x == prev and x is not sameChar:
|
|
same += 1
|
|
sameChar = x
|
|
|
|
prev = x
|
|
|
|
return hasStreak and same >= 2
|
|
|
|
def incrementForbidden(password):
|
|
for idx, x in enumerate(password):
|
|
if x in forbidden:
|
|
password[idx] = (x + 1) % len(letters)
|
|
for i in range(idx + 1, len(password)):
|
|
password[i] = 0
|
|
|
|
return
|
|
|
|
def increment(password):
|
|
carry = True
|
|
i = len(password)
|
|
while carry and i > 0:
|
|
i -= 1
|
|
password[i] = (password[i] + 1) % len(letters)
|
|
carry = password[i] == 0
|
|
|
|
incrementForbidden(password)
|
|
|
|
for x in range(2):
|
|
increment(passwordCode)
|
|
while not isOk(passwordCode):
|
|
increment(passwordCode)
|
|
|
|
print("Next password is", ''.join([letters[c] for c in passwordCode]))
|