Задание 8 (демо-2023). Определите количество пятизначных чисел, записанных в восьмеричной системе счисления, в записи которых только одна цифра 6, при этом никакая нечётная цифра не стоит рядом с цифрой 6.

    Решение задания на языках PascalABC.NET и Python приведено ниже.

 

PascalABC.NET

##

var (count, ch):=(0, '024');

var s:='01234567'.Cartesian(5);

foreach var x in s do

 if (x.CountOf('6')=1) and (x[0]<>'0') then

 begin

  var i:=x.FindIndex(e->e='6');

    if ((i=0) and (x[1] in ch))or((i=4) and (x[3] in ch))or((i in (1..3))

        and (x[i-1] in ch) and (x[i+1] in ch)) then count+=1;

 end;

print(count);

Python

from itertools import product

count, ch=0, '024'

s = list(map(''.join, product('01234567',repeat=5)))

for x in s:

   if (x.count('6')==1)and(x[0]!='0'):

      i=x.index('6')

      if ((i==0)and (x[1] in ch))or((i==4)and (x[3] in ch))or ((0<i<4)and(x[i-1] in ch)and(x[i+1] in ch)):

                count+=1     

print(count)

 

    Исходя из условия, нужно как-то получить всевозможные пятизначные восьмеричные числа. В восьмеричную систему счисления входят цифры от нуля до семи включительно. Для получения всевозможных комбинаций этих цифр в виде пятизначных чисел, в PascalABC.NET к строке '01234567' применим функцию Cartesian(5).Чтобы также относительно кратко сделать в Python необходимо, во-первых, подключить библиотеку itertools для функции product, во-вторых, разобраться, что делает функции map, ''.join, list, последовательно их применить, и затем получить такой же результат.

    Первое различие, которое сразу видно – в Python нужно подключать дополнительную библиотеку, в то время как в PascalABC.NET нужные функции уже встроены.

    В обоих языках присутствует множественное присваивание переменным значений, отличие только в наличии слова var и скобок в PascalABC.NET.

    Далее в цикле перебираем все восьмеричные числа, причём сначала только те, которые не начинаются с нуля (тогда получится четырёхзначное число) и содержат одну цифру шесть (функции CountOf('6') и Count('6')).

    После этого для текущего числа найдём индекс цифры шесть, и с помощью длинного условия проверим, чтобы справа и слева от цифры стояли только чётные цифры (так как нечётные стоять не могут). Здесь отличие в языках только в одном: условие того, что цифра i принадлежит отрезку от 1 до 3, на языке Python выглядит как двойное условие 0<i<4, а на PascalABC.NET как принадлежность i последовательности (1..3).

    Если число удовлетворяет всем условиям, то изначально определённый счётчик count увеличивается на единицу.


Modifié le: lundi 22 mai 2023, 19:02