Olá, antes de explicar certinho o projeto que estou desenvolvendo, quero dar um pequeno preambulo: sou um grande fã do escritor J. R. R. Tolkien (escritor de senhor dos anéis, o Hobbit e outros), uma coisa onipresente na ora de Tolkien são as raças diversas e seus idiomas próprios, já que o escritor também era um grande estudioso e professor de idiomas/línguas. Tolkien amava tanto a linguística que chegou a criar seus próprios idiomas e usar em seus textos, o que me fascina! Também adoro jogos de enigmas, que em quase todos há a presença de códigos diferentes e tipos de cifras para poder descifrar os enigmas, césar, Hex, ASCII, binário, vigenere... E o que essas coisas tem em comum? (pelo menos na minha cabeça). Sempre quis criar meu próprio idioma com Tolkien e agora que comecei a entrar no mundo da programação as noções de código e automação de funções se fundiram e comecei a criar um processo para me facilitar a criação de meu idioma(ou proto-cifra...)
O problema do modo cifra: Quero que o idioma tenha caracteres diferentes desses que usamos normalmente (que você está lendo), mas não quero fazer um simples "troca, troca" como em código L33T, que simplesmente troca letras por números que se parecem. ("ALURA É MASSA" vira "4lur4 3 m4554") Quero traduções mesmo, assim como "book" é uma palavra inglesa que pode se traduzir para "livro", quero por exemplo que "alubix" possa ser traduzido para "livro", e não que "alubix" seja simplesmente "livro" codificado.
(Vou usar ASCII como exemplo pela proximidade que o código tem com o que estou fazendo) O ASCII é um código numérico que representa os caracteres, usando uma escala decimal de 0 a 127. Esses números decimais são então convertidos pelo computador para binários e ele processa seu comando. Por exemplo: "A" em ASCII corresponde a "065" (que também é "01000001" em binário). Assim com o tradutor de ASCII funciona associando um número a uma letra, quero criar um programa que associe números, mas não a letras, e sim a silabas, o que, vai ajudar a solucionar o problema do modo cifra, dando uma impressão maior de tradução ao invés de codificação.
Até agora trabalhei me baseando no português, o que é quase uma sentença de morte, já que na nossa língua não há apenas silabas simples com "ba, be, bi, bo, bu" também há silabas complexas como "pra, pre, pri, pro, pru" o que cria a necessidade de uma tabela gigantesca de informações para algo simples como escrever "con, di, cio, na, dor". Comecei criando uma função para criar a lista de todas as silabas com:
class Cria_Silabas():
def __init__(self):
self.vogais = ['','a','b'...]
# listo todas as letras do alfabeto, junto de um espaço vazio.
def listar_silabas(self):
lista_silabas = []
for vogais in self.vogais:
for vogais2 in self.vogais:
for vogais3 in self.vogais:
lista_silabas.append(vogais + vogais2 + vogais3)
#uso 3 "for" um dentro do outro para criar uma lista com todas as combinações possíveis de 3 letras, o espaço vazio é importante para criar silabas simples como "ba", e letras soltas como "a" que na separação silábica as vezes aparecem separada das demais.
lista_silabas = set(lista_silabas)
lista_silabas = list(lista_silabas)
return lista_silabas
#transformo a lista_silabas em uma sequência "set" para eliminar os elementos iguais e depois o volto para uma lista, já que vou ter de mexer com ela (ou seu retorno).
Esse método funciona, mas tem problemas, o primeiro e mais importante é que ele gera muita informação simplesmente inútil, já que dando um "len(lista_silabas)" ele retorna que há nessa lista 20440 elementos, e um deles é, por exemplo: "xkq" que, sinceramente eu acho improvável essa silaba aparecer em alguma palavra.
E em outra classe eu uso:
def codifica(self, palavra):
palavra_lista = palavra
palavra_numerica = []
for silaba in palavra:
palavra_numerica.append(self.lista.index(silaba))
print(palavra_numerica)
#aqui eu transformo o parâmetro "palavra" (que deve ser colocado com as silabas separadas) em um conjunto numérico que equivale a aquelas silabas.
def decodifica(self, codigo):
codigo_lista = codigo
palavra = []
for numero in codigo:
palavra.append(self.lista[numero])
print(palavra)
#aqui faço o inverso, ele recebe números (posições na lista) e retorna as silabas equivalentes
Bem, até agora o projeto tem vários problemas e está longe de sua conclusão, compartilho aqui para caso alguém tenha alguma dica para os próximos passos. Do que consigo ver, preciso de um leitor de arquivos que separe cada palavra, separe sua silabas e me retorne o texto em código daquela tabela, para depois eu poder associar os números a símbolos e dizer que está fundado um novo idioma (ou proto idioma em código). O que acham?