Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помогите написать код на python(только без def)

Максим Климушкин Ученик (159), закрыт 11 месяцев назад
Напишите программу для расчета периметра заданного многоугольника.

Начните с запроса у пользователя координат x и y первой точки многоугольника. Продолжайте запрашивать координаты следующих точек фигуры, пока пользователь не оставит строку ввода координаты по оси x пустой. После ввода каждой пары значений вы должны вычислить длину очередной стороны многоугольника и прибавить полученное значение к будущему ответу. По окончании ввода необходимо вычислить расстояние от последней введенной точки до первой, чтобы замкнуть фигуру, и вывести итоговый результат. Пример ввода координат точек многоугольника и вывода периметра показан ниже. Введенные пользователем значения выделены жирным.

Введите первую координату X: 0

Введите первую координату Y:0

Введите следующую координату X (Enter для окончания ввода): 1

Введите следующую координату Y: 0

Введите следующую координату X (Enter для окончания ввода): 0

Введите следующую координату Y: 1

Введите следующую координату X (Enter для окончания ввода):

Периметр многоугольника равен 3.414213562373095
Лучший ответ
Реципиент Гений (70042) 1 год назад
Заставил попотеть, "без def" ему...
Но одну лямбду всё же пришлось оставить, без этого не реализуются либо условие окончания ввода, либо эти чередующиеся приглашения.
 from itertools import chain, count, pairwise, takewhile, tee
from functools import reduce
from math import sqrt

PROMPTS = ["Введите первую координату X: ", "Введите первую координату Y: ",
"Введите следующую координату X (Enter для окончания ввода): ", "Введите следующую координату Y: "]
inp = (input(PROMPTS[min(i, 2 | (i & 1))]) for i in count())
coords = map(float, takewhile(lambda t: len(t) > 0, inp))
allpts = zip(coords, coords)
pts, duppts = tee(allpts)
segments = pairwise(chain(pts, (next(duppts) for _ in [0])))
dists = (sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) for p1, p2 in segments)
print(sum(dists))

Думаю, разберёшься без проблем, раз умеешь писать код без def (определение своих функций - это же для слабаков).
Оставлю только краткие пояснения:
Строка "inp = ..." создаёт бесконечный итератор, получающий со стандартного ввода последовательность координат в строковом виде (count() - бесконечный итератор, возвращающий целые числа 0, 1, 2, ...). Приглашения для ввода чередуются согласно условию задачи.
Строка "coords = " создаёт на его базе итератор координат, который останавливается на введённой пустой строке, и возвращает уже вещественные, а не строковые значения.
Строка "allpts = " создаёт на базе итератора координат итератор пар координат, где чётные (считая с 0) значения становятся координатами x, а нечётные - y. Значения хранятся упаковываются в тип tuple, т.е. кортеж.
Следующая строка дублирует итератор, т.к. нам нужно будет первую координатную пару посчитать в конце.
Строка "segments = " на базе итератора координат строит итератор отрезков. Т.е. вместо ((x1, y1), (x2, y2), (x3, y3), (x4, y4)...) мы получаем (((x1, y1), (x2, y2)), ((x2, y2), (x3, y3)), ((x3, y3), (x4, y4))...) - это делает функция pairwise. Также при помощи chain здесь первая точка добавляется в конец, поэтому последним будет отрезок ((xN, yN), (x1, y1)). Этот итератор возвращает кортежи кортежей.
Строка "dists = " на базе итератора отрезков строит итератор расстояний, вычисляя расстояние между парами точек. Кортежи кортежей преобразуются в вещественные числа.
А дальше при помощи sum() мы получаем сумму расстояний, т.е. искомый периметр многоугольника.

И заметим, тут нет ни одного списка, кроме списка приглашений, определённого в начале (хотя, и его можно заменить на кортеж при желании - квадратные скобки на круглые, а остальное остаётся, как есть). И хоть миллиард координат введи, обрабатываться будет по 4 за раз.
Остальные ответы
Похожие вопросы