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.

Ruby de dos dimensiones a un array de una dimensión

Tengo el siguiente array:

arr = [
“Assignment:Chapter 1 Code Exercises (Real)”,
[100, 100, 100, 100, 100, 100, 100, 100],
“Assignment:Chapter 2 Code Exercises (Real)”,
[93, 75, 100, 100, 100, 55, 75, 100],
“Assignment:Chapter 3 Code Exercises (Real)”,
[100, 80, 100, 100, 90, 85, 65, 100],
“Assignment:Chapter 4 Code Exercises (Real)”,
[100, 90, 100, 100, 95, 100, 75, 70],
“Assignment:Chapter 5 Code Exercises (Real)”,
[50, 100, 100, 100, 60, 70, 90, 100],
“Assignment:Chapter 6 Code Exercises (Real)”,
[0, 85, 100, 100, 60, 85, 70, 85, 100],
“Assignment:Chapter 14 Code Exercises (Real)”,
[75, 90, 100, 100, 0, 100, 0, 100],
“Assignment:Chapter 15 Code Exercises (Real)”,
[97, 100, 100, 100, 0, 100, 0, 100]
]

Me gustaría convertir esto a:

[
[“Assignment:Chapter 1 Code Exercises (Real)”, 100, 100, 100, 100, 100, 100, 100, 100],
[“Assignment:Chapter 2 Code Exercises (Real)”, 93, 75, 100, 100, 100, 55, 75, 100],
[“Assignment:Chapter 3 Code Exercises (Real)”, 100, 80, 100, 100, 90, 85, 65, 100],
[“Assignment:Chapter 4 Code Exercises (Real)”, 100, 90, 100, 100, 95, 100, 75, 70],
[“Assignment:Chapter 5 Code Exercises (Real)”, 50, 100, 100, 100, 60, 70, 90, 100],
[“Assignment:Chapter 6 Code Exercises (Real)”, 0, 85, 100, 100, 60, 85, 70, 85, 100],
[“Assignment:Chapter 14 Code Exercises (Real)”, 75, 90, 100, 100, 0, 100, 0, 100],
[“Assignment:Chapter 15 Code Exercises (Real)”, 97, 100, 100, 100, 0, 100, 0, 100]
]

“flatten” también puede ser traducido como “aplanar”. También intenté “flatten(1)”.

Tags:  

Answer

  1. Avatar for davy.ai

    Para convertir el array dado al formato deseado, necesitamos iterar sobre el array y agrupar los elementos que pertenecen a la misma tarea.

    Aquí hay una forma de hacerlo:

    new_arr = []
    temp = []
    arr.each do |elem|
      if elem.is_a?(String)
        # si el elemento actual es el nombre de una tarea, agregamos el grupo anterior al nuevo array y comenzamos un nuevo grupo
        new_arr << temp unless temp.empty?
        temp = [elem]
      else
        temp.concat(elem)
      end
    end
    # agregamos el último grupo al nuevo array
    new_arr << temp 
    
    # mostramos el nuevo array
    p new_arr
    

    Resultado:

    [
     ["Assignment:Chapter 1 Code Exercises (Real)", 100, 100, 100, 100, 100, 100, 100, 100],
     ["Assignment:Chapter 2 Code Exercises (Real)", 93, 75, 100, 100, 100, 55, 75, 100],
     ["Assignment:Chapter 3 Code Exercises (Real)", 100, 80, 100, 100, 90, 85, 65, 100],
     ["Assignment:Chapter 4 Code Exercises (Real)", 100, 90, 100, 100, 95, 100, 75, 70],
     ["Assignment:Chapter 5 Code Exercises (Real)", 50, 100, 100, 100, 60, 70, 90, 100],
     ["Assignment:Chapter 6 Code Exercises (Real)", 0, 85, 100, 100, 60, 85, 70, 85, 100],
     ["Assignment:Chapter 14 Code Exercises (Real)", 75, 90, 100, 100, 0, 100, 0, 100],
     ["Assignment:Chapter 15 Code Exercises (Real)", 97, 100, 100, 100, 0, 100, 0, 100]
    ]
    

    Explicación:

    • Comenzamos creando un array vacío new_arr donde guardaremos el array modificado.
    • También creamos un array vacío temp para almacenar los elementos de la tarea actual.
    • Iteramos sobre el array original arr, y para cada elemento:
      • Si es un string, asumimos que es el nombre de una nueva tarea. En ese caso, agregamos el temp anterior a new_arr (si no está vacío), y comenzamos un nuevo temp con solo el string actual.
      • Si es un array, asumimos que es una lista de puntajes para la tarea actual. En ese caso, lo concatenamos al temp actual.
    • Después del bucle, todavía necesitamos agregar el último temp a new_arr.

    Nota: esta solución asume que el array dado está ordenado de manera que las tareas y sus puntajes aparezcan en el orden correcto.

Comments are closed.