This commit is contained in:
miks1965 2015-08-27 21:15:46 +03:00
parent 05f80f6486
commit fadb078b01
4 changed files with 161 additions and 0 deletions

43
TestSuite/LinqObj36.pas Normal file
View file

@ -0,0 +1,43 @@
uses
PT4, PT4Linq;
begin
Task('LinqObj36');
System.Threading.Thread.CurrentThread.CurrentCulture :=
new System.Globalization.CultureInfo('en-US');
var res := ReadAllLines(ReadString)
.Select(s ->
begin
var ss := s.Split();
result := new class
(
N := integer.Parse(ss[0]),
D := double.Parse(ss[2]),
F := ss[1]
);
end)
.GroupBy(s -> (s.N - 1) mod 36 div 4 + 1, (k, ss) -> new class
(
P := k,
Info := ss.Where(s -> s.D <= ss.Average(s1 -> s1.D))
))
// òàê íå êîìïèëèðóåòñÿ
.SelectMany(s -> s.Info.Select(s1 -> new class
(
P := s.P,
F := s1.F,
N := s1.N,
D := s1.D
)))
.OrderBy(s -> s.P).ThenBy(s -> s.D)
.Select(e -> e.P + ' ' + e.D.ToString('F2') + ' ' + e.F + ' ' + e.N);
WriteAllLines(ReadString, res);
(* // òàê òîæå íå êîìïèëèðóåòñÿ
.SelectMany(e -> e.Info)
.OrderBy(e -> (e.N - 1) mod 36 div 4 + 1).ThenBy(e -> e.D)
.Select(e -> ((e.N - 1) mod 36 div 4 + 1) + ' ' + e.D.ToString('F2') + ' ' + e.F + ' ' + e.N);
WriteAllLines(ReadString, res);
*)
end.

42
TestSuite/LinqObj40.pas Normal file
View file

@ -0,0 +1,42 @@
uses PT4, PT4Linq;
(*
При решении задач группы LinqObj доступны следующие
дополнительные методы, определенные в модуле PT4Linq:
ReadAllLines(name) - функция, которая возвращает последовательность строк,
содержащихся в текстовом файле с имененм name;
WriteAllLines(name, seq) - процедура, которая записывает в текстовый файл
с именем name последотвальеность строк seq;
Show() и Show(cmt) (методы расширения) - отладочная печать
последовательности, cmt - строковый комментарий;
Show(e -> str) и Show(cmt, e -> str) (методы расширения) -
отладочная печать строковых значений str, полученных
из элементов e последовательности, cmt - строковый комментарий.
*)
begin
Task('LinqObj40');
var res := ReadAllLines(ReadString)
.Select(s ->
begin
var ss := s.Split();
result := new class
(
C := ss[0],
M := integer.Parse(ss[2]),
P := integer.Parse(ss[3]),
S := ss[1]
);
end)
.GroupBy(s -> s.S, (k, ss) -> new class
(
S := k,
C := Range(0,2).Select(i -> ss.Count(s -> s.M = 92+i*3))
))
.OrderBy(e -> e.S)
.Select(e -> e.S + e.C.Aggregate('', (seed, s) -> seed + ' ' + s));
WriteAllLines(ReadString, res);
end.

25
TestSuite/LinqObj43.pas Normal file
View file

@ -0,0 +1,25 @@
uses PT4, PT4Linq;
begin
Task('LinqObj43');
var m := ReadInteger;
var res := ReadAllLines(ReadString)
.Select(s ->
begin
var ss := s.Split();
result := new class
(
C := ss[3],
M := integer.Parse(ss[1]),
P := integer.Parse(ss[0]),
S := ss[2]
)
end)
.GroupBy(s1 -> s1.C, (k, ss) -> new class
(
Comp := k,
C := ss.Where(s2 -> s2.M = m)
))
end.

51
TestSuite/LinqObj61.pas Normal file
View file

@ -0,0 +1,51 @@
uses PT4, PT4Linq;
(*
При решении задач группы LinqObj доступны следующие
дополнительные методы, определенные в модуле PT4Linq:
ReadAllLines(name) - функция, которая возвращает последовательность строк,
содержащихся в текстовом файле с имененм name;
WriteAllLines(name, seq) - процедура, которая записывает в текстовый файл
с именем name последотвальеность строк seq;
Show() и Show(cmt) (методы расширения) - отладочная печать
последовательности, cmt - строковый комментарий;
Show(e -> str) и Show(cmt, e -> str) (методы расширения) -
отладочная печать строковых значений str, полученных
из элементов e последовательности, cmt - строковый комментарий.
*)
// Абрамян М.Э. ТЕХНОЛОГИЯ LINQ НА ПРИМЕРАХ. М.: ДМК-Пресс, 2014.
// Глава 6. Примеры решения задач из группы LinqObj
// 6.2. Более сложные задания на обработку отдельных последовательностей
// LinqObj61: правильное решение (с.199-200)
begin
// === ОШИБКА КОМПИЛЯЦИИ ===
Task('LinqObj61');
var subjects : array of string := ( 'Алгебра', 'Геометрия', 'Информатика' );
var culture := new System.Globalization.CultureInfo('en-US');
var r := ReadAllLines(ReadString)
.Select(e ->
begin
var s := e.Split(' ');
result := new class
(
name := s[0] + ' ' + s[1],
subj := s[3],
mark := StrToInt(s[4])
);
end)
.GroupBy(e -> e.name, (k, ee) -> new class
(
name := k,
avrs := subjects
.GroupJoin(ee, s -> s, e -> e.subj,
(s1, ee1) -> ee1.Select(e1 -> e1.mark)
.DefaultIfEmpty().Average())
))
.OrderBy(e -> e.name)
.Select(e -> e.name + e.avrs.Aggregate('',
(a, d) -> a + ' ' + d.ToString('f2', culture)));
WriteAllLines(ReadString, r);
end.