субота, 16 квітня 2016 р.

java palindrome function

/**
 * Checks if given <code>text</code> is a palindrome.
 *
 * @param text any string
 * @return <code>true</code> when <code>text</code> is a palindrome, <code>false</code> otherwise
 */
public static boolean isPalindrome(String text) {
String tmp = text.toLowerCase().replaceAll("[^a-zа-я0-9]", "");
StringBuilder t =  new StringBuilder(tmp).reverse();
return tmp.equals(t.toString());
}

Stepic.org 1.4 Пространства имён и области видимости – Шаг 8



Реализуйте программу, которая будет эмулировать работу с пространствами имен. Необходимо реализовать поддержку создания пространств имен и добавление в них переменных.
В данной задаче у каждого пространства имен есть уникальный текстовый идентификатор – его имя.
Вашей программе на вход подаются следующие запросы:
  • 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
Решение:

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])

Stepic.org 1.6 Наследование классов – Шаг 7




Вам дано описание наследования классов в следующем формате. 
<имя класса 1> : <имя класса 2> <имя класса 3> ... <имя класса k
>
Это означает, что класс 1 отнаследован от класса 2класса 3, и т. д.

Или эквивалентно записи:
class Class1(Class2, Class3 ... ClassK):
    pass
Класс A является прямым предком класса B, если B отнаследован от A:
class B(A):
    pass


Класс A является предком класса B, если 
  • A = B;
  • A - прямой предок B
  • существует такой класс C, что - прямой предок B и A - предок C

Например:
class B(A):
    pass

class C(B):
    pass

# A -- предок С


Вам необходимо отвечать на запросы, является ли один класс предком другого класса

Важное примечание:
Создавать классы не требуется.
Мы просим вас промоделировать этот процесс, и понять существует ли путь от одного класса до другого.

Формат входных данных

В первой строке входных данных содержится целое число n - число классов.
В следующих n строках содержится описание наследования классов. В i-й строке указано от каких классов наследуется i-й класс. Обратите внимание, что класс может ни от кого не наследоваться. Гарантируется, что класс не наследуется сам от себя (прямо или косвенно), что класс не наследуется явно от одного класса более одного раза.
В следующей строке содержится число q - количество запросов.
В следующих q строках содержится описание запросов в формате <имя класса 1> <имя класса 2>.
Имя класса – строка, состоящая из символов латинского алфавита, длины не более 50.

Формат выходных данных

Для каждого запроса выведите в отдельной строке слово "Yes", если класс 1 является предком класса 2, и "No", если не является. 
Sample Input:
4
A
B : A
C : A
D : B C
4
A B
B D
C D
D A
Sample Output:
Yes
Yes
Yes
No
Решение:
from collections import deque

def bfs(g, start):
    queue, enqueued = deque([(None, start)]), set([start])
    while queue:
        parent, n = queue.popleft()
        yield parent, n
        new = set(g[n]) - enqueued
        enqueued |= new
        queue.extend([(n, child) for child in new ])

def shortest_path(g, start, end):
    paths = {None : []}
    for parent, child in bfs(g, start):
        paths[child] = paths[parent] + [child]
        if child == end:
            return paths[child]
    return None
# поиск в ширину был найден на сайте аннимона
classes = {}
n = int(input())
for i in range(n):
    tmp = input()
    tmp = tmp.replace(":"," ").split()
#    print(tmp)
    classes[tmp[0]] = [] if len(tmp) == 1 else tmp[1:]
homeless = []
for i in classes.values():
    for j in i:
        if j not in classes.keys():
            homeless.append(j)
for i in homeless: classes[i] = []
fullclasses = []
for i in classes.items():
    fullclasses.append(i[0])
    for j in i[1]:
        fullclasses.append(j)
#print(classes)
#print(fullclasses)
n = int(input())
for i in range(n):
    l, r = input().split()
    if l == r:
        print("Yes")
    elif l not in fullclasses or r not in fullclasses:
        print("No")
    elif shortest_path(classes, r, l) == None:
        print("No")
    else:
        print("Yes")