Crear un editor de texto de consola que permita agregar líneas, borrarlas y deshacer/rehacer operaciones usando pilas. Esta práctica ilustra cómo los editores mantienen bitácoras de cambios.
Comandos soportados:
ADD <texto>: agrega una línea al final.DEL: elimina la última línea.UNDO: revierte la última operación.REDO: reaplica la operación revertida.SHOW: imprime el documento.EXIT: cierra el editor.UNDO sobre un estado limpio no hace nada.REDO se limpia cuando llega un comando nuevo (distinto de REDO).strdup; recuerda liberar memoria en cada paso.class Editor:
def __init__(self):
self.lineas = []
self.undo = []
self.redo = []
def add(self, texto):
self.lineas.append(texto)
self.undo.append(("ADD", texto))
self.redo.clear()
def delete(self):
if not self.lineas:
return "Nada para borrar"
texto = self.lineas.pop()
self.undo.append(("DEL", texto))
self.redo.clear()
return texto
def mostrar(self):
print("----- Documento -----")
for i, linea in enumerate(self.lineas, 1):
print(f"{i}: {linea}")
def do_undo(self):
if not self.undo:
return "Nada que deshacer"
op, texto = self.undo.pop()
if op == "ADD":
borrado = self.lineas.pop() if self.lineas else None
self.redo.append(("ADD", texto))
return f"Deshecho ADD: {borrado}"
if op == "DEL":
self.lineas.append(texto)
self.redo.append(("DEL", texto))
return f"Deshecho DEL: {texto}"
def do_redo(self):
if not self.redo:
return "Nada que rehacer"
op, texto = self.redo.pop()
if op == "ADD":
self.lineas.append(texto)
elif op == "DEL" and self.lineas:
self.lineas.pop()
self.undo.append((op, texto))
return f"Rehecho {op}: {texto}"
if __name__ == "__main__":
ed = Editor()
ed.add("Linea 1")
ed.add("Linea 2")
ed.mostrar()
print(ed.delete())
print(ed.do_undo())
print(ed.do_redo())
ed.add("Linea 3")
ed.mostrar()
INSERT <posición> y REPLACE con su correspondiente historial.