Форум сайта python.su
75
EchoXSpaceИсправил.
Отредактировано Singularity (Янв. 19, 2013 20:36:56)
Офлайн
0
Сочетание
То, что больше - брать за k.
Да, это одно и тоже.
Отредактировано EchoXSpace (Янв. 19, 2013 21:36:22)
Офлайн
43
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
Офлайн
0
Спасибо!
Ну теперь буду разбирать, как это работает 
Как адаптировать под python3?
Отредактировано EchoXSpace (Янв. 20, 2013 12:19:46)
Офлайн
43
добавить
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))
Офлайн
43
нашел формулу с таблицей для сверки
Офлайн
0
Спасибо тебе 
Офлайн
43
да кстати, насколько я понял те результаты в таблице заголовок стобца которых с апострофом (не помню как нормально он называется) это с учетом “переворачивания” ожерелья, а которые без - те без учета. Так вот мои почему-то совпадают с теми которые без учета, и я не знаю почему
Офлайн
0
Хм, я делал “в лоб” c 4 цветами и 3 камнями - все норм, все правильно.
UPD: Уверен, что все правильно. Просто выведи верные результаты.
UPD2: Окей
Отредактировано EchoXSpace (Янв. 20, 2013 19:56:28)
Офлайн
43
да не, на самом деле ошибка. Вот так полностью совпадает
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)))
Офлайн