Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
- create <namespace> <parent> – создать новое пространство имен с именем <namespace> внутри пространства <parent>
- add <namespace> <var> – добавить в пространство <namespace> переменную <var>
- get <namespace> <var> – получить имя пространства, из которого будет взята переменная <var> при запросе из пространства <namespace>, или None, если такого пространства не сущет
Рассмотрим набор запросов
- add global a
- create foo global
- add foo b
- create bar foo
- add bar a
Структура пространств имен описанная данными запросами будет эквивалентна структуре пространств имен, созданной при выполнении данного кода
a = 0 def foo(): b = 1 def bar(): a = 2
В основном теле программы мы объявляем переменную a, тем самым добавляя ее в пространство global. Далее мы объявляем функцию foo, что влечет за собой создание локального для нее пространства имен внутри пространстваglobal. В нашем случае, это описывается командой create foo global. Далее мы объявляем внутри функции fooфункцию bar, тем самым создавая пространство bar внутри пространства foo, и добавляем в bar переменную a.
Добавим запросы get к нашим запросам
- get foo a
- get foo c
- get bar a
- get bar b
Представим как это могло бы выглядеть в коде
a = 0
def foo():
b = 1
get(a)
get(c)
def bar():
a = 2
get(a)
get(b)
Результатом запроса get будет имя пространства, из которого будет взята нужная переменная.
Например, результатом запроса get foo a будет global, потому что в пространстве foo не объявлена переменная a, но в пространстве global, внутри которого находится пространство foo, она объявлена. Аналогично, результатом запроса get bar b будет являться foo, а результатом работы get bar a будет являться bar.
Например, результатом запроса get foo a будет global, потому что в пространстве foo не объявлена переменная a, но в пространстве global, внутри которого находится пространство foo, она объявлена. Аналогично, результатом запроса get bar b будет являться foo, а результатом работы get bar a будет являться bar.
Результатом get foo c будет являться None, потому что ни в пространстве foo, ни в его внешнем пространстве global не была объявлена переменная с.
Более формально, результатом работы get <namespace> <var> является
- <namespace>, если в пространстве <namespace> была объявлена переменная <var>
- get <parent> <var> – результат запроса к пространству, внутри которого было создано пространство<namespace>, если переменная не была объявлена
- None, если не существует <parent>, т. е. <namespace> – это global
Формат входных данных
В первой строке дано число n (1 ≤ n ≤ 100) – число запросов.
В каждой из следующих n строк дано по одному запросу.
Запросы выполняются в порядке, в котором они даны во входных данных.
Имена пространства имен и имена переменных представляют из себя строки длины не более 10, состоящие из строчных латинских букв.
В каждой из следующих n строк дано по одному запросу.
Запросы выполняются в порядке, в котором они даны во входных данных.
Имена пространства имен и имена переменных представляют из себя строки длины не более 10, состоящие из строчных латинских букв.
Формат выходных данных
Для каждого запроса get выведите в отдельной строке его результат.
Sample Input:
9 add global a create foo global add foo b get foo a get foo c create bar foo add bar a get bar a get bar b
Sample Output:
global None bar foo
Решение:
class nmspc(list):names = {"global": ["None"],"None":[]}
def create(self, space, parent):
self.names[parent].append(space)
self.names[space] = [parent]
def add(self, space, var):
self.names[space].append(var)
def get(self, space, var):
if space == "None":
return
if var in self.names[space]:
print(space)
return
elif self.names[space][0] != "None":
self.get(self.names[space][0], var)
return
else:
print("None")
return
a = nmspc()
n = int(input())
for i in range(n):
s = input().split()
if s[0] == "add":
a.add(s[1], s[2])
elif s[0] == "create":
a.create(s[1], s[2])
else:
a.get(s[1], s[2])
Спасибо! А я так и не понял, как к ней подступиться.
ВідповістиВидалитиВся магия в рекурсивной функции get() ...
Видалитии форматах данных, которые были обговорены участниками курса ..
Slot Machines Online - JTGHub
ВідповістиВидалитиIn Slot 정읍 출장마사지 Machines Online, players can 서울특별 출장마사지 choose from a range 서울특별 출장샵 of games ranging from standard slot machines to video poker, 목포 출장샵 video poker, bingo and so 사천 출장샵 on.