// PascalABC.NET 3.2, сборка 1439 от 09.05.2017 // Внимание! Если программа не работает, обновите версию!
begin ReadlnString.MatchValues('\d+').Select(w->(w,w.Distinct .OrderBy(c->c).JoinIntoString(''))).GroupBy(t->t[1]) .Where(x->x.Count>1).Select(x->x.UnZipTuple.Item1. Select(x->x.ToInteger).Average).Println; end.
Пример это 3242 такая 181 вот 346 странная 432 1118 строка 1837 649.5
Как все это работает (функциональное программирование)
ReadlnString - считываем строку с клавиатуры
.MatchValues('\d+') - выбираем подстроки символов, состоящие из цифр
.Select(w->(w,w.Distinct.OrderBy(c->c).JoinIntoString(''))) - эта сложная конструкция сначала в каждой подстроке оставляет только разные цифры и сортирует их в порядке возрастания, затем соединяет эти цифры в строку и объединяет исходную подстроку с полученной строкой в так называемый кортеж. Полученный кортеж для каждой исходной подстроки содержит два элемента: саму подстроку и строку из уникальных цифр этой подстроки, расположенных по возрастанию.
.GroupBy(t->t[1]) - группирует кортежи в более крупные блоки так, чтобы каждый блок содержал кортежи, у которых второй элемент одинаков.
.Where(x->x.Count>1) - оставляет только те блоки, в которых больше одного кортежа, ведь нам не нужны "числа-одиночки"
.Select(x->x.UnZipTuple.Item1 - техническая операция, превращающая в каждом блоке кортеж в последовательность подстрок, представляющих исходные числа
.Select(x->x.ToInteger) - каждая такая последовательность подстрок превращается в последовательность целых чисел
.Average) - находятся средние арифметические каждой последовательности
.Println - вывод всех найденных значений.
Все это не так уж просто, но и задание далеко не тривиальное. Если записать его средствами "традиционного паскаля" - такого примерно, как Free Pascal, код будет огромным...
Const n=4; m=5; var a:array[1..n,1..m] of integer; i,j:integer; begin for i:=1 to n do begin for j:=1 to m do begin a[i,j]:=random(1000); write(a[i,j]:4); end; writeln; end; for i:=1 to n do for j:=1 to m do if (a[i,j] mod 7=0)and(a[i,j]>99)and(a[i,j]<1000) then a[i,j]:=a[i,j]-10; writeln('New:'); for i:=1 to n do begin for j:=1 to m do write(a[i,j]:4); writeln; end; end.