LINUX.ORG.RU

История изменений

Исправление Psych218, (текущая версия) :

у тебя очень много одинаковых проверок такого вида:

        if row.count(row[0]) == length and row[0] != ".":
            return row[0]

Выносим в функцию, получается (всё ещё не очень коротко, но уже становится виднее структура, куда двигаться дальше):

def who_win(s):
    if row[0] != '.' and row.strip(row[0]) == '':
        return row[0]

def checkio(result):
    length       = len(result)
    temp         = ""
    result_col   = []

    #check rows
    for row in result:
        won = who_win(row)
        if won:
            return won

    #check diagonal
    won = who_win(''.join(result[i][i] for i in range(length)))
    if won:
        return won

    #check diagonal reverse
    won = who_win(''.join(result[length - 1 - i][i]
                  for i in range(length - 1, -1, -1)))
    if won:
        return won

    #check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        result_col.append(temp)
        temp = ""

    for col in result_col:
        won = who_win(col)
        if won:
            return won

    #anyway, draw
    return "D"

Теперь внимательно смотрим на этот код. И становится понятно, что вместо кучи циклов с проверками можно сделать один, как-нибудь так:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)
    temp = ""

    # check rows
    to_check = result  # rows
    to_check.append(''.join(result[i][i] for i in range(length)))  # diagonal
    to_check.append(''.join(result[length - 1 - i][i]
                            for i in range(length - 1, -1, -1)))  # reverse diag
    # check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        to_check.append(temp)
        temp = ""

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"

Ну и дальше уже остаётся уже только по мелочи:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)

    # rows:
    to_check = result
    # diagonal:
    to_check.append(''.join(result[i][i] for i in range(length)))
    # reverse diagonal:
    to_check.append(''.join(result[i][-i-1] for i in range(length)))
    # collumns:
    to_check += [''.join(result[i][j] for i in range(length))
                         for j in range(length)]

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"

P. S. Это чисто куда можно двигаться от твоего готового кода, а не «идеальное» решение. Можно и с другой стороны зайти.

P. P. S. Да, в комментариях после решётки рекомендуется пробел всегда ставить (PEP8 рекомендует, и я здесь согласен, что так читаемее).

Исправление Psych218, :

у тебя очень много одинаковых проверок такого вида:

        if row.count(row[0]) == length and row[0] != ".":
            return row[0]

Выносим в функцию, получается (всё ещё не очень коротко, но уже становится виднее структура, куда двигаться дальше):

def who_win(s):
    if row[0] != '.' and row.strip(row[0]) == '':
        return row[0]

def checkio(result):
    length       = len(result)
    temp         = ""
    result_col   = []

    #check rows
    for row in result:
        won = who_win(row)
        if won:
            return won

    #check diagonal
    won = who_win(''.join(result[i][i] for i in range(length)))
    if won:
        return won

    #check diagonal reverse
    won = who_win(''.join(result[length - 1 - i][i]
                  for i in range(length - 1, -1, -1)))
    if won:
        return won

    #check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        result_col.append(temp)
        temp = ""

    for col in result_col:
        won = who_win(col)
        if won:
            return won

    #anyway, draw
    return "D"

Теперь внимательно смотрим на этот код. И становится понятно, что вместо кучи циклов с проверками можно сделать один, как-нибудь так:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)
    temp = ""

    # check rows
    to_check = result  # rows
    to_check.append(''.join(result[i][i] for i in range(length)))  # diagonal
    to_check.append(''.join(result[length - 1 - i][i]
                            for i in range(length - 1, -1, -1)))  # reverse diag
    # check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        to_check.append(temp)
        temp = ""

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"

Ну и дальше уже остаётся уже только по мелочи:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)

    # rows:
    to_check = result
    # diagonal:
    to_check.append(''.join(result[i][i] for i in range(length)))
    # reverse diagonal:
    to_check.append(''.join(result[i][-i-1] for i in range(length)))
    # collumns:
    to_check += [''.join(result[i][j] for i in range(length))
                         for j in range(length)]

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"

P. S. Это чисто куда можно двигаться от твоего готового кода, а не «идеальное» решение. Можно и с другой стороны зайти.

Исходная версия Psych218, :

у тебя очень много одинаковых проверок такого вида:

        if row.count(row[0]) == length and row[0] != ".":
            return row[0]

Выносим в функцию, получается (всё ещё не очень коротко, но уже становится виднее структура, куда двигаться дальше):

def who_win(s):
    if row[0] != '.' and row.strip(row[0]) == '':
        return row[0]

def checkio(result):
    length       = len(result)
    temp         = ""
    result_col   = []

    #check rows
    for row in result:
        won = who_win(row)
        if won:
            return won

    #check diagonal
    won = who_win(''.join(result[i][i] for i in range(length)))
    if won:
        return won

    #check diagonal reverse
    won = who_win(''.join(result[length - 1 - i][i]
                  for i in range(length - 1, -1, -1)))
    if won:
        return won

    #check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        result_col.append(temp)
        temp = ""

    for col in result_col:
        won = who_win(col)
        if won:
            return won

    #anyway, draw
    return "D"

Теперь внимательно смотрим на этот код. И становится понятно, что вместо кучи циклов с проверками можно сделать один, как-нибудь так:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)
    temp = ""

    # check rows
    to_check = result  # rows
    to_check.append(''.join(result[i][i] for i in range(length)))  # diagonal
    to_check.append(''.join(result[length - 1 - i][i]
                            for i in range(length - 1, -1, -1)))  # reverse diag
    # check columns
    for i in range(length):
        for j in range(length):
            temp += (result[j][i])
        to_check.append(temp)
        temp = ""

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"

Ну и дальше уже остаётся уже только по мелочи:

def who_win(s):
    if s[0] != '.' and s.strip(s[0]) == '':
        return s[0]

def checkio(result):
    length = len(result)

    # rows:
    to_check = result
    # diagonal:
    to_check.append(''.join(result[i][i] for i in range(length)))
    # reverse diagonal:
    to_check.append(''.join(result[i][-i-1] for i in range(length)))
    # collumns:
    to_check += [''.join(result[i][j] for i in range(length))
                         for j in range(length)]

    for res in to_check:
        won = who_win(res)
        if won:
            return won

    # anyway, draw
    return "D"