class TicTacToe:
def __init__(self) -> None:
self.board = self.__init_board()
def __init_board(self) -> list:
# Create an empty boar
board = [ [" "] * 3 for _ in range(3) ]
return board
def write_input(self, value:str, row=0, column=0) -> None:
# Write a value to a specific case on the board
self.board[row][column] = value
def clear_boar(self) -> None:
# Clear the board
self.board = self.__init_board()
def print_board(self) -> None:
print('\n')
for row in self.board:
print('|'.join(row))
class Cipher:
def __init__(self) -> None:
self.base3_values = [' ', 'X', 'O']
def __encode_char(self, char:str) -> list[str]:
# Encode a char in a list of 3 base-3 values
char = char.lower()
position = ord(char) - ord('a') + 1 # +1 cause blank row (or 000) is reserved for stop sequence
base3 = []
while position > 0:
index = position % 3
base3_component = self.base3_values[index]
base3.append(base3_component)
position //= 3
return base3
def __decode_char(self, base3:list[str]) -> str:
# Decode a list of 3 base-3 values into char
position = 0
for power, symbol in enumerate(base3):
digit = self.base3_values.index(symbol)
position += digit * (3 ** power)
# Check for stop sequence
if position == 0:
return None
char = chr(position + ord('a') - 1) # undo the +1 that was applied during encoding
return char
def encode(self, message:str) -> list[TicTacToe]:
# Encode a string into sets of board states
message = list(message)
boards = []
while message:
board = TicTacToe()
loop_count = min(3, len(message))
for row_index in range(loop_count):
char = message.pop(0)
row = self.__encode_char(char)
for col_index, char in enumerate(row):
board.write_input(char, row_index, col_index)
boards.append(board)
return boards
def decode(self, boards:list[TicTacToe]) -> str:
# Decode board states into a string
message = ""
for board in boards:
for row in board.board:
char = self.__decode_char(row)
if not char:
return message
message += char
return message
cipher = Cipher()
# Encode a message into boards
boards = cipher.encode('TREASURE')
# Show the boards
for b in boards:
b.print_board() # show the boards
# Decode the boards
message = cipher.decode(boards)
print(message)
O| |O
| |O
O|X|
X| |
X| |O
|X|O
| |O
O|X|
| |
treasure
X| |
X| |O
|X|O
| |O
O|X|
| |
treasure