Advertisement
faunuss

working

Dec 1st, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.67 KB | None | 0 0
  1. #   Структура регулярного выражение
  2. class Token:
  3.     def __init__(self):
  4.         self.exp = ''   # Сам регулярное выражение
  5.         self.bit = set()    # Всевозможное количество букв x меньших, либо равных k
  6.  
  7.  
  8. def main(exp, letter, length):
  9.     # Избавляемся от пробельных символов
  10.     reg = "".join(exp.split(" "))
  11.     reg = "".join(reg.split("\n"))
  12.     reg = "".join(reg.split("\t"))
  13.     reg = list(reg)  # Представляем выражение в виде списка
  14.     stack = list()   # Заведем список токенов
  15.    
  16.     while len(reg) > 0:     # Перегоним выражение в токены по 1 символу
  17.         tmp = Token()
  18.         tmp.exp = reg.pop(0)
  19.         if tmp.exp == letter:
  20.             tmp.bit.add(1)
  21.         else:
  22.             tmp.bit.add(0)
  23.         stack.append(tmp)
  24.        
  25.     index = 0
  26.     while index < len(stack):
  27.         if len(stack) == 1:
  28.             break
  29.         if stack[index].token == '+' and len(stack[index].token) == 1:  # Сложение
  30.             left = stack[index-2]   # Левая часть
  31.             right = stack[index-1]  # Правая часть
  32.             stack[index].token = '(' + left.token + '+' + right.token + ')' # Построим новое
  33.             stack[index].bit = left.bit.union(right.bit)
  34.             stack.pop(index - 1)
  35.             stack.pop(index - 2)
  36.             index -= 2
  37.            
  38.         elif stack[index].token == '.' and len(stack[index].token) == 1:
  39.             left = stack[index-2]
  40.             right = stack[index-1]
  41.             tmp = set()
  42.             for left_element in left.bit:
  43.                 for right_element in right.bit:
  44.                     new_element = left_element+right_element
  45.                     if new_element <= length:
  46.                         tmp.add(left_element+right_element)
  47.             stack[index].token = '(' + left.token + right.token + ')'
  48.             stack[index].bit = tmp
  49.             stack.pop(index - 1)
  50.             stack.pop(index - 2)
  51.             index -= 2
  52.         elif stack[index].token == '*' and len(stack[index].token) == 1:
  53.             tmp = set()
  54.             tmp.add(0)
  55.             div = stack[index-1].bit
  56.             for j in range(length):
  57.                 if j in stack[index-1].bit:
  58.                     for e in div:
  59.                         for k in range(length):
  60.                             index_x = j+e*k
  61.                             if index_x <= length:
  62.                                 tmp.add(index_x)
  63.             stack[index-1].token = '(' + stack[index-1].token + ')' + '*'
  64.             stack[index-1].bit = tmp
  65.             stack.pop(index)
  66.             index -= 1
  67.         index += 1
  68.     if length in stack[0].bit:
  69.         print("YES")
  70.     else:
  71.         print("NO")
  72.     return
  73.    
  74.    
  75. if __name__ == "__main__":
  76.     a = input()
  77.     x = input()
  78.     try:
  79.         k = int(input())
  80.         main(a, x, k)
  81.     except ValueError:
  82.         print("Ожидалось число")
  83.         print('Выход программы')
  84.         exit()
  85.     except Exception as e:
  86.         print(str(e))
  87.         print('Выход программы')
  88.         exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement