59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
|
import logging
|
||
|
|
||
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
||
|
|
||
|
|
||
|
class DectUtils:
|
||
|
"""
|
||
|
This class contains dect number <> letter related utilities
|
||
|
"""
|
||
|
|
||
|
DECT_MATRIX = {
|
||
|
"2": ["A", "B", "C"],
|
||
|
"3": ["D", "E", "F"],
|
||
|
"4": ["G", "H", "I"],
|
||
|
"5": ["J", "K", "L"],
|
||
|
"6": ["M", "N", "O"],
|
||
|
"7": ["P", "Q", "R", "S"],
|
||
|
"8": ["T", "U", "V"],
|
||
|
"9": ["W", "X", "Y", "Z"],
|
||
|
}
|
||
|
|
||
|
def __init__(self):
|
||
|
"""
|
||
|
Build a reverse lookup matrix based on self.DECT_MATRIX
|
||
|
"""
|
||
|
self.REVERSE_DECT_MATRIX = {}
|
||
|
for digit in self.DECT_MATRIX.keys():
|
||
|
for letter in self.DECT_MATRIX[digit]:
|
||
|
self.REVERSE_DECT_MATRIX[letter] = digit
|
||
|
|
||
|
def get_dect_letter_combinations(self, numbers):
|
||
|
"""
|
||
|
Generator to recursively get all combinations of letters for this number
|
||
|
"""
|
||
|
if "0" in numbers or "1" in numbers:
|
||
|
logger.error(
|
||
|
"Numbers with 0 or 1 in them are not expressible as letters, bail out"
|
||
|
)
|
||
|
return False
|
||
|
# loop over the possible letters for the first digit
|
||
|
for letter in self.DECT_MATRIX[numbers[0]]:
|
||
|
# if we have more digits..
|
||
|
if len(numbers) > 1:
|
||
|
# call recursively with the remaining digits, and loop over the result
|
||
|
for nextletter in self.get_dect_letter_combinations(numbers[1:]):
|
||
|
yield letter + nextletter
|
||
|
else:
|
||
|
# no more digits left, just yield the current letter
|
||
|
yield letter
|
||
|
|
||
|
def letters_to_number(self, letters):
|
||
|
"""
|
||
|
Coverts "TYKL" to "8955"
|
||
|
"""
|
||
|
result = ""
|
||
|
for letter in letters:
|
||
|
result += self.REVERSE_DECT_MATRIX[letter]
|
||
|
return result
|