Zipper

Zipper

Media

Instrucciones

Crear un zipper para un árbol binario.

Los zippers son una forma puramente funcional de navegar por 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 (en el que cada nodo contiene un valor y una lista de nodos hijos), un zipper podría admitir 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 que tiene el foco)
  • prev (mover el foco al hijo anterior del mismo padre, devuelve un zipper nuevo)
  • next (mover el foco al hijo siguiente del mismo padre, devuelve un zipper nuevo)
  • up (mover el foco al padre, devuelve un zipper nuevo)
  • set_value (establecer el valor del nodo que tiene el foco, devuelve un zipper nuevo)
  • insert_before (insertar un subárbol nuevo antes del nodo que tiene el foco, este pasa a ser el prev del nodo que tiene el foco, devuelve un zipper nuevo)
  • insert_after (insertar un subárbol nuevo después del nodo que tiene el foco, este pasa a ser el next del nodo que tiene el foco, devuelve un zipper nuevo)
  • delete (elimina el nodo que tiene el foco y todos los subárboles, el foco se mueve al nodo next si es posible; en caso contrario, al nodo prev si es posible; y, en caso contrario, al nodo padre; devuelve un zipper nuevo)

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 ha llamado a ningún método Set*), 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 cambian el foco a un Node no válido deben devolver un error.

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

¿Listo para empezar Zipper?

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