[4]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.1. Поэлементные операции
// LinqBegin4: правильное решение - 1 вариант (с.126)
begin
  Task('LinqBegin4');
  var c := ReadChar;
  var a := ReadSeqString;
  try
    var r := a.SingleOrDefault(e -> (e.Length <> 0) and (e[e.Length] = c));
    write(r <> nil ? r : '');
  except
    write('Error');
  end;
end.
[15]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.2. Операция агрегирования и генерирование последовательностей
// LinqBegin15: правильное решение - 2 вариант (с.134, внизу)
begin
  Task('LinqBegin15');
  var n := ReadInteger;
  var f := Range(1, n)
    .Aggregate(1.0, (a, e) -> a * e);
  write(f);
end.
[31]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.3. Фильтрация, сортировка, теоретико-множественные операции
// LinqBegin31: правильное решение - 1 вариант (с.145)
begin
  Task('LinqBegin31');
  var k := ReadInteger;
  var a := ReadSeqString;
  var b := a.Take(k).Show('B');
  var c := a.Reverse()
    .TakeWhile(e ->not char.IsDigit(e[e.Length])).Show('C');
  b.Intersect(c).Show('D')
    .OrderBy(e -> e.Length).ThenBy(e -> e)
    .WriteAll;
end.
[43]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.4. Проецирование
// LinqBegin43: правильное решение с отладочной печатью (с.151, внизу)
begin
  Task('LinqBegin43');
  var k := ReadInteger;
  ReadSeqString
    .SelectMany((e, n) ->
       e.Where((c, i) -> i mod 2 = (n < k ? 0 : 1)).Show())
    .Reverse
    .WriteAll;
end.
[52]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.5. Объединение
// LinqBegin52: правильное решение - 1 вариант (с.159, середина)
begin
  Task('LinqBegin52');
  var a := ReadSeqString()
    .Where(e -> char.IsDigit(e[e.Length])).Show('A');
  var b := ReadSeqString()
    .Where(e -> char.IsDigit(e[e.Length])).Show('B');
  a.SelectMany(e1 -> b.Select(e2 -> e1 + '=' + e2))
    .OrderBy(e -> e.Split('=')[0])
    .ThenByDescending(e -> e.Split('=')[1])
    .WriteAll;
end.
[54]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.5. Объединение
// LinqBegin54: правильное решение (с.170, середина)
begin
  Task('LinqBegin54');
  ReadSeqString().GroupJoin(ReadSeqString(),
      e -> e[1], e -> e[1],
      (e1, ee2) -> ee2.DefaultIfEmpty('')
    .Select(e -> e1 + '.' + e))
    .SelectMany(e -> e).OrderBy(e -> e).Show()
    .WriteAll;
end.
[60]
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 5. Примеры решения задач из группы LinqBegin
//     5.6. Группировка
// LinqBegin60: правильное решение - 1 вариант (с.175, внизу)
begin
  Task('LinqBegin60');
  ReadSeqString().GroupBy(e -> e[1])
    .OrderByDescending(e -> e.Sum(s -> s.Length)).ThenBy(e -> e.Key)
    .Select(e -> e.Sum(s -> s.Length) + '-' + e.Key)
    .WriteAll;
end.



