2015 day 11
This commit is contained in:
parent
3dd9ea1f9f
commit
731606231e
|
@ -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))
|
|
@ -0,0 +1 @@
|
||||||
|
python-baseconv>=1.2
|
Loading…
Reference in New Issue