Найти в Дзене
Be Happy

Решение задач по программированию на языке Python для начинающих (ч.3, IF)

Оглавление
Рисунок с сайта blog.hyperiondev.com
Рисунок с сайта blog.hyperiondev.com

В статье приведены решения нескольких типовых задач, которые могут встретится и на экзамене по информатике, на собеседовании или в обучающих курсах. Все они должны быть решены без использования циклов, функций и массивов, что делает решение задачи более увлекательным занятием. Нижеследующие задачи взятых из курса обучения "Основы программирования на Python" (автор курса: National Research University Higher School of Economics), размещенному на сайте coursera.org.

Здесь описаны задачи: Шашки, Тип треугольника, Узник замка Иф, Коробки, Складирование ноутбуков и Мороженное.

Рисунок с сайта stemlab.by
Рисунок с сайта stemlab.by

Шашки.

"На шахматной доске стоит белая шашка. Нужно узнать, может ли эта шашка попасть в заданную клетку. Ходы осуществляются по правилам, не пользуясь ходами дамки (т. е. дойдя до края доски, шашка не превращается в дамку).

Доска имеет размер 8x8, вертикали и горизонтали нумеруются числами от 1 до 8 начиная с левого нижнего угла.

Выведите "YES" , если шашка может попасть из начальной клетки в указанную, и "NO" если не может."

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

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

v1 = int(input())

g1 = int(input())

v2 = int(input())

g2 = int(input())

if v2 >= v1 and g2 >= g1 and (v1 + g1) % 2 == (v2 + g2) % 2:

....print("YES")

else:

....print("NO")

Тип треугольника.

"Даны три стороны треугольника a,b,c. Задача - определить тип треугольника с этими заданными сторонами. Программа должна вывести: "rectangular" в случае прямоугольного треугольника, "acute" если треугольник остроугольный, "obtuse" для тупоугольного треугольника или "impossible", если не существует треугольника с такими сторонами."

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

Для решения требуются знания школьной программы по геометрии и без теоремы Пифагора здесь не обойтись. Начинаем с поиска самой длинной стороны 'l'.

a = int(input())

b = int(input())

c = int(input())

if a >= b and a >= c:

....l = a

....s1 = b

....s2 = c

if b >= a and b >= c:

....l = b

....s1 = a

....s2 = c

if c >= a and c >= b:

....l = c

....s1 = a

....s2 = b

s = s1**2 + s2**2 - l**2

if l >= s1 + s2:

....print('impossible')

elif s > 0:

....print('acute')

elif s == 0:

....print('rectangular')

elif s < 0:

....print('obtuse')

Узник замка Иф.

"Заключенный замка Иф, многие годы подготавливая побег, проделал в стене прямоугольное отверстие размером D×E. Замок сложен из кирпичей, со сторонами размером A×B×C. Определите, сможет ли через проделанное отверстие, узник выбрасывать кирпичи в море (стороны кирпича параллельны сторонам отверстия).

Выведите слово "YES" если сможет или "NO" если у него не получится."

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

Придется кирпич повертеть разными сторонами и как только проскочит, то сразу кричим: "YES!"

a = int(input())

b = int(input())

c = int(input())

d = int(input())

e = int(input())

if a <= d and b <= e or a <= e and b <= d:

....print('YES')

elif c <= d and b <= e or c <= e and b <= d:

....print('YES')

elif a <= d and c <= e or a <= e and c <= d:

....print('YES')

else:

....print('NO')

Коробки.

"Даны две коробки, первая со сторонами размером A₁×B₁×C₁, вторая - A₂×B₂×C₂. Нужно определить, возможно ли разместить одну из этих коробок внутри другой. Поворачивать коробки можно только на 90 градусов вокруг ребер.

В результате программа должна вывести:

"Boxes are equal", если коробки одинаковые,

"The first box is smaller than the second one", если первая коробка поместится во вторую,

"The first box is larger than the second one", если вторая коробка может быть помещена в первую,

"Boxes are incomparable", во всех других случаях."

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

Для решения лучше отсортировать стороны коробок по возрастанию (или по убыванию, главное одинаково в обоих случаях) и просто сравнить.

a1 = int(input())

b1 = int(input())

c1 = int(input())

a2 = int(input())

b2 = int(input())

c2 = int(input())

if a1 > b1:

....(a1, b1) = (b1, a1)

if b1 > c1:

....(b1, c1) = (c1, b1)

if a1 > b1:

....(a1, b1) = (b1, a1)

if a2 > b2:

....(a2, b2) = (b2, a2)

if b2 > c2:

....(b2, c2) = (c2, b2)

if a2 > b2:

....(a2, b2) = (b2, a2)

if a1 == a2 and b1 == b2 and c1 == c2:

....print('Boxes are equal')

elif a1 <= a2 and b1 <= b2 and c1 <= c2:

....print('The first box is smaller than the second one')

elif a1 >= a2 and b1 >= b2 and c1 >= c2:

....print('The first box is larger than the second one')

else:

....print('Boxes are incomparable')

Складирование ноутбуков.

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

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

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

Это уже почти программа для склада. Придется по-всякому покрутить ноуты и посмотреть в каком варианте размещения поместится больше всего.

ls, hs, ws = int(input()), int(input()), int(input())

a, b, c = int(input()), int(input()), int(input())

rez = (ls // a) * (hs // b) * (ws // c)

q = (ls // a) * (hs // c) * (ws // b)

if q > rez:

....rez = q

q = (ls // b) * (hs // a) * (ws // c)

if q > rez:

....rez = q

q = (ls // b) * (hs // c) * (ws // a)

if q > rez:

....rez = q

q = (ls // c) * (hs // a) * (ws // b)

if q > rez:

....rez = q

q = (ls // c) * (hs // b) * (ws // a)

if q > rez:

....rez = q

print(rez)

Мороженое.

"В кафе стоят аппараты выдачи мороженого, которые выдают по три или по пять шариков. Можно ли купить ровно k шариков мороженого?

Вывести слово "YES", если можно набрать ровно k шариков, ну а если не получится - вывести "NO"."

(описание задачи взято с сайта www.coursera.org/learn/python-osnovy-programmirovaniya/programming/)

Решение

Тут какие-то чуднЫе закономерности, но главное что это работает. Если знаете вариант лучше, то пишите в комментах.

k = int(input())

a = 3

b = 5

if k < a or k == 4:

....print('NO')

elif k % a == 0 or k % b == 0 or k % 3 == 2 or k % 5 == 3:

....print('YES')

elif k >= 6 and (k - 6) % 5 == 0:

....print('YES')

elif k >= 9 and (k - 9) % 5 == 0:

....print('YES')

elif k >= 12 and (k - 12) % 5 == 0:

....print('YES')

else:

....print('NO')

Пока всё. Дальше будут задачи с циклами. Всем успехов в программировании!