From 9603c859bc64e9d575285400764296478d69d466 Mon Sep 17 00:00:00 2001 From: randomuser Date: Fri, 14 Jul 2023 23:52:08 -0500 Subject: [PATCH] classed passwords --- passwords.py | 96 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 27 deletions(-) diff --git a/passwords.py b/passwords.py index b8af595..49bf9f2 100644 --- a/passwords.py +++ b/passwords.py @@ -1,33 +1,75 @@ -passwords = [ - 'about', 'after', 'again', 'below', 'could', - 'every', 'first', 'found', 'great', 'house', - 'large', 'learn', 'never', 'other', 'place', - 'plant', 'point', 'right', 'small', 'sound', - 'spell', 'still', 'study', 'their', 'there', - 'these', 'thing', 'think', 'three', 'water', - 'where', 'which', 'world', 'would', 'write' -] - -final = passwords - class FoundCondition(Exception): pass -responses = [] -for i in range(5): - response = [*input("{}th letters: ".format(str(i)))] - responses.append(response) +class PasswordModule: + """ + takes in information about passwords and returns the password + it could be given the information. implementation is pursuant + Bomb Defusal Manual, Version 1, English, Page 16. + """ + passwords = [ + 'about', 'after', 'again', 'below', 'could', + 'every', 'first', 'found', 'great', 'house', + 'large', 'learn', 'never', 'other', 'place', + 'plant', 'point', 'right', 'small', 'sound', + 'spell', 'still', 'study', 'their', 'there', + 'these', 'thing', 'think', 'three', 'water', + 'where', 'which', 'world', 'would', 'write' + ] -def check(index, word, responses): - if index == 5: - raise FoundCondition(word) + def __init__(self, cols): + """ + cols should contain a five element long array of numbers, + the first element containing all the possible characters for + the first position, the second containing all the characters for + the second position, and so on. + """ - for a in responses[index]: - if a == word[index]: - check(index + 1, word, responses) + self.responses = cols + self.word = None -for word in passwords: - try: - check(0, word, responses) - except FoundCondition as e: - print(str(e)) + def solve(self): + """ + start solving. + """ + for word in self.passwords: + try: + self._solver(0, word) + except FoundCondition as e: + self.word = str(e) + return self.word + + def _solver(self, index, word): + """ + internal method. end users need not use. + """ + responses = self.responses + + if index == 5: + raise FoundCondition(word) + + for a in responses[index]: + if a == word[index]: + self._solver(index + 1, word) + + @classmethod + def human_helper(cls): + """ + prints stuff out to console to prompt for information. + useful for module specific debugging. see usage in the + default module execution location + + (hint, default module execution location is where __name__ == + "__main__" + + """ + responses = [] + for i in range(5): + response = [*input("{}th letters: ".format(str(i)))] + responses.append(response) + + obj = cls(responses) + return obj.solve() + +if __name__ == "__main__": + print(PasswordModule.human_helper())