На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> - строка, состоящая не более чем из 20 символов, <Имя> — строка, состоящая не более чем из 15 символов, <оценки> - через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 2 4
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена неуспевающих учеников (имеющих по результатам экзаменов хотя бы одну двойку), располагая их в порядке уменьшения числа двоек.
##Приведём решение на языке Pascal.
var р:array[1..100] of record
name:string;
sum:integer;
end;
с:char;
i,j,N,m:integer;
begin
readln(N);
for i:=l to N do
begin
p[i].name:= ' ';
repeat
read(c);
p[i].name:=p[i].name+c
until c=' ';
repeat
read(с);
p[i].name:=p[i].name+c
until c=' ';
p[i].sum:=0;
for j:=1 to 3 do
begin
read(m);
if m=2 then p[i].sum:=p[i].sum+1
end;
readln;
end;
for i:=1 to N do
if p[i].sum=3 then writeln(p[i].name);
for i:=1 to N do
if p[i].sum=2 then writeln(p[i].name);
for i:=1 to N do
if p[i].sum=1 then writeln(p[i].name)
end.
Приведём решение Сергея Донец на языке PascalABC.NET.
function IsTwo(c: string):= (c = '2') ? 1 : 0;
begin
var n:=ReadlnInteger;
var u:=new string[n];
for var i:=0 to n-1 do
u[i]:=ReadlnString;
u.Select(x -> x.Split(' ')).ToArray
.Where(s -> (2..4).Sum(i -> IsTwo(s[i]) ) > 0)
.OrderByDescending(s-> (2..4).Sum(i-> IsTwo(s[i]) ))
.PrintLines(\(a,b)->a+' '+b);
end.

