Применим функцию Cartesian к решению задачи на комбинаторику.
Перевод Cartesian (англ.) декартовский.
Задача. Настя составляет коды из букв слова НАСТЯ. Код должен состоять из 7 букв, буква Н должна встречаться в нём ровно два раза, буква А – как минимум один раз. Сколько различных кодов может составить Настя?
Для составления слов длины 7 Настя использует 5 различных букв. Количество таких слов будет равно:
5*5*5*5*5*5*5 = 57
Для вычисления такого произведения в PascalABC.NET используется функция Cartesian.
Зададим символьный массив c:
c:=Arr('Н','А','С','Т','Я')
Вычислим 7-ю декартову степень множества элементов, заданного массивом с:
c.Cartesian(7)
Циклом foreach x in c.Cartesian(7) do получим все символьные последовательности в виде массивов x. Склеим символы массива x в строку s:=x.JoinToString.
Выполним проверку условий и подсчитаем количество искомых слов.
Программа решения задачи на языке Паскаль
var c,x:array of char;
s:string;
k:integer;
begin
c:=Arr('Н','А','С','Т','Я');
k:=0;
foreach x in c.Cartesian(7) do
begin
s:=x.JoinToString;
if (s.CountOf('Н')=2) and (s.CountOf('А')>=1) then k+=1;
end;
print(k);
end.
Ответ: 16401
Демонстрация работы функции Cartesian
var c,x:array of char;
s:string;
begin
c:=Arr('Т','О','К');
foreach x in c.Cartesian(4) do
begin
s:=x.JoinToString;
print(s,',');
end;
end.
Вывод:
ТТТТ , ТТТО , ТТТК , ТТОТ , ТТОО , ТТОК , ТТКТ , ТТКО , ТТКК , ТОТТ , ТОТО , ТОТК , ТООТ , ТООО , ТООК , ТОКТ , ТОКО , ТОКК , ТКТТ , ТКТО , ТКТК , ТКОТ , ТКОО , ТКОК , ТККТ , ТККО , ТККК , ОТТТ , ОТТО , ОТТК , ОТОТ , ОТОО , ОТОК , ОТКТ , ОТКО , ОТКК , ООТТ , ООТО , ООТК , ОООТ , ОООО , ОООК , ООКТ , ООКО , ООКК , ОКТТ , ОКТО , ОКТК , ОКОТ , ОКОО , ОКОК , ОККТ , ОККО , ОККК , КТТТ , КТТО , КТТК , КТОТ , КТОО , КТОК , КТКТ , КТКО , КТКК , КОТТ , КОТО , КОТК , КООТ , КООО , КООК , КОКТ , КОКО , КОКК , ККТТ , ККТО , ККТК , ККОТ , ККОО , ККОК , КККТ , КККО , КККК
Всего таких слов: 34 = 81