-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodule_1.py
More file actions
315 lines (260 loc) · 17 KB
/
module_1.py
File metadata and controls
315 lines (260 loc) · 17 KB
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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
# Stepick.org — Python: основы и применение
# 1. Базовые принципы языка Python
# === 1.1 Введение ===
def m_1_1():
"""
Реализуйте программу, которая принимает последовательность
чисел и выводит их сумму.
Вашей программе на вход подается последовательность строк.
Первая строка содержит число n (1 ≤ n ≤ 100).
В следующих n строках содержится по одному целому числу.
Выведите одно число – сумму данных n чисел.
"""
print(sum(int(input()) for _ in range(int(input()))))
# === 1.2 Модель данных: объекты ===
def m_1_2():
"""
Реализуйте программу, которая будет вычислять количество различных
объектов в списке. Два объекта a и b считаются различными, если
a is b равно False. Вашей программе доступна переменная с названием
objects, которая ссылается на список, содержащий не более 100 объектов.
Выведите количество различных объектов в этом списке.
"""
print(len(set(id(obj) for obj in (objects))))
# === 1.3 Функции и стек вызовов ===
def m_1_3_1():
"""
Напишите реализацию функции closest_mod_5, принимающую в качестве
единственного аргумента целое число x и возвращающую самое
маленькое целое число y, такое что:
- y больше или равно x
- y делится нацело на 5
"""
def closest_mod_5(x):
if x % 5 == 0:
return x
y = 5 * (x // 5 + 1)
return y
def m_1_3_2():
"""
Сочетанием из n элементов по k называется подмножество этих n элементов
размера k. Два сочетания называются различными, если одно из сочетаний
содержит элемент, который не содержит другое. Числом сочетаний из n по k
называется количество различных сочетаний из n по k.
Обозначим это число за C(n, k).
Для вычисления C(n, k) в других случаях используется следующая
рекуррентная формула: C(n, k) = C(n - 1, k) + C(n - 1, k - 1).
Реализуйте программу, которая для заданных n и k вычисляет C(n, k).
Вашей программе на вход подается строка, содержащая
два целых числа n и k (1 ≤ n ≤ 10, 0 ≤ k ≤ 10).
Ваша программа должна вывести единственное число: C(n, k).
"""
def combination(n, k):
if k == 0:
return 1
if k > n:
return 0
return combination(n - 1, k) + combination(n - 1, k - 1)
arg_n, arg_k = map(int, input().split())
print(combination(arg_n, arg_k))
# === 1.4 Пространства имён и области видимости ===
def m_1_4_1():
"""
Реализуйте программу, которая будет эмулировать работу с пространствами
имен. Необходимо реализовать поддержку создания пространств имен и
добавление в них переменных. В данной задаче у каждого пространства имен
есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
create <namespace> <parent> – создать новое пространство имен с именем
<namespace> внутри пространства <parent>
add <namespace> <var> – добавить в пространство <namespace>
переменную <var>
get <namespace> <var> – получить имя пространства, из которого будет взята
переменная <var> при запросе из пространства <namespace>, или None,
если такого пространства не существует
Формат входных данных
В первой строке дано число n (1 ≤ n ≤ 100) – число запросов.
В каждой из следующих n строк дано по одному запросу.
Запросы выполняются в порядке, в котором они даны во входных данных.
Имена пространства имен и имена переменных представляют из себя строки
длины не более 10, состоящие из строчных латинских букв.
Формат выходных данных
Для каждого запроса get выведите в отдельной строке его результат.
"""
spaces = {"global": "None"}
vars = {"global": set()}
for _ in range(int(input())):
request, namespace, data = input().split()
if request == "create":
spaces[namespace] = data
vars[namespace] = set()
elif request == "add":
vars[namespace].add(data)
elif request == "get":
while namespace != "None":
if data in vars[namespace]:
print(namespace)
break
namespace = spaces[namespace]
else:
print("None")
# === 1.5 Введение в классы ===
def m_1_5_1():
"""
Реализуйте класс MoneyBox, для работы с виртуальной копилкой.
Каждая копилка имеет ограниченную вместимость, которая выражается
целым числом – количеством монет, которые можно положить в копилку.
Класс должен поддерживать информацию о количестве монет в копилке,
предоставлять возможность добавлять монеты в копилку и узнавать,
можно ли добавить в копилку ещё какое-то количество монет,
не превышая ее вместимость.
Класс должен иметь следующий вид
class MoneyBox:
def __init__(self, capacity):
# конструктор с аргументом – вместимость копилки
def can_add(self, v):
# True, если можно добавить v монет, False иначе
def add(self, v):
# положить v монет в копилку
При создании копилки, число монет в ней равно 0.
Примечание: Гарантируется, что метод add(self, v) будет вызываться
только если can_add(self, v) – True.
"""
class MoneyBox:
def __init__(self, capacity):
self.capacity = capacity
def can_add(self, v):
return self.capacity >= v
def add(self, v):
self.capacity -= v
def m_1_5_2():
"""
Вам дается последовательность целых чисел и вам нужно ее обработать и
вывести на экран сумму первой пятерки чисел из этой последовательности,
затем сумму второй пятерки, и т. д.
Но последовательность не дается вам сразу целиком. С течением времени
к вам поступают её последовательные части. Например, сначала первые три
элемента, потом следующие шесть, потом следующие два и т. д.
Реализуйте класс Buffer, который будет накапливать в себе элементы
последовательности и выводить сумму пятерок последовательных элементов
по мере их накопления.
Одним из требований к классу является то, что он не должен хранить в себе
больше элементов, чем ему действительно необходимо, т. е. он не должен
хранить элементы, которые уже вошли в пятерку, для которой была
выведена сумма. Обратите внимание, что во время выполнения метода add
выводить сумму пятерок может потребоваться несколько раз до тех пор,
пока в буфере не останется менее пяти элементов.
"""
class Buffer:
def __init__(self):
self.nums = []
def add(self, *a):
for num in a:
self.nums.append(num)
if len(self.nums) == 5:
print(sum(self.nums))
self.nums.clear()
def get_current_part(self):
return self.nums
# === 1.6 Наследование классов ===
def m_1_6_1():
"""
Вам дано описание наследования классов в следующем формате.
<имя класса 1> : <имя класса 2> <имя класса 3> ... <имя класса k>
Это означает, что класс 1 отнаследован от класса 2, класса 3, и т. д.
Класс A является предком класса B, если
- A = B;
- A - прямой предок B
- существует такой класс C, что C - прямой предок B и A - предок C
Вам необходимо отвечать на запросы, является ли один класс предком
другого класса. Важное примечание: Создавать классы не требуется.
Мы просим вас промоделировать этот процесс, и понять существует ли
путь от одного класса до другого.
Формат входных данных
В первой строке входных данных содержится целое число n - число классов.
В следующих n строках содержится описание наследования классов.
В i-й строке указано от каких классов наследуется i-й класс.
Обратите внимание, что класс может ни от кого не наследоваться.
Гарантируется, что класс не наследуется сам от себя (прямо или косвенно),
что класс не наследуется явно от одного класса более одного раза.
В следующей строке содержится число q - количество запросов.
В следующих q строках содержится описание запросов в
формате <имя класса 1> <имя класса 2>.
Имя класса – строка, состоящая из символов латинского алфавита,
длины не более 50.
Формат выходных данных
Для каждого запроса выведите в отдельной строке слово "Yes",
если класс 1 является предком класса 2, и "No", если не является.
"""
def is_anc(des, anc):
if des == anc:
return True
if anc in classes[des]:
return True
for parent in classes[des]:
if is_anc(parent, anc):
return True
return False
classes = {}
for _ in range(int(input())):
name, *ancs = input().split(" : ")
classes[name] = [anc for anc in ancs[0].split()] if ancs else []
for _ in range(int(input())):
a, d = input().split()
print("Yes" if is_anc(d, a) else "No")
def m_1_6_2():
"""
Реализуйте структуру данных, представляющую собой расширенную
структуру стек. Необходимо поддерживать добавление элемента на
вершину стека, удаление с вершины стека, и необходимо поддерживать
операции сложения, вычитания, умножения и целочисленного деления.
Операция сложения на стеке определяется следующим образом.
Со стека снимается верхний элемент (top1), затем снимается следующий
верхний элемент (top2), и затем как результат операции сложения на
вершину стека кладется элемент, равный top1 + top2.
Аналогичным образом определяются операции вычитания (top1 - top2),
умножения (top1 * top2) и целочисленного деления (top1 // top2).
Реализуйте эту структуру данных как класс ExtendedStack, отнаследовав
его от стандартного класса list.
Примечание Для добавления элемента на стек используется метод append,
а для снятия со стека – метод pop. Гарантируется, что операции будут
совершаться только когда в стеке есть хотя бы два элемента.
"""
class ExtendedStack(list):
def sum(self):
top1 = self.pop()
top2 = self.pop()
self.append(top1 + top2)
def sub(self):
top1 = self.pop()
top2 = self.pop()
self.append(top1 - top2)
def mul(self):
top1 = self.pop()
top2 = self.pop()
self.append(top1 * top2)
def div(self):
top1 = self.pop()
top2 = self.pop()
self.append(top1 // top2)
def m_1_6_3():
"""
Одно из применений множественного наследование – расширение
функциональности класса каким-то заранее определенным способом.
Например, если нам понадобится логировать какую-то информацию
при обращении к методам класса. Рассмотрим класс Loggable.
У него есть ровно один метод log, который позволяет выводить в лог
(в данном случае в stdout) какое-то сообщение, добавляя при этом
текущее время. Реализуйте класс LoggableList, отнаследовав его от
классов list и Loggable таким образом, чтобы при добавлении элемента
в список посредством метода append в лог отправлялось сообщение,
состоящее из только что добавленного элемента.
Примечание Ваша программа не должна содержать класс Loggable.
При проверке вашей программе будет доступен этот класс, и он будет
содержать метод log, описанный выше.
"""
# import time
class LoggableList(list, Loggable):
def append(self, object):
super().append(object)
self.log(object)