Re[4]: Кому-нибудь требуется начинающий питонист в подмастер
От: Lazytech Ниоткуда  
Дата: 04.05.19 11:29
Оценка:
Здравствуйте, aik, Вы писали:

aik>Захотелось вот мне погодную станцию слабать на коленке — микроконтроллер esp8266 с микропитоном и сенсор dht22 и вперед. Или вот задолбали скрипты bash — перенес свои рабочие скрипты на питон, красота. Неужели скрипты ни для чего нужны?


Только теперь до меня дошло, о чем идет речь! Скриптов, как мне кажется, будет недостаточно для набора опыта. Я еще несколько лет назад делал скриптики для планировщика nnCron на языке SP-Forth, а задолго до того — макросы для MS Excel, но программистом от этого не стал...

P.S. Поясню, что имею в виду, на примере кода (см. под катом).
  2 образца кода...
Код до переделки:
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        
        def isMagicSquare(r0, c0):
            row_sums, col_sums, diag_sums = [0, 0, 0], [0, 0, 0], [0, 0]
            uniques = set()

            for r in range(r0, r0+3):
                for c in range(c0, c0+3):
                    cell = grid[r][c]
                    if not (1 <= cell <= 9):
                        return False
                    else:
                        uniques.add(cell)
                        if len(uniques) < c - c0 + r - r0 + 1:
                            return False
                        else:                
                            row_sums[r-r0] += cell
                            col_sums[c-c0] += cell

                if r - r0 > 1 and row_sums[r-r0] != row_sums[r-r0-1]:
                    return False

                diag_sums[0] += grid[r][c0+r-r0]
                diag_sums[1] += grid[r][c0+r0+2-r]

            if len(uniques) < 9:
                return False
                
            for c in range(2):
                if col_sums[c] != col_sums[c+1]:
                    return False

            return diag_sums[0] == diag_sums[1] == row_sums[0] == col_sums[0]


        n, m = len(grid), len(grid[0])
        magic_squares = 0

        for r in range(n-2):
            for c in range(m-2):
                if isMagicSquare(r, c):
                    magic_squares += 1

        return magic_squares


Код после переделки:
class Solution:
    def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
        
        def isMagic(r0, c0):
            row_sums, col_sums, diag_sums = [0, 0, 0], [0, 0, 0], [0, 0]
            uniques = set()

            for r in range(r0, r0+3):
                c_last = c0 + 2           
                for c in range(c0, c0+3):
                    cell = grid[r][c]
                    uniques.add(cell)
                    row_sums[r-r0] += cell
                    col_sums[c-c0] += cell

                r_pos = r - r0
                if r_pos > 1 and row_sums[r_pos] != row_sums[r_pos-1]:
                    return False

                diag_sums[0] += grid[r][c0+r_pos]
                diag_sums[1] += grid[r][c_last-r_pos]

            if len(uniques) < 9:
                return False

            for c in range(2):
                if col_sums[c] != col_sums[c+1]:
                    return False

            return diag_sums[0] == diag_sums[1] == row_sums[0] == col_sums[0]


        n, m = len(grid), len(grid[0])
        magic_squares = 0
        bad_cells = {(r, c) for c in range(m) for r in range(n)
                     if not (1 <= grid[r][c] <= 9)}

        for r in range(n-2):
            for c in range(m-2):
                # based on research by lee215
                # https://leetcode.com/problems/magic-squares-in-grid/discuss/133874/Python-5-and-43816729
                # "The center of magic square must be 5."                
                if grid[r+1][c+1] == 5:            
                    r_end, c_end = r + 2, c + 2
                    all_good = True
                    for r1, c1 in bad_cells:
                        if r <= r1 <= r_end and c <= c1 <= c_end:
                            all_good = False
                            break

                    if all_good and isMagic(r, c):
                        magic_squares += 1

        return magic_squares

Если верить сайту, где я решал эту самую задачку, переделка кода сократила время его выполнения с 44 мс до 36 мс. Я ожидал большего, но хоть что-то...
Отредактировано 04.05.2019 11:42 Lazytech . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.