Editor de Texto

1. Revisão de Conceitos Chave

Para implementar esse editor de forma, vamos relembrar alguns conceitos vistos em sala.

Representação do Estado (Texto e Cursor)

O editor possui duas informações principais que mudam ao longo do tempo:

  1. O conteúdo do texto.
  2. A posição do cursor.

Vocês podem pensar no cursor como um índice numérico. Se o texto tem L caracteres, o cursor pode assumir posições de 0 (antes do primeiro caractere) até L (depois do último caractere).

Nessa, ideia, perceba que estou assumindo o cursor com posição 10 como estando “antes” do caractere na posíção 10 (o décimo primeiro caractere). Você pode fazer diferente, o que fizer mais sentido para você.

Ao longo dessas dicas, eu vou assumir essa lógica de cursor antes da posição que ele “está”.

Mutabilidade: Listas vs. Strings

Em muitas linguagens de programação (como Python), as strings são imutáveis. Isso significa que você não pode alterar um caractere diretamente fazendo texto[índice] = 'a'.

  • Dica: Você pode converter uma string s em uma lista de caracteres utilizando o compando list(s). Listas são mutáveis, permitindo inserções (insert) e remoções (pop ou del) de elementos de forma direta em qualquer posição do índice. Para juntar uma lista de strings l em uma string só, é possível usar o comando ''.join(l).

Processamento de Comandos

Os comandos vêm em formatos variados: alguns têm apenas uma letra (x, X, F), enquanto outros vêm acompanhados de argumentos (E N, i C, I P).

  • Utilizar funções de partição de strings, como o método .split(), ajudará a separar a letra do comando de seus respectivos argumentos antes de decidir qual função executar.

Lembre-se de sempre dividir o seu problema em problemas menores. Cada problema menor pode virar uma função, o que deixa tudo mais fácil de codar.

2. Estratégias de Implementação e Algoritmo

Será necessário repetir uma série de passos ENQUANTO não é lido o comando F. Qual estrutura de repetição (laço) aprendemos que pode nos ajudar nesse caso?

Dicas para cada comando:

  • Mover Cursor (E N e D N): Lembrem-se de que o cursor não pode “escapar” dos limites do texto. Ao mover para a esquerda, o limite inferior é 0. Ao mover para a direita, o limite superior é o tamanho atual do texto. Lembre-se de sempre checar ao mover o cursor.
  • Apagar Caractere (x): Esse comando apaga o elemento que está imediatamente à direita do cursor. Se o cursor estiver na posição correspondente ao tamanho do texto, não há nada à direita para apagar.
  • Inserir Caractere (i C): A inserção acontece exatamente na posição atual do cursor. Após inserir, todos os elementos à direita se deslocam uma posição, e o cursor deve acompanhar esse deslocamento movendo-se 1 unidade para a direita.
  • Inserir Palavra (I P): Atenção à regra do espaço! Se o cursor não estiver no começo do texto (posição 0), um caractere de espaço deve ser inserido imediatamente antes da palavra.
  • Apagar Palavra (X): Este é o comando mais desafiador. Vocês precisarão verificar se o cursor está atualmente posicionado sobre uma palavra válida (ou seja, se o caractere à direita é alfanumérico). Se sim, será necessário identificar onde essa palavra termina (encontrando o próximo espaço ou pontuação) e onde ela começa para removê-la por completo, tratando adequadamente o espaço que a antecede.

Por onde começar?

Cada comando haje de forma “independente” do outro, mas um bug em um comando pode fazer com que o próximo faça algo ainda mais estranho. Assim, code um comando por vez. Se você começar tentando fazer tudo de uma vez, vai dar errado!

  • Teste 1 só possui movimento de cursor e inserção de palavra. Antes de começar a pensar em como remover caracteres ou palavras, garanta que seu código está passando tranquilo nesse caso teste.

3. Problemas e Erros Comuns (O que evitar?)

Fiquem atentos a estes pontos, que costumam ser a maior fonte de bugs nos testes:

Erros de Índice Desatualizado (IndexError / Off-by-one)

Sempre que um caractere ou palavra é inserido ou removido, o tamanho total do texto muda. Se você guardou o tamanho do texto em uma variável fixa externa e esqueceu de atualizá-la, as operações seguintes de movimentação do cursor (D N) ou remoção podem tentar acessar índices que já não existem mais ou parar antes do final real.

Confusão entre a Posição do Cursor e os Elementos

O cursor fica entre os caracteres.

  • Se o cursor está na posição 3, o caractere “logo após” o cursor está no índice 3 da sua estrutura de dados. O caractere “anterior” ao cursor está no índice 2. Confundir essa relação resulta em apagar ou inserir elementos no lugar errado.

Falha ao Tratar os Limites de Movimentação

Se o cursor está na posição 2 e o comando pede para mover 5 posições para a esquerda (E 5), o cursor deve parar no 0 e não ir para -3. Índices negativos em algumas linguagens mudam o comportamento para o final da lista, o que quebrará completamente a lógica do editor.

Ignorar as Condições de Anulação do Comando X

O comando X (apagar palavra) possui várias exceções. Se o cursor estiver posicionado logo antes de um ponto final, de uma vírgula ou de um espaço, o comando não deve fazer absolutamente nada. Certifiquem-se de testar o caractere à direita do cursor antes de iniciar o procedimento de deleção.

Slices e intervalos de listas

Ao utilizar comandos como del lista[0:10], o python irá remover os elementos do índice 0 até o índice 9, ou seja, o elemento do índice 10 não será removido. Se você quiser remover o elemento do índice 10, é necessário usar del lista[0:11].


Bom trabalho no desenvolvimento do código! Testem cada comando isoladamente antes de juntar tudo no programa final e podem me mandar as dúvidas por email!