ListComprehension - MagicSquare
Verfasst: Mittwoch 11. Oktober 2017, 20:43
Hallo,
ich bin neu in Python, habe aber in anderen Sprachen sehr gute Kenntnisse. Seit ein paar Wochen interessiere ich mich sehr für Python. Vieles ist neu...
Ich hab jetzt mal so als Erstes ne Klasse geschrieben, die ein 'magisches Quadrat' erstellt. Zur Erläuterung: ein magisches Quadrat mit Seitenlänge n enthält alle Zahlen von 1 bis n² wobei die Zahlen in dem Quadrat so angeornet sind, dass die Summe aller Zeilen, Spalten und der beiden Diagonalen stets gleich sind. Für Quadrate mit ungerader Seitenlänge gibt es eine Vorschrift, die ich jetzt aber nicht näher erläutern möchte.
Ich bin sehr faszinier von der 'ListComprehension'. Ich kann das Quadrat momentan nur mit Hilfe von einer Schleife befüllen (siehe Quelltext).
Kann mir einer von Euch (bzw. geht es überhaupt) diese Vorschrift als ListComprehension anbieten?
Liebe Grüße und das ist mein erster Beitrag (Jungfernfahrt... ich hoffe ich mach mich nicht zum Deppen )
Alex
class magic(object):
'''
magic(size) constructs a 2-dimensional matrix[0..size-1][0..size-1]
in which all numbers from 1 to size**2 contains, so that
the sum of the numbers in each row, column
and both diagonales are equal.
magic() does the same with a default value: size = 5.
get() returns the matrix as a list.
set(size) changes the size of the matrix and recalculate the matrix.
size() returns the amount of rows / columns of the matrix.
sum() returns the sum of each row, column and diagonale.
print() prints out the square
'''
def __init__(self, size = 5):
self.__size = size
if self.__size <= 0:
raise ValueError
if not self.__size % 2:
raise ValueError
self.__matrix = [[None for x in range(self.__size)] for y in range(self.__size)]
for x1 in range(self.__size):
x2 = (self.__size // 2 + x1) % self.__size
y2 = (x2 + 1) % self.__size
for y1 in range(self.__size):
self.__matrix[x2][y2] = x1 * self.__size + y1 + 1
x2 = (x2 - 1) % self.__size
y2 = (y2 + 1) % self.__size
def get(self):
return self.__matrix
def set(self, size):
self.__init__(size)
def size(self):
return self.__size
def sum(self):
return (self.__size ** 3 + self.__size) // 2
def print(self):
d = str(len(str(self.__size ** 2))+1)
format_string = '%' + d + 'd'
for row in range(self.__size):
for col in range(self.__size):
print(format_string % self.__matrix[row][col], end = '')
print()
ich bin neu in Python, habe aber in anderen Sprachen sehr gute Kenntnisse. Seit ein paar Wochen interessiere ich mich sehr für Python. Vieles ist neu...
Ich hab jetzt mal so als Erstes ne Klasse geschrieben, die ein 'magisches Quadrat' erstellt. Zur Erläuterung: ein magisches Quadrat mit Seitenlänge n enthält alle Zahlen von 1 bis n² wobei die Zahlen in dem Quadrat so angeornet sind, dass die Summe aller Zeilen, Spalten und der beiden Diagonalen stets gleich sind. Für Quadrate mit ungerader Seitenlänge gibt es eine Vorschrift, die ich jetzt aber nicht näher erläutern möchte.
Ich bin sehr faszinier von der 'ListComprehension'. Ich kann das Quadrat momentan nur mit Hilfe von einer Schleife befüllen (siehe Quelltext).
Kann mir einer von Euch (bzw. geht es überhaupt) diese Vorschrift als ListComprehension anbieten?
Liebe Grüße und das ist mein erster Beitrag (Jungfernfahrt... ich hoffe ich mach mich nicht zum Deppen )
Alex
class magic(object):
'''
magic(size) constructs a 2-dimensional matrix[0..size-1][0..size-1]
in which all numbers from 1 to size**2 contains, so that
the sum of the numbers in each row, column
and both diagonales are equal.
magic() does the same with a default value: size = 5.
get() returns the matrix as a list.
set(size) changes the size of the matrix and recalculate the matrix.
size() returns the amount of rows / columns of the matrix.
sum() returns the sum of each row, column and diagonale.
print() prints out the square
'''
def __init__(self, size = 5):
self.__size = size
if self.__size <= 0:
raise ValueError
if not self.__size % 2:
raise ValueError
self.__matrix = [[None for x in range(self.__size)] for y in range(self.__size)]
for x1 in range(self.__size):
x2 = (self.__size // 2 + x1) % self.__size
y2 = (x2 + 1) % self.__size
for y1 in range(self.__size):
self.__matrix[x2][y2] = x1 * self.__size + y1 + 1
x2 = (x2 - 1) % self.__size
y2 = (y2 + 1) % self.__size
def get(self):
return self.__matrix
def set(self, size):
self.__init__(size)
def size(self):
return self.__size
def sum(self):
return (self.__size ** 3 + self.__size) // 2
def print(self):
d = str(len(str(self.__size ** 2))+1)
format_string = '%' + d + 'd'
for row in range(self.__size):
for col in range(self.__size):
print(format_string % self.__matrix[row][col], end = '')
print()