2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-26 06:48:04 +02:00
LaTeX-examples/presentations/Programmieren-Tutorium/Tutorium-04/euler28.py
2015-11-20 23:12:22 +01:00

60 lines
1.5 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
def print_arr(a):
for line in a:
print(line)
def initialise(n):
array = [[0 for j in xrange(0, n)] for i in xrange(0, n)]
return array
def spiral_fill(a):
n = len(a)
x = y = n/2
number = 1
# r u l o
order = [(1, 0), (0, 1), (-1, 0), (0, -1)]
i_order = 0
length = 1
a[y][x] = number
while not (x == (n-1) and y == 0):
for j in xrange(0, length):
xAdd, yAdd = order[i_order]
x += xAdd
y += yAdd
number += 1
a[y][x] = number
if x == (n-1) and y == 0:
break
if i_order == 1 or i_order == 3:
length += 1
i_order = (i_order+1) % 4
return a
def diagonal_sum(a):
n = len(a)
sum = -1 # you will have the element in the middle (1) twice
for i in xrange(0, n):
sum += a[i][i]
sum += a[n-i-1][i]
return sum
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description="ProjectEuler: 28")
parser.add_argument("-n", metavar='N', type=int,
help="length of the spiral", required=True)
parser.add_argument("-d", action="store_true", default=False,
help="display the spiral")
args = parser.parse_args()
array = initialise(args.n)
array = spiral_fill(array)
if args.d:
print_arr(array)
print diagonal_sum(array)