Уведомления

Группа в Telegram: @pythonsu

#1 Май 23, 2019 17:37:53

angree77
Зарегистрирован: 2019-04-24
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Други посоветуйте алгоритм для решения задачки

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

В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.

Вашей программе на вход подаются следующие запросы:

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 c будет являться None, потому что ни в пространстве foo, ни в его внешнем пространстве global не была объявлена переменная с.

Более формально, результатом работы get <namespace> <var> является

<namespace>, если в пространстве <namespace> была объявлена переменная <var>
get <parent> <var> – результат запроса к пространству, внутри которого было создано пространство <namespace>, если переменная не была объявлена
None, если не существует <parent>, т. е. <namespace> – это global
Формат входных данных
В первой строке дано число n (1 ≤ n ≤ 100) – число запросов.
В каждой из следующих 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
____________________________________
Понимание задачки есть, что решается через словарь, но не понятно что брать за ключ что за значения?
Решение выкладывать не надо, нужен только совет что взять за ключ что за значение?

Отредактировано angree77 (Май 23, 2019 17:40:54)

Офлайн

#2 Май 24, 2019 20:02:34

angree77
Зарегистрирован: 2019-04-24
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Други посоветуйте алгоритм для решения задачки

Лес рук и предложений как организовать словарь
Короче чтоб не парится не искать решил сделать так ключ по порядку ввода, значение - то что попадает из ввода:
add global a
create foo global
add foo b
get foo a
get foo c
create bar foo
add bar a
get bar a
таким образом убиваю трех зайцев одним выстрелом:
1. простота поиска команды (create, add, get)
2. простота поиска функции
3. простота поиска переменной
почему да очень просто: переменная в списке идет всегда под 2 индексом, нэймспэйс(функция) под 1 индексом, ну и комманды под 0 индексом, таким образом родился следующий кусок кода

def command(k, j=0):
return namespace[k][j]


def name(k, j=1):
return namespace[k][j]


def perem(k, j=2):
return namespace[k][j]


namespace = {}
n = int(input())
for i in range(n):
namespace[i] = input().split()
for key in range(n):
count = 0
if command(key) == 'get':
print(key, command(key), name(key), perem(key))
a = perem(key)
for ke in range(key-1, -1, -1):
if a == perem(ke) and command(ke) == 'add':
print(ke, name(ke), perem(ke))
break
if a != perem(ke): #счетчик для отсекания лишнего вывода None
count +=1
if count == key:
print('None')

Отредактировано angree77 (Май 24, 2019 21:18:27)

Офлайн

#3 Май 25, 2019 09:38:23

angree77
Зарегистрирован: 2019-04-24
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Други посоветуйте алгоритм для решения задачки

angree77
def command(k, j=0):
return namespace[k][j]


def name(k, j=1):
return namespace[k][j]


def perem(k, j=2):
return namespace[k][j]


namespace = {}
n = int(input())
for i in range(n):
namespace[i] = input().split()
for key in range(n):
count = 0
if command(key) == 'get':
print(key, command(key), name(key), perem(key))
a = perem(key)
for ke in range(key-1, -1, -1):
if a == perem(ke) and command(ke) == 'add':
print( name(ke))
break
if a != perem(ke): #счетчик для отсекания лишнего вывода None
count +=1
if count == key:
print('None')
Други помогите плз составить рекурсивную функцию для поиска из этого, поиск осуществляется по команде add совпадению name и совпадению perem(переменной)
если не нашла проверяем команду create куда входит функция, переменную из вхождения функции приравниваем к name и ищем также вхождение add уже для вхождения переменная остается той же
не совсем еще освоил рекурсивные функции

Отредактировано angree77 (Май 25, 2019 09:39:01)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version