Advertisement
kidig

Задачка - Перестройка предложения

Feb 15th, 2013
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.80 KB | None | 0 0
  1. # -*- coding: cp1251 -*-
  2. from random import randint
  3.  
  4.  
  5. def parse_parenthetic(text):
  6.     ''' Парсинг скобок любой вложенности из строки '''
  7.     stack = []
  8.  
  9.     for i, c in enumerate(text):
  10.         if c == '{':
  11.             stack.append(i)
  12.         elif c == '}' and stack:
  13.             start = stack.pop()
  14.  
  15.             # на выходе массив - уровень, текст внутри скобок, позиция_начала, позиция_окончания
  16.             yield (len(stack), text[start+1:i], start, i+1)
  17.  
  18.  
  19. def compile_text(text):
  20.     ''' Формирование текста путем раскрытия скобочек '''
  21.     blocks = list(parse_parenthetic(text))
  22.  
  23.     while blocks:
  24.         levels = {}
  25.  
  26.         # разбиваем найденые блоки по уровням
  27.         for i, block in enumerate(blocks):
  28.             level = block[0]
  29.             levels[level] = i
  30.  
  31.         # берем самый вложенный блок
  32.         maxl = max(levels.keys())
  33.         level, block_text, start, end = blocks[levels[maxl]]
  34.  
  35.         words = block_text.split('|')
  36.         random_word = words[randint(0, len(words)-1)]
  37.        
  38.         text = text[:start] + random_word + text[end:]
  39.        
  40.         blocks = list(parse_parenthetic(text))
  41.  
  42.     return text
  43.  
  44.  
  45.  
  46. def main():
  47.  
  48.     text = u"{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}."
  49.  
  50.     print "Original: %s\n" % (text)
  51.     print "Finish: %s\n" % (compile_text(text))
  52.  
  53.  
  54. if __name__ == "__main__":
  55.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement