Форум сайта python.su
Помогите найти k-тую в лексикографическом порядке правильную скобочную последовательность (Два типа - круглые и квадратные.) Без квадратных внутри круглых.
Отредактировано Losyara (Дек. 7, 2014 18:09:32)
Офлайн
Losyaraне понял, можно пример?
(2 типа скобок - () и ) без внутри ()
Офлайн
terabaytИзвиняюсь. Два типа - круглые и квадратные. Без квадратных внутри круглых.
не понял,
Офлайн
например есть строка
la[ba[g7(u8)og]fo]
[ba[g7(u8)og]fo]
[g7(u8)og]
(u8)
Офлайн
(\([^\[\(]\S\))
Офлайн
Вводится 2. Ответ: 2.
[ ] и ( )
( )[ ], [ ]( ), [ ( ) ], [ ][ ], ( ) ( ), [ [ ] ], ( ( ) ). ( [ ] ) - не подходит.
Офлайн
Решение будет примерно таким (оптимизация и исправление багов - задача для самостоятельного творчества ):
def filter_f(var): open_l = set('[(') if var[0] not in open_l: return False if var[-1] in open_l: return False kvadrat_i = 0 circle_i = 0 for index, item in enumerate(var): if item == '[': if circle_i <= 0: kvadrat_i += 1 else: return False elif item == ']': if var[index-1] == '(': return False kvadrat_i -= 1 elif item == '(': circle_i += 1 elif item == ')': circle_i -= 1 if kvadrat_i < 0 or circle_i < 0: return False if kvadrat_i != 0 or circle_i != 0: return False return True def calc(num): vars = itertools.product(('[',']','(',')'), repeat=num) return list(filter(filter_f, vars)) def calc2(num): vars = itertools.product(('[',']','(',')'), repeat=num) return [''.join(var) for var in filter(filter_f, vars)] print(calc(4))
Отредактировано vax (Дек. 17, 2014 12:32:09)
Офлайн
Такой вариант
import itertools def foo(num): lst = [] if num <= 0 or num % 2: return lst for i in itertools.product(('[',']','(',')'), repeat=num): i = ''.join(list(i)) try: assert i.find('([') == i.find('])') == -1 eval(i.replace(')(', '),(').replace('][', '],[').replace('](', '],(').replace(')[', '),[')) lst.append(i) except: pass return lst res = foo(6) print(len(res)) print(', '.join(res))
Офлайн
n, l = 6, [''] for k in range(n/2): l = reduce(lambda x,y: x+y, reduce(lambda x,y: x+y, [[[(i[:j] + h + i[j:]) for h in ['[]', '()']] for j in range(len(i)+1)] for i in l])) n = filter(lambda x: '([' not in x and '])' not in x,set(l)) print(str(len(n)) + '\n' + ', '.join([i for i in n]))
Офлайн
terabaytчто же ты делаешь, я клавиатуру чаем забрызгал
-*- Simple is better than complex -*-
Офлайн