(А. Минак) Для составления цепочек используются бусины, помеченные буквами A, Б, В, Г, Д, Е, по следующим правилам: на первом месте в цепочке стоит одна из бусин A, Б, В, Г; на втором – любая согласная буква, если первая буква согласная, или любая гласная, если первая гласная; на третьем месте – одна из бусин Б, В, Д, Е, не стоящая в цепочке на первом или втором месте; на четвертом месте – любая согласная буква, не стоящая на втором или третьем месте. Алгоритм выполняется последовательно, генерируя новые цепочки в лексикографическом порядке. Вот начало списка:
1. ААБВ
2. ААБГ
3. ААБД
4. ААВБ
5. ААВГ
6. ААВД
7. ААДБ
8. ААДВ
9. ААДГ
10. ААЕБ
...
Под каким номером в списке будет цепочка бусин ГВЕД.
Вариант 1:
def f(s):
if len(s) == 4: ans.append(s); return 1
if len(s) == 1: return sum(f(s+x) for x in 'абвгде' if s in 'ае' and x in 'ае'\
or s in 'бвгд' and x in 'бвгд')
if len(s) == 2: return sum(f(s+x) for x in 'бвде' if x != s[0] and x != s[1])
if len(s) == 3: return sum(f(s+x) for x in 'бвгд' if x != s[1] and x != s[2])
ans = []
for s in 'абвг': f(s)
for i, c in enumerate(ans, 1):
if c == 'гвед': print(i); break
Вариант 2:
ans = []
for c1 in 'абвг':
if c1 == 'а':
for c2 in 'ае':
for c3 in 'бвде':
if c3 != c2 and c3 != c1:
for c4 in 'бвгд':
if c4 != c2 and c4 != c3:
ans.append(c1+c2+c3+c4)
else:
for c2 in 'бвгд':
for c3 in 'бвде':
if c3 != c2 and c3 != c1:
for c4 in 'бвгд':
if c4 != c2 and c4 != c3:
ans.append(c1+c2+c3+c4)
for i, s in enumerate(ans, 1):
if s == 'гвед':
print(i)
break