Все пятибуквенные слова, составленные из букв С, Т, Р, О, К, А, записаны в алфавитном порядке и пронумерованы.
Вот начало списка:
1. ААААА
2. ААААК
3. ААААО
4. ААААР
5. ААААС
6. ААААТ
...
Определите, под каким номером в этом списке стоит последнее слово с чётным номером, которое не начинается с букв А, С или Т и при этом содержит в своей записи ровно две буквы О.
Примечание. Слово — последовательность идущих подряд букв, не обязательно осмысленная.
Приведём аналитическое решение Александра Козлова.
Переписываем буквы заданного слова в алфавитном порядке — «АКОРСТ».
Кодируя каждую букву в шестеричную систему счисления, получаем код 0123456. Согласно условиям, он не может начинаться с цифр 0, 5 и 6.
Кроме того, код должен быть пятизначным и находиться на последнем месте, что подразумевает, что это может быть только 35555.
Также учтем, что в коде должно быть ровно две буквы О, то есть два числа 2. Это приводит нас к выводу, что кодовое слово не может превышать 35522.
Анализируя первую строку шестеричного кода 00000 с номером 1 в десятичной системе счисления, мы понимаем, что для преобразования кода строки в её номер необходимо добавить единицу.
Таким образом, чтобы получить максимальный номер строки, можно написать программу на Python:
Перестановкой двоек и пятерок мы находим нужный номер:
print(int('35252',6) + 1). Результат — 5073.
print(int('35225',6) + 1). Результат — 5058.
print(int('32255',6)+1). Результат — 4428.
Исследуя результаты приходим к выводу, что нам подходит только 5058.
Приведём решение на языке Python.
from itertools import product
count = 0
sp = []
for s in product(sorted("СТРОКА"), repeat = 5):
count += 1
if count % 2 == 0 and s.count("О") == 2 and s[0] not in ('АСТ'):
sp.append(count)
print(max(sp))
Ответ: 5058.
Приведём другое решение на языке Python.
alf = 'АКОРСТ'
count = 0
otv = []
for x1 in alf:
for x2 in alf:
for x3 in alf:
for x4 in alf:
for x5 in alf:
s = x1+x2+x3+x4+x5
count += 1
if count % 2 == 0 and s.count("О") == 2 and s[0] not in ('АСТ'):
otv.append(count)
print(max(otv))
Ответ: 5058.
Приведём решение Александра Козлова на языке Python.
from itertools import product
sp = []
for s in product('012345', repeat = 5):
p = (''.join(s))
if (int(p,6)+1)%2 == 0 and s.count('2') == 2 and s[0] not in ('045'):
sp.append(int(p,6)+1)
print(max(sp))
Приведём решение Александра Козлова на языке Python.
def f(x):
s = ''
while x:
s = str(x%6)+s
x = x//6
return s
for i in range(int('35522',6),0,-1):
if (int(str(f(i)),6)+1)%2 == 0 and str(f(i)).count('2') == 2 and str(f(i)).count('5') == 2:
print(i+1)
break
Приведём решение Александра Козлова на языке Python.
from itertools import product
sp = [int(p, 6) + 1 for p in (''.join(s) for s in product('35522', repeat=5)) \
if (int(p, 6) + 1) % 2 == 0 and p.count('2') == 2 and p.count('5') == 2 and p[0] == '3']
print(max(sp))
Приведём решение Сергея Донец на языке PascalABC.NET.
begin
'СТРОКА'.ToCharArray.Order.JoinToString // 'АКОРСТ'
.CartesianPower(5).Numerate
.Where(\(n,s) -> (n mod 2 = 0)) // Четный номер
.Where(\(n,s) -> s[1] not in 'АСТ') // Не начинается на А, С, Т
.Where(\(n,s) -> s.CountOf('О') = 2) // Ровно две буквы О
.Last
.Print;
end.

