Skip to content
Snippets Groups Projects
Select Git revision
  • 3a6eb5798c2a45201438d57e79e9e7197a539e46
  • master default
2 results

magic_4x4.py

Blame
  • magic_4x4.py 2.57 KiB
    from itertools import combinations, permutations, chain
    import sys, time
    
    try:
        inputs = input()
    except EOFError:
        pass
    
    #inputs = '1 2 3 4 5 6 7 8 9 10 10 11 13 14 14 15'
    if len(inputs.split()) != 16:
        print('Error', file=sys.stderr)
        exit()
    
    start_time = time.time()
    inputs = list(map(int, inputs.split()))
    ns = inputs
    
    
    def get_removed_list(l, removings):
        removed = l.copy()
        list(map(lambda x: removed.remove(x), removings))
        return removed
    
    magic_row_squares = []
    for partition1 in combinations(ns, 4):
        magic_sum = sum(partition1)
        remain_partition1 = get_removed_list(ns, partition1)
        for partition2 in combinations(remain_partition1, 4):
            if sum(partition2) != magic_sum: continue
            remain_partition2 = get_removed_list(remain_partition1, partition2)
            for partition3 in combinations(remain_partition2, 4):
                if sum(partition3) != magic_sum: continue
                remain_partition3 = get_removed_list(remain_partition2, partition3)
                for partition4 in combinations(remain_partition3, 4):
                    if sum(partition4) != magic_sum: continue
                    magic_row_squares.append([partition1, partition2, partition3, partition4])
                    
    c = 0
    magic_squares = []
    for magic_row_square in magic_row_squares:
        for row1 in permutations(magic_row_square[0]):
            magic_sum = sum(row1)
            for row2 in permutations(magic_row_square[1]):
                if not sum(row1[:2] + row2[:2]) == sum(row1[2:] + row2[2:]) == magic_sum: continue
                for row3 in permutations(magic_row_square[2]):
                    for row4 in permutations(magic_row_square[3]):
                        if not sum(row3[:2] + row4[:2]) == sum(row3[2:] + row4[2:]) == magic_sum: continue
                        
                        if not (row1[0] + row2[1] + row3[2] + row4[3] == magic_sum and \
                                row1[3] + row2[2] + row3[1] + row4[0] == magic_sum): continue
                        end = 0 
                        for i in range(len(magic_row_square)):
                            if row1[i] + row2[i] + row3[i] + row4[i] != magic_sum:
                                end = 1
                                break
                        if end:
                            continue
                        
                        magic_squares.append(row1 + row2 + row3 + row4)
                        c+=1
    
    for magic_square in magic_squares:
        print(' '.join(map(str, magic_square)), file=sys.stdout)
    elapsed_time = time.time() - start_time
    print(f'{len(magic_squares)} 개의 답이 있습니다. 계산시간은 총 {elapsed_time:.2f} 초 입니다. ', file=sys.stderr)