Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2013 20:35:09

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Комбинаторика

EchoXSpace
Исправил.

Если “Камни можно свободно двигать по нитке” значит,
'aab', ‘aba’, ‘baa’ <= одно и тоже ?

Все таки формулу вывести правильней.

Отредактировано Singularity (Янв. 19, 2013 20:36:56)

Офлайн

#2 Янв. 19, 2013 21:20:33

EchoXSpace
Зарегистрирован: 2013-01-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика

Сочетание

То, что больше - брать за k.

Да, это одно и тоже.

Отредактировано EchoXSpace (Янв. 19, 2013 21:36:22)

Офлайн

#3 Янв. 20, 2013 11:23:28

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Комбинаторика

import string
from itertools import product
def count_neck(n,k):
    make_neck = (neck for neck in product(string.hexdigits[:k],repeat=n))
    assert 0 < n*k < 33
    class Necklace:
        def __init__(self):
            self.neck = next(make_neck)
        def __eq__(self,other):            
            return hash(self) == hash(other) or self.neck == tuple(reversed(other.neck))
        def __hash__(self):
            return reduce(lambda x,y : x*int(''.join(self.neck[y:] + self.neck[:y]),k),range(n),1)
    return len({Necklace() for num in range(k**n)}) if n > 1 else k

Офлайн

#4 Янв. 20, 2013 12:05:14

EchoXSpace
Зарегистрирован: 2013-01-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика

Спасибо!

Ну теперь буду разбирать, как это работает

Как адаптировать под python3?

Отредактировано EchoXSpace (Янв. 20, 2013 12:19:46)

Офлайн

#5 Янв. 20, 2013 12:36:33

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Комбинаторика

добавить

from functools import reduce
но это не надо так как я там ошибся . Вот проще без изъебств
import string
from itertools import product
def count_neck(n,k):
    assert 0 < n*k < 33
    s = set()
    res = 0
    for neck in product(string.ascii_letters[:k],repeat=n):
        if neck not in s:
            res +=1
            for m in range(n):
                s.add(neck[m:] + neck[:m])
            s.add(tuple(reversed(neck)))
    return res
            
print(count_neck(5,2))

Офлайн

#6 Янв. 20, 2013 13:59:05

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Комбинаторика

нашел формулу с таблицей для сверки

Офлайн

#7 Янв. 20, 2013 14:10:14

EchoXSpace
Зарегистрирован: 2013-01-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика

Спасибо тебе

Офлайн

#8 Янв. 20, 2013 14:30:15

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Комбинаторика

да кстати, насколько я понял те результаты в таблице заголовок стобца которых с апострофом (не помню как нормально он называется) это с учетом “переворачивания” ожерелья, а которые без - те без учета. Так вот мои почему-то совпадают с теми которые без учета, и я не знаю почему

Офлайн

#9 Янв. 20, 2013 16:01:39

EchoXSpace
Зарегистрирован: 2013-01-19
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Комбинаторика

Хм, я делал “в лоб” c 4 цветами и 3 камнями - все норм, все правильно.

UPD: Уверен, что все правильно. Просто выведи верные результаты.

UPD2: Окей

Отредактировано EchoXSpace (Янв. 20, 2013 19:56:28)

Офлайн

#10 Янв. 20, 2013 16:18:12

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Комбинаторика

да не, на самом деле ошибка. Вот так полностью совпадает

import string
from itertools import product
def count_neck(n,k):
    assert 0 < n*k < 33
    s = set()
    res = 0
    for neck in product(string.ascii_letters[:k],repeat=n):
        if neck not in s:
            res +=1
            for m in range(n):
                shifted = neck[m:] + neck[:m]
                s.add(shifted)
                s.add(tuple(reversed(shifted)))
    return res
for k in range(2,4):
    for n in range(1,16):
        print('{} {} --> {}'.format(n,k,count_neck(n,k)))

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version