Как сделать перевернутый треугольник в питоне

Обновлено: 06.07.2024

Не получается решить задачу:
Даны три стороны треугольника a,b,c. Определите тип треугольника с заданными сторонами. Выведите одно из четырех слов: rectangular для прямоугольного треугольника, acute для остроугольного треугольника, obtuse для тупоугольного треугольника или impossible, если треугольника с такими сторонами не существует.
Решаю с помощью теоремы косинусов:
a = int(input())
b = int(input())
c = int(input())
x = ((a ** 2) - (b ** 2) - (c ** 2))/(- 2 * b * c)
y = ((b ** 2) - (a ** 2) - (c ** 2))/(- 2 * a * c)
z = ((c ** 2) - (a ** 2) - (b ** 2))/(- 2 * b * a)
if x or y or z == 0:
print("rectangular")
elif x and y and z > 0:
print("acute")
elif x or y or z Последний раз редактировалось andr19792; 10.03.2018 в 21:50 .

Алгоритм такой:
1) Ищем максимальную сторону, пусть c.
2) Если c >= a + b, то треугольник невозможен
3) Считаем знак a*a + b*b - c*c
+: остроугольный
0: прямоугольный
-: тупоугольный

Алгоритм такой:
1) Ищем максимальную сторону, пусть c.
2) Если c >= a + b, то треугольник невозможен
3) Считаем знак a*a + b*b - c*c
+: остроугольный
0: прямоугольный
-: тупоугольный

Спасибо за совет, попробую.
Все же не понимаю, почему мое решение 50% готовности. По теорме косинусов поочередно рассматриваю каждую сторону треугольника.

Скорей всего это для coursera. Вот мое принятое решение))

Спасибо за ответ, да coursera))), немного не понятен ход решения вот здесь:
else:
if b

Алгоритм такой:
1) Ищем максимальную сторону, пусть c.
2) Если c >= a + b, то треугольник невозможен
3) Считаем знак a*a + b*b - c*c
+: остроугольный
0: прямоугольный
-: тупоугольный

Так не получается:

a = int(input())
b = int(input())
c = int(input())
if (a + b) a and c > b and a ** 2 + b ** 2 - c ** 2 > 0:
print("acute")
if b > a and b > c and a ** 2 + c ** 2 - b ** 2 > 0:
print("acute")
if a > b and a > c and b ** 2 + c ** 2 - a ** 2 > 0:
print("acute")
if c > a and c > b and a ** 2 + b ** 2 - c ** 2 a and b > c and a ** 2 + c ** 2 - b ** 2 b and a > c and b ** 2 + c ** 2 - a ** 2 a and c > b and a ** 2 + b ** 2 - c ** 2 == 0:
print("rectangular")
if b > a and b > c and a ** 2 + c ** 2 - b ** 2 == 0:
print("rectangular")
if a > b and a > c and b ** 2 + c ** 2 - a ** 2 == 0:
print("rectangular")

Скорей всего это для coursera. Вот мое принятое решение))

Спасибо за ответ, да coursera))), немного не понятен ход решения вот здесь:
else:
if b

Немного не Python

int a, b, c;
int maxVal, res;
cin >> a >> b >> c;

if (a b) maxVal=a;
else maxVal=b;

if (maxVal 0) cout Последний раз редактировалось anlo; 05.03.2020 в 01:59 .


Какой лучший способ перевернуть строки Python? Разумеется, переворот строк не используется так часто в повседневном программировании, однако это нередкий вопрос во время интервью:

Одна из вариаций этого вопроса — это написать функцию, которая проверяет, является ли заданная строка палиндромом, т.е., читается ли она одинаково в правильном и в обратном порядке:

Очевидно, нам нужно выяснить, как перевернуть строку для реализации функции is_palindrome в Python… как это сделать?

В данном руководстве мы изучим три основных способа перевернуть строку в Python:

Переворот строки Python при помощи среза

Строки следуют протоколу последовательности Python. И все последовательности поддерживают любопытную функцию под названием срез. Вы можете смотреть на срез как на расширение синтаксиса индексирования квадратных скобок.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Это включает в себя отдельный случай, где срез последовательности с “[::-1]” создает перевернутую копию. Так как строки Python являются последовательностями, это быстрый и простой способ получить отраженную копию строки:

Конечно, вы можете вставить срез в функцию, чтобы сделать более очевидным то, что делает код:

Как вам такое решение?

Я не виню их — срез списка может быть трудным для понимания, особенно если вы впервые сталкиваетесь с этим непонятным лаконичным синтаксисом.

Когда я читаю код Python, в котором используется срез, мне, как правило, приходиться задерживаться и фокусироваться, чтобы мысленно разобрать утверждение, чтобы убедиться в том, что я правильно понимаю происходящее.

Самой большой проблемой для меня является то, что синтаксис среза “[::-1]” недостаточно явно информирует о том, что он создает отраженную копию оригинальной строки.

По этой причине я думаю, что использование функцию среза в Python для переворота строки — достойное решение, но это может быть сложно для чтения неподготовленному человеку.

Перевернуть сроку при помощи reversed() и str.join()

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

Это сильная техника, которая использует преимущество протокола итерации Python.

Итак, все что вы видели — это способы итерации над символами строки в обратном порядке. Но как использовать эту технику для создания отраженной копии строки Python при помощи функции reversed()?

Сделаем это вот так:

В этом фрагменте кода используется метод .join(), объединяющий все символы, полученные в результате обратной итерации в новой строке. Хитро и удобно!

Мне действительно нравится этот подход обратного итератора для переворота строк в Python.

Он четко сообщает о том, что происходит, и даже новичок в языке на интуитивном уровне может понять, что я создаю перевернутую копию оригинальной строки.

И хотя понимание работы итераторов на глубоком уровне — полезно и похвально, это не абсолютная необходимость для использования этой техники.

Это классический алгоритм переворачивания строк из учебников, портированный для Python. Так как строки Python являются неизменными, вам для начала нужно конвертировать вводимую строку в меняемый список символов, таким образом вы сможете выполнить смену символов на месте:

Как вы видите, это решение не то чтобы родное для Python, и не то, чтобы идиоматическое. Здесь не используются возможности Python и вообще, это явный порт алгоритма из языка программирования C.

И если этого не достаточно — это самое медленное решение, как вы увидите в следующем разделе, я буду проводить бенчмаркинг по всем трем реализациям.

Сравнение производительности

После реализации всех трех подходов к переворачиванию строк, показанных в этом руководстве, мне стало любопытна их относительная производительность.

Так что я провел небольшой бенчмаркинг:

Хорошо, это интересно… вот результаты в форме таблицы:

Перевернуть строку в Python

Как вы видите, есть огромная разница в производительности между этими тремя реализациями.

Теперь, смену символов на месте определенно можно оптимизировать (сообщите в комментариях внизу о вашем решении по улучшению, если хотите) — однако это сравнение производительности дает нам явное представление о том, какая операция отражения является самой быстрой в Python.

Итог: Переворачивания строк в Python

Переворачивание строк — это стандартная операция в программировании (и во время интервью). В этом руководстве вы узнали о трех разных подходах к переворачиванию строк в Python.

Давайте проведем краткий обзор каждого из способов, перед тем как я дам рекомендации о каждом варианте:

Вариант 1: срез списка [::-1]

Вы можете использовать синтаксис среза Python для создания перевернутой копии строки. Это хорошо работает, однако синтаксис может быть непонятным для пользователей Python.

  • Создает переверную копию строки;
  • Это самый быстрый способ переворота строки в Python

Вариант 2: reversed() and str.join()

Встроенная функция reversed() позволяет вам создать отраженный итератор строки Python (или любой другой последовательный объект). Это гибкое и простое решение, которое использует определенные продвинутые функции Python, но при этом остается читаемым благодаря четкому названию reversed()

  • Функция reversed() возвращает итератор, который проводит итерацию над символами в строке в обратном порядке
  • Этот поток символов необходимо комбинировать в строку при помощи функции str.join()
  • Этот способ медленнее среза, но более читаемый.

Использование стандартного алгоритма замены символов с предварительным портированием в Python работает, но сопровождается вялой производительностью и читаемостью, в сравнении с другими способами.

  • Это намного медленнее среза и обратной итерации (в зависимости от реализации);
  • Данный алгоритм не рекомендуется, только если вы не в ситуации с интервью.

Однако, также присутствует аргумент, где наш подход среза является в 8 раз быстрее, что может быть предпочтительно, если есть необходимость в производительности.

В зависимости от вашего случая, это может быть грамотным решением. Кроме этого, это весьма уместная ситуация для цитаты Дональда Кнута:

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

Но для обычного приложения Python это не даст существенной разницы. Так что я выбираю наиболее читаемым (и следовательно, поддерживаемым) подходом.

В моем случае это вариант 2: reversed() + join().

Если вы хотите углубиться в вопрос, вы можете найти море информации в документации и интернете. Кстати, комментарии в разделе ниже приветствуются! Поделитесь с нами вашими любимыми техниками отражения строк.


Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

Возвращает элементы последовательности в обратном порядке.

Синтаксис:

Параметры:

Возвращаемое значение:

Описание:

Функция reversed() возвращает обратный итератор, то есть возвращает итератор, который перебирает элементы оригинала в обратном порядке.

Функция reversed() не создает копию и не изменяет оригинал последовательности.

Объект seq должен иметь метод __reversed__() или поддерживает протокол последовательности, это метод __len__() и метод __getitem__() с целочисленными аргументами, начинающимися с 0 .

Pillow – это продвинутая библиотека, позволяющая создавать и обрабатывать изображения. С ее помощью можно, в том числе, рисовать круг, квадрат и прямую линию. Для этого используется модуль ImageDraw . Сегодня мы поговорим подробно о нем.

Как создавать объект Draw в Python?

Если нам надо создать фигуру, необходимо сначала создать объект Image, который будет служить фоном для нашего рисунка. Далее, для создания конкретных фигур мы станем пользоваться объектом Draw .

Перед тем, как начинать работать над созданием объектов, необходимо импортировать модули Image и ImageDraw . А сам код будет таковым.

Этот код создает пустое изображение размером 500 на 300. Также он устанавливает темно-желтый цвет фона.

Как рисовать фигуры в Pillow?

Чтобы осуществлять рисование фигур в Python, необходимо в объекте Draw библиотеки Pillow использовать соответствующие методы рисования. Для начала давайте попробуем нарисовать эллипс, прямоугольник и прямую линию.

Рисуем круг, прямоугольник, линии и дуги в Python с помощью Pillow. Геометрические фигуры в Python

После выполнения этого кода мы получим следующий результат.

Параметры методов рисования – справочник

Да, способы рисования отличаются в зависимости от метода, который используется. Тем не менее, такие параметры являются общими для всех.

Область рисования

Этот параметр обозначается, как xy . С его помощью мы задаем прямоугольную область, которая будет использоваться для рисования новой фигуры.

Есть такие форматы:

Если рисуется линия, многоугольник или точка, то используются множественные координаты вместо двух точек, которые представляют прямоугольную область.

Принцип работы следующий:

  1. Линия. Реализуется с помощью метода line , который связывает точки между собой.
  2. Многоугольник. Чтобы его создать, необходимо использовать метод polygon() . Он работает по похожему принципу, соединяя линиями указанные точки, только в конечном итоге линия должна получиться замкнутой.
  3. Точка. Реализуется с использованием метода point() . Она рисует точку размером в 1 пиксель для каждой точки, которая указывается.

Заполнение фигуры с помощью параметра fill

С помощью параметра fill мы определяем цвет, который будет использоваться для того, чтобы заполнить геометрическую форму.

Здесь на спецификацию формата цвета влияет режим изображения, который указывается для объекта Image.

  1. RGB. В этом случае формируется цветное изображение. В этом случае цвет указывается в формате: красный-зеленый-синий (R,G,B).
  2. L. Генерируется черно-белая геометрическая фигура. Здесь нужно указать одну цифру в пределах от 0 до 255. Допускаются исключительно целочисленные значения.

По умолчанию используется значение None , что означает отсутствие фона фигуры. То есть, она не заполняется никаким цветом, принимая тот фон того участка, что находится под ней.

К слову, цвет можно указать тремя способами: передать его цветом, использовать шестнадцатеричный формат или указать интенсивность красного, зеленого и синего оттенков в палитре RGB.

Учитывайте то, что текстовый формат не предусматривает наличия всех цветов. Перечень тех, которые доступны, ограничен.

Задание цвета границ с использованием параметра outline

Если нужно указать, какого цвета должна быть граница многоугольника, используется параметр outline .

Цвет задается абсолютно так же, как это происходит в случае с параметром fill , который обсуждался ранее. По умолчанию используется значение None . То есть, границы отсутствуют.

Указание толщины границ с использованием параметра width

Нет разницы, какая фигура вами будет рисоваться. Вы всегда имеете возможность задать размер ее границы с помощью этого параметра. Толщина задается в пикселях.

Как рисовать эллипс и прямоугольник в Python?

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

Давайте попробуем с помощью кругов создать маленький смайлик.

Результат:

Как нарисовать линию, многоугольник и точку в Python?

Предположим, нам надо нарисовать линию. Что для этого нужно сделать? Правильно, использовать функцию line , аргументы которой следующие:

  • xy . Точка по осям абсцисс и ординат. Необходимо, чтобы таких точек было, по крайней мере 2. Точки указываются в скобках, и каждая пара x и y также заключается в скобки ((x1, y1), (x2, y2), (x3, y3)…). Далее линия рисуется таким образом, чтобы соединить все эти точки.
  • width . Здесь указывается ширина линии в пикселях. Учтите, что если ширина линии становится больше и указывать 3 точки или более, то получившаяся фигура будет выглядеть хуже.

Для отрисовки многоугольника используется метод polygon(xy, fill, outline) .

  1. Параметр xy . С его помощью разработчик задает несколько координат нескольких точек. Минимальное количество для образования многоугольника – 3. В этом случае будет нарисован треугольник. Далее эти точки соединяются линиями таким образом, чтобы получилась геометрическая фигура.
  2. fill. Заполнитель, который нами был рассмотрен ранее.
  3. outline. Значение то же самое, что и было описано выше.

Проще всего нарисовать точку. Для этого используется метод point(xy, fill) . Можно рисовать несколько точек, задав несколько координат таким же способом, как было описано выше (через множественные скобки). Одна точка рисуется для каждой пары координат.

Ниже вы можете увидеть примеры рисования этих геометрических фигур. Каждая точка являет собой 1 пиксель. Поэтому их тяжело увидеть, но они все равно нарисованы справа.

Рисуем круг, прямоугольник, линии и дуги в Python с помощью Pillow. Геометрические фигуры в Python

А теперь давайте рассмотрим пример для рисования дуги, хорды, pieslice . Для рисования фигуры используется параметр xy .

  • Дуга: arc(xy, start, end, fill):
    • Параметры start и end
    • Указание угла дуги в градусах;
    • Начальные и конечные точки дуги связываются прямой линией.
    • Начальные и конечные точки дуги связываются прямой линией с центром круга.

    А теперь приведем пример кода, который рисует картинку, приведенную ниже.

    И такой результат мы получаем в итоге.

    Рисуем круг, прямоугольник, линии и дуги в Python с помощью Pillow. Геометрические фигуры в Python

    Рисование поверх изображения

    Рисовать можно не только по пустому полотну, но уже и по существующему изображению. Для этого необходимо воспользоваться методом open() объекта Image .

    В качестве примера мы воспользуемся изображением создателя Python Гвидо ван Россума.

    Для начала сохраните это изображение у себя.

    Рисуем круг, прямоугольник, линии и дуги в Python с помощью Pillow. Геометрические фигуры в Python

    Рисуем круг, прямоугольник, линии и дуги в Python с помощью Pillow. Геометрические фигуры в Python

    В результате, у нас получится такая картинка.

    Выводы

    Таким образом, реализовать работу с изображениями в Python довольно просто. Достаточно воспользоваться продвинутой библиотекой Pillow, которая отлично справляется с самыми разными задачами, касающимися графики.

    Читайте также: