С клавиатуры вводится строка, состоящая из слов и чисел, разделенных одним

С клавиатуры вводится строчка, состоящая из слов и чисел, разбитых одним либо несколькими пробелами. Подсчитать среднее арифметическое всех чисел, которые состоят из одинаковых цифр.

Задать свой вопрос
1 ответ
// PascalABC.NET 3.2, сборка 1439 от 09.05.2017
// Внимание! Если программка не работает, обновите версию!

begin
  ReadlnString.MatchValues('\d+').Select(w-gt;(w,w.Distinct
      .OrderBy(c-gt;c).JoinIntoString(''))).GroupBy(t-gt;t[1])
      .Where(x-gt;x.Countgt;1).Select(x-gt;x.UnZipTuple.Item1.
      Select(x-gt;x.ToInteger).Average).Println;
end.

Пример
это   3242 такая 181 вот 346   странная  432  1118 строка
1837 649.5

Как все это работает (функциональное программирование)

ReadlnString - считываем строчку с клавиатуры

.MatchValues('\d+') - выбираем подстроки символов, состоящие из цифр

.Select(w-gt;(w,w.Distinct.OrderBy(c-gt;c).JoinIntoString(''))) - эта трудная конструкция поначалу в каждой подстроке оставляет только разные числа и сортирует их в порядке возрастания, потом объединяет эти числа в строку и соединяет начальную подстроку с приобретенной строчкой в так нарекаемый кортеж. Приобретенный кортеж для каждой исходной подстроки содержит два элемента: саму подстроку и строку из уникальных цифр этой подстроки, расположенных по возрастанию.

.GroupBy(t-gt;t[1]) - группирует кортежи в более большие блоки так, чтоб каждый блок содержал кортежи, у которых второй элемент одинаков.

.Where(x-gt;x.Countgt;1) - оставляет только те блоки, в которых больше одного кортежа, ведь нам не необходимы "числа-одиночки"

.Select(x-gt;x.UnZipTuple.Item1 - техническая операция, превращающая в каждом блоке кортеж в последовательность подстрок, представляющих начальные числа

.Select(x-gt;x.ToInteger) - любая такая последовательность подстрок превращается в последовательность целых чисел

.Average) - находятся средние арифметические каждой последовательности

.Println - вывод всех отысканных значений.

Все это не так уж просто, но и задание далековато не банальное. Если записать его средствами "традиционного паскаля" - такового приблизительно, как Free Pascal, код будет громадным...
, оставишь ответ?
Имя:*
E-Mail:


Добро пожаловать!

Для того чтобы стать полноценным пользователем нашего портала, вам необходимо пройти регистрацию.
Зарегистрироваться
Создайте собственную учетную запить!

Пройти регистрацию
Авторизоваться
Уже зарегистрированны? А ну-ка живо авторизуйтесь!

Войти на сайт