es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Realizando más de una tarea en un iter().map()

Me gustaría usar un mapa para crear un nuevo vector, pero al mismo tiempo hacer otras cosas dentro de ese mapa. Estoy trabajando en Advent of Code 2021, día 6 parte 1.

Este código recorre un vector y decrementa todos los valores en uno. Si el valor es 0, entonces restablece esa posición a 6 y agrega un 8 al final del vector.

fn run_simulación_crecimiento(mut state: Vec<u8>, days: i32) -> usize {
    for day in 0..days {
        let mut new_fish = 0;
        state.iter_mut().map(|x| match x {
            num if *num >= 1 && *num <= 8 => {*num - 1},
            0 => {new_fish += 1; 6},
            _ => unreachable!()
        })

    for _fish in 0..new_fish {
        state.push(8);
    }
}
state.iter().count() as usize
}

¿Cómo puedo devolver el elemento correcto desde el cierre?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para devolver el elemento correcto desde el cierre, debes modificar la función map() para recolectar los elementos del iterador en un nuevo vector que incluya los valores modificados. Luego puedes usar este nuevo vector para actualizar el vector original state.

    Esto se puede hacer usando la función collect() después de la función map(). Por ejemplo:

    state.iter_mut().map(|x| match x {
        num if *num >= 1 && *num <= 8 => num - 1,
        0 => { new_fish += 1; 6 },
        _ => unreachable!()
    }).collect::<><u8>>()
    

    Aquí, el cierre pasado a map() es el mismo que antes, devolviendo los valores modificados como un nuevo vector. La función collect() luego recolecta estos valores en un nuevo Vec<u8> que se puede usar para actualizar el vector state.

    Para actualizar state con los nuevos valores, simplemente asigna el resultado de las funciones map() y collect() a state, de la siguiente manera:

    state = state.iter_mut().map(/* closure */).collect();
    

    Esto reemplaza el vector state original con el nuevo que incluye los valores modificados.

Comments are closed.