Задания
Версия для печати и копирования в MS Word
Тип 8 № 73863
i

Джон со­став­ля­ет спи­сок всех воз­мож­ных кодов, со­став­лен­ных из за­глав­ных ла­тин­ских букв. Сна­ча­ла он вы­пи­сы­ва­ет в ал­фа­вит­ном по­ряд­ке все коды, со­сто­я­щие из од­но­го сим­во­ла (A, B, …, Z), затем  — тоже в ал­фа­вит­ном по­ряд­ке  — коды из двух сим­во­лов (AA, AB, …, AZ, BA, BB, … ZZ), далее идут трёхсим­воль­ные коды (AAA, AAB, …, ZZZ) и так далее.

Под каким но­ме­ром ока­жет­ся в этом спис­ке код FDECBA?

Спрятать решение

Ре­ше­ние.

При­ведём ана­ли­ти­че­ское Юрия Кра­силь­ни­ко­ва ре­ше­ние.

Слово FDECBA можно рас­смат­ри­вать как число 534210, за­пи­сан­ное в си­сте­ме счис­ле­ния по ос­но­ва­нию 26. Перед ним сле­ду­ют 26 слов длины 1, 262 слов длины 2, ..., 265 слов длины 5.

По­это­му ответ можно по­лу­чить с по­мо­щью сле­ду­ю­щей про­грам­мы:

print(int('534210',26)+1+sum(26**p for p in range(1,6)))

 Еди­ни­ца при­бав­ля­ет­ся по­то­му, что слову AAAAAA со­от­вет­ству­ет число 000000 со зна­че­ни­ем 0, но ну­ме­ра­ция слов в спис­ке на­чи­на­ет­ся с 1.

 

 

При­ведём ре­ше­ние на языке Python.

from itertools import product

 

count = 1

alf = sorted('QWERTYUIOPASDFGHJKLZXCVBNM')

for n in range(1,7):

for i in product(alf,repeat = n):

if "".join(i)=="FDECBA":

print(count)

break

count += 1

 

 

 

Ответ: 73206121.

 

При­ведём ре­ше­ние Сер­гея Донец на языке PascalABC.NET.

begin

var alf:='A'..'Z';

var count := 1;

// Под­счет всех ком­би­на­ций дли­ной от 1 до 5 сим­во­лов

for var n := 1 to 5 do

count+=alf.Cartesian(n).Count;

// Поиск среди ком­би­на­ций дли­ной 6 сим­во­лов

alf.Cartesian(6).ForEach( ar->

begin

if ar.JoinToString() = 'FDECBA' then

begin

Print(count); // 73206121

Halt;

end;

count += 1;

end );

end.