1
0
Fork 0

2015 day 11

This commit is contained in:
Lucidiot 2018-12-01 14:53:37 +01:00
parent 3dd9ea1f9f
commit 731606231e
No known key found for this signature in database
GPG Key ID: AE3F7205692FA205
2 changed files with 58 additions and 0 deletions

57
2015/11/passgen.py Executable file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env python3
from string import ascii_lowercase
from baseconv import BaseConverter
class IncrementalPasswordGenerator(object):
def __init__(self,
initial='abcdefgh',
alphabet=ascii_lowercase,
ignored='iol'):
self.alphabet = alphabet.translate({ord(c): None for c in ignored})
self.password_length = len(initial)
self.converter = BaseConverter(self.alphabet)
self.current = int(self.converter.decode(initial))
def __iter__(self):
return self
def __next__(self):
self.current += 1
self.encoded = self.converter.encode(self.current).rjust(self.password_length, self.alphabet[0])
return self.encoded
class SantaPasswordGenerator(IncrementalPasswordGenerator):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pairs = {letter * 2 for letter in self.alphabet}
self.suites = {self.alphabet[i:i+3] for i in range(len(self.alphabet) - 2)}
def __iter__(self):
return self
def __next__(self):
super().__next__()
while not self.is_valid:
super().__next__()
return self.encoded
@property
def is_valid(self):
try:
pairs_gen = filter(lambda pair: pair in self.encoded, self.pairs)
next(pairs_gen)
next(pairs_gen)
assert any(suite in self.encoded for suite in self.suites)
return True
except (AssertionError, StopIteration):
return False
if __name__ == '__main__':
import sys
gen = SantaPasswordGenerator(sys.argv[1])
print(next(gen), next(gen))

1
2015/11/requirements.txt Normal file
View File

@ -0,0 +1 @@
python-baseconv>=1.2