Skip to content

Instantly share code, notes, and snippets.

@eduardoklosowski
Created August 30, 2018 14:25
Show Gist options
  • Save eduardoklosowski/1f4d488ae4cd2d9d979e3a623dd85e4d to your computer and use it in GitHub Desktop.
Save eduardoklosowski/1f4d488ae4cd2d9d979e3a623dd85e4d to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
'''
http://dojopuzzles.com/problemas/exibe/matriz-espiral/
'''
from enum import Enum
from math import log10
from os import linesep
class Direcao(Enum):
DIREITA = 1
BAIXO = 2
ESQUERDA = 3
CIMA = 4
class MatrizEspiral:
def __init__(self, a: int, b: int):
x = y = 0
intervalo_x = [0, a - 1]
intervalo_y = [0, b - 1]
direcao = Direcao.DIREITA
self._matriz = [[0 for c in range(a)] for l in range(b)]
for i in range(1, a * b + 1):
self._matriz[y][x] = i
if direcao is Direcao.DIREITA:
if intervalo_x[0] <= x + 1 <= intervalo_x[1]:
x += 1
else:
y += 1
direcao = Direcao.BAIXO
intervalo_y[0] += 1
elif direcao is Direcao.BAIXO:
if intervalo_y[0] <= y + 1 <= intervalo_y[1]:
y += 1
else:
x -= 1
direcao = Direcao.ESQUERDA
intervalo_x[1] -= 1
elif direcao is Direcao.ESQUERDA:
if intervalo_x[0] <= x - 1 <= intervalo_x[1]:
x -= 1
else:
y -= 1
direcao = Direcao.CIMA
intervalo_y[1] -= 1
elif direcao is Direcao.CIMA:
if intervalo_y[0] <= y - 1 <= intervalo_y[1]:
y -= 1
else:
x += 1
direcao = Direcao.DIREITA
intervalo_x[0] += 1
def __str__(self):
b = len(self._matriz)
a = len(self._matriz[0])
digitos = int(log10(a * b)) + 1
formato = '%%%dd' % digitos
return linesep.join(
' '.join(formato % c for c in l)
for l in self._matriz
)
if __name__ == '__main__':
print(MatrizEspiral(3, 4))
print()
print(MatrizEspiral(5, 6))
print()
print(MatrizEspiral(5, 20))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment