Se muestra un ejercicio para realizar una matriz espiral en Python, acomodando una cadena de ceros y unos.
Python es un lenguaje de programación muy utilizado, que utiliza una sintaxis sencilla. Vamos a crear a continuación una matriz espiral binaria, es decir que contiene una cadena de ceros y unos. Te invito a ver el siguiente video donde se explica toda la realización del programa.
Dado un número entero m, escriba un programa que lo convierta a combinación binaria y acomode cada uno de los bits de dicha combinación en una matriz de tamaño nxn.
El valor de n debe ser determinado en función del número de bits de la combinación binaria.
Los bits deben ser acomodados en espiral hacia el centro de la matriz, iniciando en la esquina superior izquierda, siguiendo hacia la derecha, luego hacia abajo, luego hacia la izquierda, luego hacia arriba y así sucesivamente.
Todas las localidades de la matriz deberán contener un dígito.
def binario(decimal): binario = '' while decimal // 2 != 0: binario = str(decimal % 2) + binario decimal = decimal // 2 return str(decimal) + binario
El algoritmo aquí utilizado se muestra en la siguiente imagen:
def imprimir(md): for x in md: for y in x: print (y, end="") print ()
Se utiliza print(y,end=””) para indicarle que ese print no genera salto de línea, para eso le pasamos como argumento end el valor de vacío.
# Recibir la entrada m = int(input()) # Convertir ese valor a binario binario = binario(m)
# Agregar ceros a la izquierda n = math.ceil(math.sqrt(len(binario))) cerosizquierda = n*n-len(binario) strceros = "0" * cerosizquierda cadena = strceros + binario
Aquí utilizamos ceil para redondear un dato decimal al valor entero superior, así un valor como 3.8 se redondeará a 4.
# Crear una matriz vacia de n x n md = [["*" for y in range(n)] for x in range(n)]
# Llenar la matriz con los bits de la cadena binaria x = 0 y = 0 i = 0 limizq= 0 limder= n-1 limsup= 0 liminf= n-1 dir = 'der' while (i<len(cadena)): # colocar el valor md[y][x] = cadena[i] i+=1 # reajustar el siguiente movimiento if dir=='der': limsup=y+1 if x==limder: dir = 'aba' if y<liminf: y+=1 else: x+=1 continue if dir=='aba': limder=x-1 if y==liminf: dir = 'izq' if x>limizq: x-=1 else: y+=1 continue if dir=='izq': liminf=y-1 if x==limizq: dir = 'arr' if y>limsup: y-=1 else: x-=1 continue if dir=='arr': limizq=x+1 if y==limsup: dir = 'der' if x<limder: x+=1 else: y-=1 continue imprimir(md)
Te invito a ver el video de explicación del código para una mejor comprensión de lo que estamos realizando aquí. O bien deja en un comentario tu duda.