ЦЕЛЬ: Я пытаюсь найти максимальную длину списка, состоящего из неанаграмм, длиной N, каждое слово-анаграмма состоит из комбинации из 3 букв: «А», «В» или « C 's.
Например, если N = 5: [AAAAA, AAAAB, ..., AABB C, ..., BABAA, ..., CCCCC].
Чтобы уточнить, поскольку AAAAB является анаграммой AABAA и наоборот, они исключаются из списка вывода.
МОЯ ПРОБЛЕМА: Во-первых, я хотел бы знать, как произвести все 3 ^ 5 перестановок. Моя попытка:
import itertools
print([''.join(p) for p in itertools.combinations_with_replacement('abc', 3)])
>> ['aaaaa', 'aaaab', 'aaaac', 'aaabb', 'aaabc', 'aaacc', 'aabbb', 'aabbc', 'aabcc', 'aaccc', 'abbbb', 'abbbc', 'abbcc', 'abccc', 'acccc', 'bbbbb', 'bbbbc', 'bbbcc', 'bbccc', 'bcccc', 'ccccc']
Ясно, что список слишком длинен.
Я думал о разбиении, например,) 0As, 2Bs, 3Cs - это 0 + 2 + 3. Нахождение исчерпывающе вручную дало ответ 21 в течение минуты в этом примере. Фактически, я упростил процесс, заметив, что номер третьей буквы (скажем, C, без потери общности) зависит от комбинации As и Bs, поэтому я нарисовал таблицу - красный крест представляет недопустимую комбинацию, поскольку sum> = 5: = 5"> (Кстати, мне интересно, как эта идея распространяется на N> 3; поскольку при взгляде на стол квадрат разрезается пополам ...)
Чтобы перенести этот «алгоритм» на компьютер, я подумал о том, чтобы как-то использовать симметрии - это напоминало мне коды Грея - но я не могу правильно его реализовать.
Есть ли какие-нибудь функции, которые позаботятся об этом эффективно? Тогда мне даже не придется (по крайней мере, явно) вызывать функцию проверки анаграммы для сравнения входных данных.