2016-11-09 3 views
0

을 가져 오지 않고 마법의 사각형을 형성 이미 아래에있는 프로그램의 한 부분을 썼다 경우 부울 true를 반환하는 함수를 작성 :행렬 NumPy와

def matrix_is_square(matrix): 
    for i in range(len(matrix)): 
     if len(matrix[i]) != len(matrix): 
     return False 
    return True 

행렬은 정방 행렬 인 경우이 기능은 True를 반환, 그렇지 않으면 False를 반환합니다.

그러나 문제는 여기에 있습니다.

나는 함수가 Magic square인지 결정하는 두 번째 함수를 작성해야합니다.

정방 행렬은 다음 조건이 충족되는 경우 마방진 형성 : 행렬의

  1. 요소 숫자 1,2,3됩니다, ..., N 2
  2. def magic(matrix): 
        if(not(is_square(matrix))): 
         return False 
        # The remaining code 
    
    012 : 각 열 및 두 대각선의 각 행 내의 요소들의

코드가 처음 시작 값과 동일

이것은 내가 시도한 것입니다.

square = [] 
for i in range(len(matrix)): 
    square.append([]) 
    for j in range(len(matrix)): 
     square[i].append(0) 

total = 0 
x = len(matrix) 
for i in range(x): 
    total += square[i][i] 
    if total != x*(x*x+1)/2: 
      return False 
    else: 
     return True 

total = 0; 
for i in range(x): 
    total += square[i][x-1-i] 
    if total != x*(x*x+1)/2: 
      return False 
    else: 
     return True 

내 코드에 몇 가지 오류가있는 것 같습니다. 중요한 것은 숫자가 정확하게 부동 소수점으로 표시 될 수 없기 때문에 숫자의 정확한 평등을 테스트한다는 것입니다. 그러나이를 수행 할 다른 방법을 찾을 수는 없습니다. 모든 힌트를 부탁드립니다.

다음은이 기능이 예상 한 결과이며 동일한 페이지에 있습니다.

진정한

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

거짓

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

없음 수입 NumPy와.

+1

프로그램이 무엇을 설명하고 당신이 그것을 할 수 있다고 생각 어디하세요 잘못되어가는. 또한 코드를보다 일관된 형식으로 게시하여 문제를 쉽게 재현 할 수 있도록하십시오.이것은 이미 읽었어야하는 소개 투어에 포함되어 있습니다. – Prune

+0

합계에 수식을 사용하지 마십시오. 첫 번째 행의 정수 합을 기억하고이를 비교로 사용하십시오. – chepner

+3

@ cricket_007, 정의를보십시오 : 정수 1-N을 사용해야합니다. – Prune

답변

0

sum, range, any 기능과 set 개체를 사용하여 복잡한 솔루션 :

def magic(m): 
    length = len(m) 
    first_sum = set() 
    if length <= 2 \ 
      or any(len(row) != length for row in m) \ 
      or any(i > (length * length) for row in m for i in row): 
     return False 

    for r in m: 
     s = sum(r) 
     if len(first_sum) == 0: 
      first_sum.add(sum(r)) 
     if s not in first_sum: 
      return False 

    for i in range(length): 
     s = sum([r[i] for r in m]) 
     if s not in first_sum: 
      return False 

    if sum(m[i][i] for i in range(length)) not in first_sum \ 
     or sum(m[i][i] for i in range(length - 1, -1, -1)) not in first_sum: 
     return False 

    return True 

m = [[2,7,6],[9,5,1],[4,3,8]] 
print(magic(m)) 

m = [[16,3,2,13], [5,10,11,8],[9,6,7,12], [4,15,14,1]] 
print(magic(m)) 

m = [[1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16]] 
print(magic(m)) 

m = [[1,1],[1,1]] 
print(magic(m)) 

m = [[1,1],[1,1],[1,2]] 
print(magic(m)) 

출력 (순차적으로) :

True 
True 
False 
False 
False