def __init__(self) -> None: self.SMS_KEYBOARD = { "A": 2, "B": 2, "C": 2, "D": 3, "E": 3, "F": 3, "G": 4, "H": 4, "I": 4, "J": 5, "K": 5, "L": 5, "M": 6, "N": 6, "O": 6, "P": 7, "Q": 7, "R": 7, "S": 7, "T": 8, "U": 8, "V": 8, "W": 9, "X": 9, "Y": 9, "Z": 9, "-": 0 } self.SMS_KEYS = invert_dict(self.SMS_KEYBOARD) self.wb = Woordenboek()
class StringWordAnalyser(object): def __init__(self, value="") -> None: self.wb = Woordenboek() self.sample = value def all_words(self, value) -> bool: self.sample = value try: self.__all_words() except NotFound: _("Sample was not a sentence") return False except Found as f: _("Found: ", f.value) return True def __all_words(self, value=None): if value: ret = value else: ret = self.sample for idx in range(len(ret), 1, -1): wrd = ret[0:idx] if self.wb.is_word(wrd): _(wrd) new_wrd = ret[idx:] if len(new_wrd) == 0: _(self.sample) raise Found(self.sample) self.__all_words(new_wrd) else: _(idx, wrd) if idx == 2: raise NotFound()
def __init__(self, value="") -> None: self.wb = Woordenboek() self.sample = value
voorbeeld: HALLOWERELDWIJZIJNMENSENMETHETGROTEGELUK het eerste woord dat je mogelijk vind is HA, maar ook HAL en HALLO voordat je geen woord meer kan vinden Stel jdat je met het langste woord begint dan kan je opnieuw beginnen op met HALLO er van af gehaald, maar je hebt ook de woorden (HA, HAL) bewaard. nu begin je opnieuw op de positie na HALLO. we vinden dan bijvoorbeeld (WE, en WERELD) begin weer bij het langste woord en ga zo door. Stel dat het na WERELD faalt (geen woorden meer) dan val je terug op WE en ga je weer verder totdat alles faalt en dan kan je nog terug vallen op HAL en weer opnieuw beginnen en HA etc. Het enige gelukkige pad is als alle 40 karakters gebruikt zijn in woorden. """ WB = Woordenboek() class NotFound(Exception): pass class Found(Exception): def __init__(self, msg) -> None: self.value = msg class StringWordAnalyser(object): def __init__(self, value="") -> None: self.wb = Woordenboek() self.sample = value
def woordenboek(): return Woordenboek()
class Sms(object): """SMS class for translating words to sms numbers or vise versa""" def __init__(self) -> None: self.SMS_KEYBOARD = { "A": 2, "B": 2, "C": 2, "D": 3, "E": 3, "F": 3, "G": 4, "H": 4, "I": 4, "J": 5, "K": 5, "L": 5, "M": 6, "N": 6, "O": 6, "P": 7, "Q": 7, "R": 7, "S": 7, "T": 8, "U": 8, "V": 8, "W": 9, "X": 9, "Y": 9, "Z": 9, "-": 0 } self.SMS_KEYS = invert_dict(self.SMS_KEYBOARD) self.wb = Woordenboek() def word_2_sms(self, word) -> str: """Translates a word to an sms number""" return ''.join([str(self.SMS_KEYBOARD[x]) for x in word.upper()]) def sms_2_word(self, number) -> list: """Gestimate of the possible words based on the T9 number code of an sms The gestimate is based on the Woordenboek dictionary so actually quite accurate. """ perms = [ ''.join(item) for item in itertools.product( *[self.SMS_KEYS[int(x)] for x in str(number)]) ] words = [wrd for wrd in perms if self.wb.is_word(wrd)] return words def txt_2_sms(self, txt) -> str: """ # Text 2 SMS keyboard code This function translates text to the sms key code equivalent. (T9 keyboard) """ words = txt.split(" ") return ' '.join([self.word_2_sms(x.strip()) for x in words]) def sms_2_txt(self, sms) -> str: """ # SMS to Text This function tries to translate sms key code back to text. This is more difficult a T9 keyboard can have multiple letters assigned to 1 key, so a dictionary is used to find viable words. Currently only the Dutch language is supported. The returned string is a string with per word all the possible solutions in there, so some "manual" decryption might still be needed. """ numbers = sms.split(" ") words = [self.sms_2_word(x) for x in numbers] ret = "" for wrd in words: if len(wrd) == 1: ret += wrd[0] else: ret += "/".join(wrd) ret += " " return ret
def setUp(self): self.wb = Woordenboek()
class TestWoordenboek(TestCase): def setUp(self): self.wb = Woordenboek() def test_is_woord(self): self.assertTrue(self.wb.is_word("regen")) self.assertTrue(self.wb.is_word("aalsmeerder")) def test_anagram(self): self.assertEqual(['SERVISCH', 'VISSCHER'], self.wb.anagram("servisch")) self.assertEqual(['SERVISCH', 'VISSCHER'], self.wb.anagram("servisch")) anagram = self.wb.anagram("SHOTSCOLA") # rits SCHOTS en COLA naar SCHOOLTAS of zoek het gewoon op :-) anagram.sort() self.assertListEqual(['SCHOOLTAS', 'SHOTSCOLA'], anagram) def test_ends_with(self): self.assertEqual(['DOCTOR', 'EREDOCTOR', 'SPINDOCTOR'], self.wb.ends_with("DOCTOR")) def test_starts_with(self): self.assertEqual( ['HETER', 'CATHETER', 'KATHETER', 'BALLONKATHETER', 'BLAASKATHETER', 'URINEKATHETER', 'MAAGKATHETER'], self.wb.ends_with("HETER")) def test_contains(self): self.assertEqual( ['LIEFDE', 'BLIEFDE', 'KLIEFDE', 'LIEFDEN', 'LIEFDES', 'BELIEFDE', 'BLIEFDEN', 'GELIEFDE', 'KLIEFDEN', 'VERLIEFDE', 'APENLIEFDE', 'BOEKENLIEFDE', 'BROEDERLIEFDE', 'CLUBLIEFDE', 'DIERENLIEFDE', 'EIGENLIEFDE', 'EX-GELIEFDE', 'FILMLIEFDE', 'GESLACHTSLIEFDE', 'HAAT-LIEFDEVERHOUDING', 'HERENLIEFDE', 'JEUGDLIEFDE', 'JONGENSLIEFDE', 'KALVERLIEFDE', 'KINDERLIEFDE', 'KNAPENLIEFDE', 'LIEFDEBAND', 'LIEFDEBETREKKING', 'LIEFDEBETUIGING', 'LIEFDEBEURT', 'LIEFDEBLIJK', 'LIEFDEBRIEF', 'LIEFDEDAAD', 'LIEFDEDIENST', 'LIEFDEGAVE', 'LIEFDEGEBOD', 'LIEFDEGESCHIEDENIS', 'LIEFDEGESTICHT', 'LIEFDEGIFT', 'LIEFDEGROET', 'LIEFDEKRACHT', 'LIEFDELEVEN', 'LIEFDELOOS', 'LIEFDELOOSHEID', 'LIEFDEMAAL', 'LIEFDERIJK', 'LIEFDESAFFAIRE', 'LIEFDESAVONTUUR', 'LIEFDESBABY', 'LIEFDESBAND', 'LIEFDESBELEVING', 'LIEFDESBETREKKING', 'LIEFDESBETUIGING', 'LIEFDESBOODSCHAP', 'LIEFDESBRIEF', 'LIEFDESDAAD', 'LIEFDESDRAMA', 'LIEFDESDRANK', 'LIEFDESENERGIE', 'LIEFDESFILM', 'LIEFDESGEBIED', 'LIEFDESGEDICHT', 'LIEFDESGELUK', 'LIEFDESGESCHIEDENIS', 'LIEFDESGOD', 'LIEFDESGODIN', 'LIEFDESIDEAAL', 'LIEFDESKIND', 'LIEFDESKOPPEL', 'LIEFDESKRACHT', 'LIEFDESLEED', 'LIEFDESLEVEN', 'LIEFDESLIED', 'LIEFDESLYRIEK', 'LIEFDESMART', 'LIEFDESNAAM', 'LIEFDESNACHT', 'LIEFDESNEST', 'LIEFDESNESTJE', 'LIEFDESOBJECT', 'LIEFDESPAAR', 'LIEFDESPAD', 'LIEFDESPARTNER', 'LIEFDESPEL', 'LIEFDESPIJN', 'LIEFDESPOEZIE', 'LIEFDESRELATIE', 'LIEFDESROMAN', 'LIEFDESSCENE', 'LIEFDESSPEL', 'LIEFDESTHEMA', 'LIEFDESVERDRIET', 'LIEFDESVERHAAL', 'LIEFDESVERHOUDING', 'LIEFDESVERKLARING', 'LIEFDESVERLANGEN', 'LIEFDESVERRAAD', 'LIEFDESVUUR', 'LIEFDEVERKLARING', 'LIEFDEVOL', 'LIEFDEWERK', 'LIEFDEZUSTER', 'MANNENLIEFDE', 'MENSENLIEFDE', 'MOEDERLIEFDE', 'NAASTENLIEFDE', 'NATUURLIEFDE', 'OUDERLIEFDE', 'VADERLANDSLIEFDE', 'VADERLIEFDE', 'VAKANTIELIEFDE', 'VOORLIEFDE', 'VRIJHEIDSLIEFDE', 'VROUWENLIEFDE', 'WAARHEIDSLIEFDE', 'WEDERLIEFDE', 'ZOMERLIEFDE', 'ZUSTERLIEFDE', 'LIEFDESERVARING', 'LIEFDESSMART', 'HAAT-LIEFDERELATIE', 'KONINGSLIEFDE', 'BELIEFDEN', 'DOORKLIEFDE', 'DOORKLIEFDEN', 'GEKLIEFDE', 'GEKLIEFDEN', 'GELIEFDEN', 'GELIEFDER', 'GELIEFDERE', 'KALVERLIEFDES', 'LIEFDEBANDEN', 'LIEFDEBETUIGINGEN', 'LIEFDEBEURTEN', 'LIEFDEBLIJKEN', 'LIEFDEBRIEVEN', 'LIEFDEDIENSTEN', 'LIEFDEGAVEN', 'LIEFDEGESTICHTEN', 'LIEFDEGIFTEN', 'LIEFDELOZE', 'LIEFDELOZER', 'LIEFDEMALEN', 'LIEFDERIJKE', 'LIEFDERIJKER', 'LIEFDERIJKSTE', 'LIEFDESAVONTUREN', 'LIEFDESBETREKKINGEN', 'LIEFDESBETUIGINGEN', 'LIEFDESBRIEVEN', "LIEFDESDRAMA'S", 'LIEFDESFILMS', 'LIEFDESGESCHIEDENISSEN', 'LIEFDESLIEDJE', 'LIEFDESLIEDJES', 'LIEFDESPAARTJE', 'LIEFDESRELATIES', 'LIEFDESROMANS', 'LIEFDESVERHALEN', 'LIEFDESVERKLARINGEN', 'LIEFDESVERSJE', 'LIEFDEVERKLARINGEN', 'LIEFDEVOLLE', 'LIEFDEWERKEN', 'LIEFDEZUSTERS', 'SMOORVERLIEFDE', 'TEERGELIEFDE', 'VEELGELIEFDE', 'VERLIEFDEN', 'VERLIEFDER', 'VOORLIEFDES', 'WELGELIEFDE', 'ZIELSGELIEFDE', 'JEUGDLIEFDES', 'LIEFDEBETREKKINGEN', 'LIEFDEDADEN', 'LIEFDEGESCHIEDENISSEN', 'LIEFDESAFFAIRES', 'LIEFDESGEDICHTEN', 'LIEFDESLIEDEREN', 'LIEFDESPAREN', 'LIEFDESPARTNERS', 'LIEFDESSCENES', 'LIEFDEVOLLER', 'LIEFDEVOLLERE', 'STAPELVERLIEFDE', 'LIEFDESDRANKEN', 'LIEFDESVERHOUDINGEN', 'LIEFDELOOST', 'ONGELIEFDE', 'BALVERLIEFDE', 'LIEFDESAVONTUURTJE', 'LIEFDESROMANNETJE', 'LIEFDESERVARINGEN', 'LIEFDESDADEN', 'HAAT-LIEFDEVERHOUDINGEN', 'LIEFDESNACHTEN', 'LIEFDESDRANKJES', 'VAKANTIELIEFDES', 'LIEFDESVERHAALTJE', 'LIEFDESBANDEN', 'LIEFDESLEVENS', 'LIEFDESDRANKJE', 'LIEFDESGEDICHTJE', 'LIEFDESBRIEFJES', 'LIEFDESGEDICHTJES', 'LIEFDESROMANNETJES', 'LIEFDESVERHAALTJES', 'LIEFDESVERLANGENS', 'LIEFDESAVONTUURTJES', 'LIEFDEKRACHTEN', 'LIEFDESPIJNEN', 'LIEFDESKOPPELTJE', "LIEFDESBABY'S", 'LIEFDESSPELLETJES', 'LIEFDESBRIEFJE', 'LIEFDESNESTJES', 'LIEFDESBOODSCHAPPEN', 'HAATLIEFDE', 'LIEFDEBLIKKEN', 'LIEFDEGEDICHTEN', 'LIEFDELIED', 'LIEFDERIJKEN', 'HAATLIEFDEVERHOUDING', 'HAATLIEFDE-VERHOUDING'], self.wb.contains("liefde")) def test_not_contains(self): self.assertEqual(['AU', 'HA', 'HUH', 'QUA', 'A', 'A3', 'A4', 'AAA', 'AA', 'HAU', 'HU', 'AH', 'AHA', 'H', 'HAHA', 'Q', 'Q.Q.', 'U', '06'], self.wb.not_contains("BCDEFGIJKLMNOPRSTVWXYZ")) def test_by_same_word_plus_one_letter(self): self.assertEqual(['BOOMKLEVER'], self.wb.by_same_word_plus_one_letter("BOOMKEVER")) self.assertSequenceEqual(['KREKEL', 'REKELS'], self.wb.by_same_word_plus_one_letter("rekel"))
def letters_is_word(txt, index=0): wb = Woordenboek() return wb.is_word(letters(txt, index))