История изменений
Исправление
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"