Rutas
/
Cairo
Cairo
/
Ejercicios
/
Cadena cronológica de los Reinos del Tiempo
Cadena cronológica de los Reinos del Tiempo

Cadena cronológica de los Reinos del Tiempo

Ejercicio de aprendizaje

Introducción

Los punteros inteligentes en Cairo son estructuras de datos avanzadas que garantizan una gestión de memoria segura y eficiente al añadir características de seguridad a los punteros normales, evitando problemas comunes como desreferenciar punteros nulos o acceder a memoria no inicializada.

¿Qué es un puntero inteligente?

Un puntero inteligente se comporta como un puntero normal, pero hace un seguimiento de la propiedad y garantiza un acceso seguro a la memoria, lo que evita problemas como la desreferenciación de punteros nulos o colgantes.

Tipos de punteros inteligentes

Cairo proporciona varios tipos de punteros inteligentes, como Box<T> y Nullable<T>:

  • Box<T>: almacena datos en un segmento de memoria especial, ideal para datos grandes o de tamaño dinámico. Permite transferir la propiedad sin copiar los datos.
  • Nullable<T>: apunta a un valor válido de tipo T o a null, lo que resulta útil para gestionar valores opcionales.

Seguridad de la memoria

Los punteros inteligentes ayudan a prevenir accesos inseguros a la memoria y garantizan que esta se libere automáticamente cuando ya no se necesita, lo que reduce el riesgo de fugas de memoria.

Ejemplo: uso de Box<T> para tipos recursivos

Los punteros inteligentes como Box<T> permiten manejar tipos recursivos de forma segura, como en un árbol binario, asignando memoria de forma eficiente y evitando la recursión infinita.

use core::box::{BoxTrait};

#[derive(Copy, Drop)]
enum BinaryTree {
    Leaf: u32,
    Node: (u32, Box<BinaryTree>, Box<BinaryTree>),
}

fn main() {
    let leaf1 = BinaryTree::Leaf(1);
    let leaf2 = BinaryTree::Leaf(2);
    let node = BinaryTree::Node((3, BoxTrait::new(leaf1), BoxTrait::new(leaf2)));
    println!("{:?}", node);
}

Beneficios de rendimiento

Los punteros inteligentes mejoran el rendimiento al pasar referencias a los datos en lugar de copiar estructuras grandes, lo que reduce la sobrecarga de memoria.

// `Cart` is a large struct that contains a lot of information
fn pass_pointer(cart: Box<Cart>) {
    let cart = cart.unbox();
    println!("{} is shopping today and bought {} items", cart.buyer, cart.items);
}

Instrucciones

En Chrono Realms, los Guardianes del Tiempo a menudo tratan no solo con árboles de líneas temporales, sino también con Cadenas Crono: secuencias de Nodos Temporales enlazados, cada uno representando un momento específico en el tiempo. Una Cadena Crono es un camino recto de momentos secuenciales, donde cada Nodo Temporal se conecta al siguiente. Estas Cadenas Crono son útiles al viajar a través de una serie de eventos específicos, ya que permiten a los Guardianes del Tiempo seguir una única línea temporal.

Sin embargo, para manejar estas Cadenas Crono potencialmente largas, los Guardianes del Tiempo usan punteros inteligentes (Box<t>)</t> para gestionar y recorrer de forma segura estas listas de momentos sin causar duplicación o desbordamiento de memoria innecesarios. Cada Nodo Temporal contiene una referencia al siguiente nodo, formando una estructura recursiva.

Tu tarea como aprendiz es implementar una Cadena Crono como una estructura de lista recursiva usando punteros inteligentes.

En este ejercicio, harás lo siguiente:

  1. Crear un enum recursivo ChronoChain, que represente una lista de momentos.
  2. Usar el puntero inteligente Box<T> para almacenar los nodos recursivos.
  3. Implementar una función para crear un ChronoChain a partir de un array de valores u32.
  4. Implementar una función para recorrer el ChronoChain y sumar los valores almacenados en la lista.

1. Define el enum ChronoChain recursivo

Crea un enum recursivo ChronoChain con dos variantes:

  • End: Representa el final de la lista.
  • Link: Contiene un valor u32 y una referencia empaquetada al siguiente nodo de la cadena.

2. Crea una función para construir una Cadena Crono

Escribe una función ChronoChain::build que tome un array de valores u32 y devuelva un ChronoChain, enlazando los valores secuencialmente mediante punteros inteligentes.

3. Implementa la función de suma

Escribe una función ChronoChain::sum para recorrer recursivamente el ChronoChain y sumar los valores de todos los nodos.

Ejemplo de uso

fn main() {
    // Create a ChronoChain from an array of values
    let chrono_chain = ChronoChain::build(array![10, 20, 30]);

    // Sum the values in the ChronoChain
    let total_sum = chrono_chain.sum();

    println!("Total Time Power: {}", total_sum);
}
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Cairo Exercism

¿Listo para empezar Cadena cronológica de los Reinos del Tiempo?

Regístrate en Exercism para aprender y dominar Cairo con 25 conceptos68 ejercicios y mentoría humana real, todo gratis.