P. Зайка — 10

Поможем детям разобраться, что именно они увидели рядом с зайками.

Формат ввода

В каждой строке записано описание придорожной местности.
Конец ввода обозначается пустой строкой.

Формат вывода:

Определите список увиденного рядом с зайками без повторений.
Порядок вывода не имеет значения.

Примечание

Считается, что объект находится рядом, если он записан справа или слева от требуемого.

Пример

Ввод

березка елочка зайка волк березка
сосна зайка сосна елочка зайка медведь
сосна сосна сосна белочка сосна белочка

Вывод

волк
елочка
медведь
сосна

Ввод

зайка березка
березка зайка
березка елочка березка
елочка елочка елочка

Вывод

березка

Решение

Проблему в этой задаче вызывает только положение зайки в начале и конце строки, особенно когда строка состоит всего из одного объекта. Ее легко решить с помощью проверки длины списка объектов в строке (она должна быть больше чем один, иначе соседей быть не может), проверки позиции в начале списка (может быть только сосед справа) или в конце списка (может быть только сосед слева). Это так называемый наивный метод – наиболее интуитивный.

Пока не наткнемся на пустую строку, считываем строку и разбиваем ее на слова.
Если длина получившегося после разбивки строки списка получилась больше единицы (есть соседи), то ищем зайку в списке.
Если зайка нашелся на первой позиции, в список соседей добавляем следующий за зайкой элемент.
Если зайка нашелся на последнем месте, то добавляем предыдущий.
В противном случае добавляем два элемента – предыдущий и следующий за зайкой элементы.
По окончанию цикла, выводим список соседей по одному на каждую строку.

Есть и другой способ решения задачи построенный на “обратной логике”. Он основан на том, чтобы в любой паре соседей искать зайку и если зайка нашелся, добавлять его соседа в список.
Во внешнем цикле проверяем строки, пока не наткнемся на пустую.
Во внутреннем цикле заводим переменную в которую будем заносить тот объект, который мы увидели последним. Изначально, для каждой новой строки, она будет равна пустой строке, ведь мы пока ничего не видели.
Далее в цикле перебираем слова из строки. Если последний увиденный объект – зайка то добавляем текущий объект в список. Чуть подробнее об идее можно прочитать в заметке Проверка на пустоту.
Далее проверяем на наличие зайки текущий объект. Если это зайка и если последний объект не пустая строка, то добавляем его в список объектов-соседей.
Теперь переносим наш текущий объект в переменную хранящую последний объект и повторяем цикл до тех пор пока не кончатся объекты.
По завершении главного цикла, выводим список соседей по одному на каждую строку.
Этот алгоритм более сложен для понимания, но при этом более лаконичен и лишен любых проверок, кроме проверок наличия зайки в одной из двух переменных. Если зайка найден, то второй объект должен быть помещен в список.

Посмотреть код

Решение

Python
# наивный

subject = 'зайка'
objects = []

while (nature := input().split()) != []:
    if len(nature) > 1 and subject in nature:
        for pos in range(length := len(nature)):
            if nature[pos] == subject:
                if pos == 0:
                    objects.append(nature[1])
                elif pos == (length - 1):
                    objects.append(nature[-2])
                else:
                    objects.append(nature[pos - 1])
                    objects.append(nature[pos + 1])

for item in set(objects):
    print(item)

Решение

Python
# продвинутый

subject = 'зайка'
objects = set()

while (nature := input().split()) != []:
    seen = None
    for item in nature:
        if seen == subject:
            objects.add(item)
        if item == subject:
            if seen:
                objects.add(seen)
        seen = item

for item in objects:
    print(item)
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии