Найти - Пользователи
Полная версия: Комбинаторика
Начало » Центр помощи » Комбинаторика
1 2 3
Singularity
EchoXSpace
Исправил.

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

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

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

Да, это одно и тоже.
sergeek
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
EchoXSpace
Спасибо!

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

Как адаптировать под python3?
sergeek
добавить
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))
sergeek
нашел формулу с таблицей для сверки
EchoXSpace
Спасибо тебе
sergeek
да кстати, насколько я понял те результаты в таблице заголовок стобца которых с апострофом (не помню как нормально он называется) это с учетом “переворачивания” ожерелья, а которые без - те без учета. Так вот мои почему-то совпадают с теми которые без учета, и я не знаю почему
EchoXSpace
Хм, я делал “в лоб” c 4 цветами и 3 камнями - все норм, все правильно.

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

UPD2: Окей
sergeek
да не, на самом деле ошибка. Вот так полностью совпадает
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)))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB