Zipper

Zipper

Intermedia

Instrucciones

Crear un zipper para un árbol binario.

Los zippers son una forma puramente funcional de navegar dentro de una estructura de datos y manipularla. Esencialmente contienen una estructura de datos y un puntero dentro de esa estructura de datos (llamado el foco).

Por ejemplo, dado un árbol rosa (donde cada nodo contiene un valor y una lista de nodos hijos), un zipper podría soportar estas operaciones:

  • from_tree (obtener un zipper a partir de un árbol rosa, el foco está en el nodo raíz)
  • to_tree (obtener el árbol rosa a partir del zipper)
  • value (obtener el valor del nodo del foco)
  • prev (mover el foco al hijo anterior del mismo padre, devuelve un nuevo zipper)
  • next (mover el foco al siguiente hijo del mismo padre, devuelve un nuevo zipper)
  • up (mover el foco al nodo padre, devuelve un nuevo zipper)
  • set_value (asignar el valor del nodo del foco, devuelve un nuevo zipper)
  • insert_before (insertar un nuevo subárbol antes del nodo del foco, se convierte en el prev del nodo del foco, devuelve un nuevo zipper)
  • insert_after (insertar un nuevo subárbol después del nodo del foco, se convierte en el next del nodo del foco, devuelve un nuevo zipper)
  • delete (elimina el nodo del foco y todos los subárboles, el foco se mueve al nodo next si es posible, de lo contrario al nodo prev si es posible, de lo contrario al nodo padre, devuelve un nuevo zipper)

Comportamiento del Zipper

El Zipper proporciona una forma funcional de navegar por un árbol de Node.

Todas las llamadas al Zipper deben devolver un objeto Zipper nuevo. Si el Zipper no cambia valores (es decir, no se llamó a ningún método Set*), el Zipper debe usar el mismo árbol subyacente. Cuando se llama a un método Set*, el nuevo Zipper debe tener un árbol nuevo, dejando el árbol original sin cambios.

Las llamadas al Zipper que cambien el foco a un Node inválido deben devolver un error.

Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Go Exercism

¿Todo listo para empezar Zipper?

Regístrate en Exercism para aprender y dominar Go con 35 conceptos167 ejercicios y mentoría humana real, todo gratis.