Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 6, 2014 15:45:50

Losyara
Зарегистрирован: 2014-12-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

Помогите найти k-тую в лексикографическом порядке правильную скобочную последовательность (Два типа - круглые и квадратные.) Без квадратных внутри круглых.

Отредактировано Losyara (Дек. 7, 2014 18:09:32)

Офлайн

#2 Дек. 7, 2014 01:21:44

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

Losyara
(2 типа скобок - () и ) без внутри ()
не понял, можно пример?



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Дек. 7, 2014 18:09:08

Losyara
Зарегистрирован: 2014-12-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

terabayt
не понял,
Извиняюсь. Два типа - круглые и квадратные. Без квадратных внутри круглых.

Офлайн

#4 Дек. 7, 2014 18:17:05

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

например есть строка

la[ba[g7(u8)og]fo]
и если в программе ввести 1, то выдаст
[ba[g7(u8)og]fo]
2 -
[g7(u8)og]
3 -
(u8)
4 и боьше - ошибка?
я правильно понял?



————————————————
-*- Simple is better than complex -*-

Офлайн

#5 Дек. 9, 2014 00:21:42

den4ik
Зарегистрирован: 2014-07-20
Сообщения: 59
Репутация: +  4  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

(\([^\[\(]\S\))

Офлайн

#6 Дек. 9, 2014 23:59:04

Losyara
Зарегистрирован: 2014-12-03
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

Вводится 2. Ответ: 2.

[ ] и ( )

Вводится 4. Ответ: 7.
 ( )[ ], [ ]( ), [ ( ) ], [ ][ ], ( ) ( ), [ [ ] ], ( ( ) ).   ( [ ] ) - не подходит. 

Офлайн

#7 Дек. 17, 2014 12:31:04

vax
Зарегистрирован: 2014-12-05
Сообщения: 10
Репутация: +  1  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

Решение будет примерно таким (оптимизация и исправление багов - задача для самостоятельного творчества ):

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



Python 3.4 Lover:)

Отредактировано vax (Дек. 17, 2014 12:32:09)

Офлайн

#8 Дек. 19, 2014 01:45:38

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Комбинаторика. Скобочные последовательности.

Такой вариант

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

Офлайн

#9 Дек. 19, 2014 21:33:02

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

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



————————————————
-*- Simple is better than complex -*-

Офлайн

#10 Дек. 19, 2014 21:58:02

kamisama
Зарегистрирован: 2014-07-08
Сообщения: 34
Репутация: +  4  -
Профиль   Отправить e-mail  

Комбинаторика. Скобочные последовательности.

terabayt
-*- Simple is better than complex -*-
что же ты делаешь, я клавиатуру чаем забрызгал

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version