forked from pablorus/Python_lessons_basic
-
Notifications
You must be signed in to change notification settings - Fork 457
/
Copy pathhw02_hard.py
123 lines (101 loc) · 5.34 KB
/
hw02_hard.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
__author__ = 'Насонов Алексей Сергеевич'
# Задание-1: уравнение прямой вида y = kx + b задано в виде строки.
# Определить координату y точки с заданной координатой x.
#equation = 'y = -12x + 11111140.2121'
#x = 2.5
# вычислите и выведите y
print("Задача-1:")
x = 2.5
y = -12*x + 11111140.2121
print("Координата точки: x = {0}, y = {1}".format(x,y))
# Задание-2: Дата задана в виде строки формата 'dd.mm.yyyy'.
# Проверить, корректно ли введена дата.
# Условия корректности:
# 1. День должен приводиться к целому числу в диапазоне от 1 до 30(31)
# (в зависимости от месяца, февраль не учитываем)
# 2. Месяц должен приводиться к целому числу в диапазоне от 1 до 12
# 3. Год должен приводиться к целому положительному числу в диапазоне от 1 до 9999
# 4. Длина исходной строки для частей должна быть в соответствии с форматом
# (т.е. 2 символа для дня, 2 - для месяца, 4 - для года)
# Пример корректной даты
#date = '01.11.1985'
# Примеры некорректных дат
#date = '01.22.1001'
#date = '1.12.1001'
#date = '-2.10.3001'
print("Задача-2:")
DaysInToMonth = [30, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
date = '21.11.1985'
List = date.split(".")
# Проверка по формату
if len(List[0]) != 2 or len(List[1]) != 2 or len(List[2]) != 4:
print("Формат не соответсвует dd.mm.yyyy")
quit()
D = int(List[0])
M = int(List[1])
Y = int(List[2])
# Проверяем месяц
if M not in list(range(1, 13)):
print("Некоректно определен месяц")
quit()
# Проверяем день
elif D not in list(range(1, DaysInToMonth[M-1]+1)):
print("Некоректно определен день")
quit()
# Проверяем год
elif Y not in list(range(1, 10000)):
print("Некоректно определен год")
quit()
print("Дата {} введена корректно".format(date))
# Задание-3: "Перевёрнутая башня" (Задача олимпиадного уровня)
#
# Вавилонцы решили построить удивительную башню —
# расширяющуюся к верху и содержащую бесконечное число этажей и комнат.
# Она устроена следующим образом — на первом этаже одна комната,
# затем идет два этажа, на каждом из которых по две комнаты,
# затем идёт три этажа, на каждом из которых по три комнаты и так далее:
# ...
# 12 13 14
# 9 10 11
# 6 7 8
# 4 5
# 2 3
# 1
#
# Эту башню решили оборудовать лифтом --- и вот задача:
# нужно научиться по номеру комнаты определять,
# на каком этаже она находится и какая она по счету слева на этом этаже.
#
# Входные данные: В первой строчке задан номер комнаты N, 1 ≤ N ≤ 2 000 000 000.
#
# Выходные данные: Два целых числа — номер этажа и порядковый номер слева на этаже.
#
# Пример:
# Вход: 13
# Выход: 6 2
#
# Вход: 11
# Выход: 5 3
print("Задача-3:")
# Задаем номер квартиры
Num = 11
# Определяем в каком квадрате находится квартира (сумму квадратов n натуральных чисел)
# Правильнее бы было найти обратную функцию, но как-то не получилось. Поэтому ищем решение по исходной функции
for n in range(1, 2000):
MaxKvart = n * (n + 1) * (2 * n + 1) / 6
if MaxKvart >= Num:
break
print("Номер исходной квартиры:", Num)
print("Номер квадрата:", n)
print("Номер последней квартиры(в правом верхнем углу):", int(MaxKvart))
# Определяем верхний этаж этого квадрата (сумму n натуральных чисел)
MaxEtag = n * (n + 1) / 2
print("Этаж самой последней квартиры в этом квадрате", int(MaxEtag))
# Определяем искомый этаж и смещение слева на право на этаже у искомой квартиры
DeltaEtag = (MaxKvart - Num) // n
RightOffset = (MaxKvart - Num) % n
print("Дельта этаж", int(DeltaEtag))
print("Смещение квартиры справа", int(RightOffset))
print("\nРЕШЕНИЕ:")
print("Искомый этаж:", int(MaxEtag-DeltaEtag))
print("Номер квартиры на этаже слева:", int(n-RightOffset))