Как изменить/ сократить код, чтобы при проверке он не превышал лимит по времени?

введите сюда описание изображения

from math import ceil
N = int(input())
m = ceil(N / 2)
lst = []
for i in range(N):
    lst.append([' '] * N)
x = 0
y = N - 1
k = 0
while y != m:
    if k % 2 == 0:
        while y > 0:
            lst[x][y] = '*'
            if y >= 2 and lst[x][y - 2] == '*':
                break
            y -= 1
        while x < N - 1:
            lst[x][y] = '*'
            if x < N - 2 and lst[x + 2][y] == '*': 
                break
            x += 1
    else:
        while y < N - 1:
            if y < N - 2 and lst[x][y + 2] == '*': 
                break
            lst[x][y] = '*'
            y += 1
        while x > 0:
            lst[x][y] = '*'
            if x >= 2 and lst[x - 2][y] == '*': 
                break
            x -= 1
    k += 1
for i in range(N): 
    print(*lst[i])

код рабочий , но при последнем тесте пишет, что превышает лимит по времени, что делать вообще в таких случаях? Просто первый раз такое

введите сюда описание изображения

ограничения по времени 1 секунда,а как можно видеть со скрина , программа выполняется в 1 секунду 92 милисекунды


Ответы (3 шт):

Автор решения: марат

Как я понял там не 1092 милисекунд, а бесконечность, они просто скинули бесконечный цикл. у меня получилось так:

from math import ceil
N = int(input())
m = ceil(N / 2)
lst = []
for i in range(N):
    lst.append([' '] * N)
x = 0
y = N - 1
k = 0
if N == 1:
    print('*')
else:
    while k < m:
        if k % 2 == 0:
            while y > 0:
                lst[x][y] = '*'
                if y >= 2 and lst[x][y - 2] == '*':
                    break
                y -= 1
            while x < N - 1:
                lst[x][y] = '*'
                if x < N - 2 and lst[x + 2][y] == '*':
                    break
                x += 1
        else:
            while y < N - 1:
                lst[x][y] = '*'
                if y < N - 2 and lst[x][y + 2] == '*':
                    break
                y += 1
            while x > 0:
                lst[x][y] = '*'
                if x >= 2 and lst[x - 2][y] == '*': 
                    break
                x -= 1
        k += 1
    for i in range(N): 
        print(*lst[i])
→ Ссылка
Автор решения: Zhihar

у вас медленный вывод, попробуйте сначала преобразовать вывод в строку и вывеcти, например так:

for line in lst:
    print(' '.join(line))

или так:

print('\n'.join(' '.join(line) for line in lst))
→ Ссылка
Автор решения: Mike

Не думаю, что так сильно быстрее, но так по крайней мере несколько лаконичнее:

N = int(input())
lst = []
for i in range(N):
    lst.append([' '] * N)
x = 0
y = -1
dxa = [0, 1, 0, -1]
dya = [1, 0, -1, 0]
for i in range(0, N-1):
    dx = dxa[ i % 4 ]
    dy = dya[ i % 4 ]
    for j in range(N - (i//2)*2 - 1):
        x += dx
        y += dy
        lst[y][x]='*'

print('* ' * N)
for i in range(N-1):
    print(*lst[i])
→ Ссылка