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

Рейтинг: 1Ответов: 1Опубликовано: 22.01.2023

Решил задачу на stepik, вводил данные - всё работает, ввожу в меню с ответом и пишет

Failed test #7 of 16. Wrong answer

Напишите программу, на вход которой подаётся список чисел одной строкой. Программа должна для каждого элемента этого списка вывести сумму двух его соседей. Для элементов списка, являющихся крайними, одним из соседей считается элемент, находящий на противоположном конце этого списка. Например, если на вход подаётся список "1 3 5 6 10", то на выход ожидается список "13 6 9 15 7" (без кавычек).

Если на вход пришло только одно число, надо вывести его же.

Вывод должен содержать одну строку с числами нового списка, разделёнными пробелом. Может я что-то не так сделал? Вот код

s = input().split()
lens = len(s)
start = 0
end = -1
g = []
i = 0
k = i + 2
if lens == 1:
    print(*s)
elif lens > 1:
    for i in range(lens):
        if s[i] == s[start]:
            g.append(int(s[1]) + int(s[-1]))
            continue
        if ((s[i] != s[start]) or (s[i] != s[lens-1])) and k < lens:
            g.append(int(s[i-1]) + int(s[k]))
            k += 1
    for j in range(lens):
        if s[j] == s[end]:
            g.append(int(s[-2]) + int(s[0]))
print(*g)

Ответы

▲ 1Принят

Тест:

$ echo 1 1 | python pairwise-sum.py
2 2 2 2

Напечатано четыре числа в ответе, а не два, как должно быть. Это потому что в коде везде сравниваются значения (s[i] == s[start]), а должны сравниваться индексы (i == start). Пока все элементы в массиве уникальны, дефект не заметен.

Если убрать обращения к элементам списка в сравнениях, убрать второй цикл (в котором срабатывает только одна итерация), вынести расчёт первой суммы из цикла (ему там делать нечего) и сразу преобразовать строки в числа, получится такой код:

s = tuple(map(int, input().split()))
n = len(s)
if n <= 1:
    print(*s)
else:
    g = []
    g.append(s[-1] + s[1])
    for i in range(1, n - 1):
        g.append(s[i - 1] + s[i + 1])
    g.append(s[-2] + s[0])
    print(*g)

Заметьте что range можно начать с нуля, тогда первая итерация сделает туже работу что g.append перед циклом:

    ...
    g = []
    for i in range(0, n - 1):
        g.append(s[i - 1] + s[i + 1])
    g.append(s[-2] + s[0])
    ...

Обращение s[i + 1] можно поменять на s[i + 1 - n]. Пример для n = 6, i пробегает значения от нуля до четырёх (range(n - 1)). В последней строки реальные индексы по которым делается обращение в s. Они совпадают с i + 1:

i              :  0  1  2  3  4
i + 1          :  1  2  3  4  5
i + 1 - 6      : -5 -4 -3 -2 -1
реальный индекс:  1  2  3  4  5

Если в range поднять увеличить на единицу правый край диапазона, последняя итерация цикла сделает ту же работу что и g.append после цикла:

    ...
    g = []
    for i in range(0, n):
        g.append(s[i - 1] + s[i + 1 - n])
    ...

Цикл теперь переписывается в виде списочного выражения:

    ...
    g = [s[i - 1] + s[i + 1 - n] for i in range(n)]
    ...

Список не нужен, вместо него генератор:

s = tuple(map(int, input().split()))
n = len(s)
if n <= 1:
    print(*s)
else:
    print(*(s[i - 1] + s[i + 1 - n] for i in range(n)))

Такая получилась индексация.