mathema
mathema

Reputation: 988

Magic Square in Python Debugging

Problem originally is in this link. I wrote a Python code but I got 64 points (total points is 100) and this indicates that my code has some missing points. I passed 11 of 16 test cases but 5 test cases have problematic for me. Could you say where my code has some missing points and how can I fix it?

import math

m = int(raw_input())
liste = []
y_liste = []
md = 0
ad = 0
sum = 0
sum2 = 0

for k in range(m):
    temp = str(raw_input())
    liste.append(temp)
    liste[k] = liste[k].split(" ")
    liste[k] = [int(i) for i in liste[k]]

for k in range(m):
    md += liste[k][k]
    ad += liste[k][m-k-1]



if md == ad:
    print 0
else:
    for k in range(m):
        for l in range(m):
            sum2 += liste[l][k]
            sum += liste[k][l]
        if sum2 != md and -(k+1) is not y_liste:
            y_liste.append(-(k+1))
        if sum != md and (k+1) is not y_liste:
            y_liste.append(k+1)
        sum2 = 0
        sum = 0

    if md != ad:
        y_liste.append(0)
    print len(y_liste)
    y_liste.sort()
    for i in y_liste:
        print i

Problem Statement

Magic Square

Johnny designed a magic square (square of numbers with the same sum for all rows, columns and diagonals i.e. both the main diagonal - meaning the diagonal that leads from the top-left corner towards bottom-right corner - and the antidiagonal - meaning the diagonal that leads from top-right corner towards bottom-left corner). Write a program to test it.

Task
Write a program that will check if the given square is magic (i.e. has the same sum for all rows, columns and diagonals).

Input
First line: N , the size of the square (1 <= N <= 600). Next N lines: The square, N space separated integers pre line, representing the entries per each row of the square.

Output
First line: M , the number of lines that do not sum up to the sum of the main diagonal (i.e. the one that contains the first element of the square). If the Square is magic, the program should output 0. Next M lines: A sorted (in incremental order ) list of the lines that do not sum up to the sum of the main diagonal. The rows are numbered 1,2,…,N; the columns are numbered -1,-2,…,-N; and the antidiagonal is numbered zero.

Note: There is a newline character at the end of the last line of the output.
Sample Input 1
3
8 1 6
3 5 7
4 9 2

Sample Output 1
0

Sample Input 2
4
16 3 2 13
5 10 11 8
6 9 7 12
4 15 14 1

Sample Output 2
3
-2
-1
0

Explanation of Sample Output 2
The input square looks as follows: https://i.sstatic.net/JyMgc.png (Sorry for link but I cannot add image due to reputation)

The square has 4 rows (labeled from 1 to 4 in orange) and 4 columns (labeled from -1 to -4 in green) as depicted in the image above. The main diagonal and antidiagonal of the square are highlighted in red and blue respectively.

The main diagonal has sum = 16 + 10 + 7 +1 = 34.
The antidiagonal has sum = 13 + 11 + 9 + 4 = 37. This is different to the sum of the main diagonal so value 0 corresponding to the antidiagonal should be reported.
Row 1 has sum = 16 + 3 + 2 + 13 = 34.
Row 2 has sum = 5 + 10 + 11 + 8 = 34.
Row 3 has sum = 6 + 9 + 7 + 12 = 34.
Row 4 has sum = 4 + 15 + 14 + 1 = 34.
Column -1 has sum = 16 + 5 + 6 + 4 = 31. This is different to the sum of the main diagonal so value -1 should be reported.
Column -2 has sum = 3 + 10 + 9 + 15 = 37. This is different to the sum of the main diagonal so value -2 should be reported.
Column -3 has sum = 2 + 11 + 7 + 14 = 34.
Column -4 has sum = 13 + 8 + 12 + 1 = 34.
Based on the above, there are 3 lines that do not sum up to the sum of the elements of the main diagonal. Since they should be sorted in incremental order, the output should be:
3
-2
-1
0

Upvotes: 2

Views: 1657

Answers (1)

cdlane
cdlane

Reputation: 41872

Your explanation doesn't discuss this clause which is a potential source of error:

if md == ad:
    print 0
else:

It says that if the main diagonal and antidiagonal add up to the same value, print just a 0 (no bad lines) indicating the magic square is valid (distinct from reporting a 0 in the list of bad lines). Consider this valid magic square:

 9  6  3 16
 4 15 10  5
14  1  8 11
 7 12 13  2

If I swap 13 and 11, the diagonals still equal each other but the square is invalid. So the above code doesn't appear to be correct. In the else clause for the above if statement, you test:

if md != ad:
    y_liste.append(0)

a fact you already know to be true from the previous/outer test so your code seems to be out of agreement with itself.

Upvotes: 0

Related Questions