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