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.

Python: Problema de la implementación de funciones en el Juego de la Vida

He visto muchas formas diferentes de aplicar las reglas del “juego de la vida” en Python. Soy nuevo y estoy tratando de usar numpy y funciones, como se muestra a continuación.

Probé la función “cal_live” por sí misma con elementos individuales en el arreglo y la suma se calcula correctamente. Sin embargo, no da la salida correcta cuando se implementa con la función “evolve”. ¿Alguien puede ayudarme?

Nota: probé con esta lista y falla.
testcase2 = [[0, 0, 0, 0, 0],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[0, 0, 1, 0, 0],[0, 0, 0, 0, 0],]

def cal_live(r, c, arr):
    """
    Calcula el número de vecinos vivos.

    Parámetros:
    r -- índice de fila del elemento
    c -- índice de columna del elemento
    """
    count = 0

    for i in range(max(0,r - 1), min(arr.shape[0]-1, r + 2)):
        for j in range(max(0, c - 1), min(arr.shape[1]-1, c + 2)):
            count += arr[i][j]

    return count - arr[r][c]

def evolve(initial_state):
    # Caso en vivo
    arr = np.array(initial_state)

    for idx, x in np.ndenumerate(arr):
        row, col = idx
        live_neighbor_count = cal_live(row, col, arr)

        if live_neighbor_count == 3:
            arr[idx] = 1
        elif live_neighbor_count == 2 and x == 1:
            arr[idx] = 1
        else:
            arr[idx] = 0

    return arr.tolist()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema radica en la indexación de los elementos del arreglo. Cuando se asignan los valores actualizados al arreglo en la función evolve, estás utilizando el índice idx como una tupla, lo cual crea una vista del arreglo original. Sin embargo, esta vista solo puede ser actualizada si el tamaño y la forma del valor actualizado coinciden con el elemento original. Por lo tanto, si idx es una tupla de longitud 2, el valor actualizado también debe ser un escalar.

    Para solucionar este problema, puedes utilizar la notación de indexación de numpy para actualizar directamente el elemento en el arreglo. En lugar de asignar a arr[idx], utiliza arr[fila, columna]. Esto actualizará el elemento en la posición (fila, columna) con el nuevo valor.

    Aquí está la función evolve actualizada con la corrección de la indexación:

    def evolve(initial_state):
        # Caso vivo
        arr = np.array(initial_state)
    
        for fila in range(arr.shape[0]):
            for columna in range(arr.shape[1]):
                cantidad_vecinos_vivos = cal_live(fila, columna, arr)
    
                if cantidad_vecinos_vivos == 3:
                    arr[fila, columna] = 1
                elif cantidad_vecinos_vivos == 2 and arr[fila, columna] == 1:
                    arr[fila, columna] = 1
                else:
                    arr[fila, columna] = 0
    
        return arr.tolist()
    

    Con este cambio, la función evolve debería funcionar correctamente con el caso de prueba proporcionado.

Comments are closed.