Задание 8
Задание 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 увеличивается на единицу.