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()
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:
Con este cambio, la función evolve debería funcionar correctamente con el caso de prueba proporcionado.