Исправлена Range(a, b, step: real)

LightPT - CheckOutput может принимать параметры типа последователльность - они будут вытягиваться в одну последовательность
  Для этого исправлен FlattenElement
  FlattenOutput применяется автоматически - его теперь не надо вызывать явно
TaskLoops поправлен и упрощен в соответствии с CheckOutput
This commit is contained in:
Mikhalkovich Stanislav 2024-06-30 12:41:37 +03:00
parent 008a2eddfe
commit bd7059c079
4 changed files with 151 additions and 101 deletions

View file

@ -169,7 +169,10 @@ procedure CheckInput(a: array of System.Type);
procedure CheckOutput(params arr: array of object);
/// Проверить значения при выводе. Сообщения ColoredMessage гасить. Нужно для повторных вызовов CheckOutput
procedure CheckOutputSilent(params arr: array of object);
/// Проверить значения при выводе
procedure CheckOutput(a: ObjectList);
/// Проверить значения при выводе. Сообщения ColoredMessage гасить. Нужно для повторных вызовов CheckOutput
procedure CheckOutputSilent(a: ObjectList);
/// Проверить, что данные не вводились
procedure CheckInputIsEmpty;
@ -943,7 +946,8 @@ begin
end;
/// надо ли пополнять список ввода в функциях, используемых для ввода
function NeedAddDataToInputList: boolean := IsLightPT and ((TestMode = tmNone) or (TestMode = tmAutoTest));
function NeedAddDataToInputList: boolean
:= IsLightPT and ((TestMode = tmNone) or (TestMode = tmAutoTest));
/// Полный путь к папке auth-файла
function FindAuthDat: string;
@ -1720,6 +1724,11 @@ end;
/// Возвращает случайное целое в диапазоне от a до b
function Random(a, b: integer): integer;
begin
// Есть три состояния:
// 1. Вызов в основной программе (первый запуск) - TestMode = tmNone
// 2. Вызов в основной программе (последующие запуски) - TestMode = tmTest
// 3. Вызов в функции GenerateTestData - TestMode = tmGenTest - тогда срабатывает обычная ArrRandomInteger
// как и в случае 1.
if TestMode = tmTest then
Result := InputList.ReadTestDataInt // считать следующее данное из заполненного в GenTestMode InputList
else Result := PABCSystem.Random(a, b);
@ -1885,17 +1894,13 @@ begin
// Есть три состояния:
// 1. Вызов в основной программе (первый запуск) - TestMode = tmNone
// 2. Вызов в основной программе (последующие запуски) - TestMode = tmTest
// 3. Вызов в функции GenerateTestData - TestMode = tmGenTest - это только в состоянии TestMode = True
{if GenTest then
begin
Result := PABCSystem.ArrRandomInteger(n, a, b); // приходится вызывать дважды!
exit;
end;}
// 3. Вызов в функции GenerateTestData - TestMode = tmGenTest - тогда срабатывает обычная ArrRandomInteger
// как и в случае 1.
if TestMode = tmTest then
Result := InputList.ReadTestDataIntArr(n)
else Result := PABCSystem.ArrRandomInteger(n, a, b);
if NeedAddDataToInputList then // IsLightPT and (TestMode = tmNone)
if NeedAddDataToInputList then // IsLightPT and ((TestMode = tmNone) or (TestMode = tmAutoTest))
for var i:=0 to n-1 do
InputList.Add(Result[i]);
end;
@ -2139,23 +2144,42 @@ begin
CreateNewLineBeforeMessage := False;
end;
procedure CheckOutputHelper(i0: integer; params arr: array of object);
procedure OutputTestResult;
function FlattenElement(x: object): List<object>;
begin
var res := new List<object>;
if x is IEnumerable<object> (var xen) then
foreach var ob in xen do
res.AddRange(FlattenElement(ob))
else if x is System.Collections.IEnumerable (var xx) then
begin
ColoredMessage($'Основной запуск верный',MsgColorGray);
ColoredMessage($'Ошибочное решение на тесте:',MsgColorOrange);
ColoredMessage($'Тестовые данные : {InputList.JoinToString}',MsgColorGray);
ColoredMessage($'Полученный результат : {OutputList.JoinToString}',MsgColorGray);
if i0 = 0 then
ColoredMessage($'Правильный результат : {arr.JoinToString}',MsgColorGray)
else ColoredMessage($'Правильный результат : {(OutputList[:i0]+arr).JoinToString}',MsgColorGray)
end;
var en := xx.GetEnumerator;
while en.MoveNext do
res.Add(en.Current)
end
else res.Add(x);
Result := res;
end;
procedure OutputTestResult(i0: integer; arr: array of object);
begin
ColoredMessage($'Основной запуск верный',MsgColorGray);
ColoredMessage($'Ошибочное решение на тесте:',MsgColorOrange);
ColoredMessage($'Тестовые данные : {InputList.JoinToString}',MsgColorGray);
ColoredMessage($'Полученный результат : {OutputList.JoinToString}',MsgColorGray);
if i0 = 0 then
ColoredMessage($'Правильный результат : {arr.JoinToString}',MsgColorGray)
else ColoredMessage($'Правильный результат : {(OutputList[:i0]+arr).JoinToString}',MsgColorGray)
end;
procedure CheckOutputHelper(i0: integer; params arr: array of object);
begin
if (TaskResult = InitialTask) and CancelMessagesIfInitial
or (TaskResult = BadInitialTask) then
exit;
// SSM 28.06.24 - вытягиваем в линию выходные данные
arr := arr.SelectMany(x -> FlattenElement(x)).ToArray;
// Если мы попали сюда, то OutputList.Count >= InitialOutputList.Count
var mn := Min(arr.Length, OutputList.Count - i0);
@ -2167,7 +2191,7 @@ begin
then
begin
if TestNumber > 0 then
OutputTestResult
OutputTestResult(i0,arr)
else
begin
if i > InitialOutputList.Count then
@ -2181,7 +2205,7 @@ begin
if i >= InitialOutputList.Count then // ? Если первое данное неправильное - всё равно попадаем сюда!!!
begin
if TestNumber > 0 then
OutputTestResult
OutputTestResult(i0,arr)
else
begin
if i > InitialOutputList.Count then
@ -2199,7 +2223,7 @@ begin
if arr.Length <> OutputList.Count - i0 then
begin
if TestNumber > 0 then
OutputTestResult
OutputTestResult(i0,arr)
else
if OutputList.Count > 0 then begin
if arr.Length > OutputList.Count - i0 then // выведено меньше чем надо
@ -2218,6 +2242,8 @@ begin
CheckOutputHelper(0,arr);
end;
procedure CheckOutput(a: ObjectList) := CheckOutputSeq(a);
procedure CheckOutputSilent(params arr: array of object);
begin
Silent := True;
@ -2225,6 +2251,8 @@ begin
Silent := False;
end;
procedure CheckOutputSilent(a: ObjectList) := CheckOutputSeqSilent(a);
procedure CheckOutputAfterInitial(params arr: array of object);
begin
CheckOutputHelper(InitialOutputList.Count,arr);
@ -2311,7 +2339,7 @@ type
IntAr2 = array [,] of integer;
RealAr2 = array [,] of real;
function FlattenElement(x: object): List<object>;
{function FlattenElement(x: object): List<object>;
begin
var lst := new List<object>;
if x is IntAr (var iarr) then
@ -2328,7 +2356,7 @@ begin
lst.AddRange(lrarr.Select(x -> object(x)))
else lst.Add(x);
Result := lst;
end;
end;}
procedure FlattenOutput;
begin
@ -2634,6 +2662,7 @@ begin
TName := ConvertTaskName(TaskName);
TestMode := tmNone;
TestNumber := 0;
FlattenOutput; // SSM 28.06.24
CheckTask(TName); // может выдавать сообщения, предваряющие неверное решение, в CheckOutput.
if {not IsPT and not IsRobot and not IsDrawMan and} (TestCount > 0) then // То это LightPT - т.к. только в LightPT TestCount м.б. > 0
begin
@ -2660,6 +2689,7 @@ begin
//InputList := InputList;
//OutputList := OutputList;
FlattenOutput; // SSM 28.06.24 - и перед каждым тестом
CheckTask(TName);
if TaskResult = BadSolution then
break; // хоть один тест неудачный - выходим!

View file

@ -5215,7 +5215,34 @@ begin
raise new System.ArgumentException('step = 0');
if (step > 0) and (b < a) or (step < 0) and (b > a) then
exit;
var n := Round(Abs(b - a) / step);
if a = b then
begin
yield a;
exit;
end;
// SSM 30/06/24
// Шкалируем [a,b] к отрезку [0,1]
var stepScaled := decimal(step) / (decimal(a) - decimal(b));
if stepScaled < 0 then
stepScaled := -stepScaled;
// Находим n - количество частей (левая точка последней части может не входить)
var n := decimal.ToInt32(decimal.Round(1/stepScaled));
//Println('-->',stepScaled,n);
// Возможны 3 ситуации:
// 1) - stepScaled * n < 1 - 1e-14 - тогда надо делать n+1 шаг
// 2) - stepScaled * n и диапазоне [1 - 1e-14, 1 + 1e-14] - тогда надо делать n+1 шаг и последнюю точку примагничивать к b
// 3) - stepScaled * n > 1 + 1e-14 - тогда надо делать n шагов
// Сделаем n шагов, а потом решим, делать ли последний шаг
for var i:=0 to n-1 do
yield a + i * step; // нельзя просто прибавлять step - при больших a,b они просто не будут меняться
var delta := decimal(1e-14); // относительная погрешность относительно 1
if (stepScaled * n >= 1 - delta) and (stepScaled * n <= 1 + delta) then
yield b // вернуть ровно b - то, ради чего всё затевалось
else if stepScaled * n < 1 - delta then
yield a + n * step; // что ж, step задан неверно и мы "не долетаем" до b
// Если "перелетаем" b, то ничего и не возвращаем на конце
// Старый алгоритм
{var n := Round(Abs(b - a) / step);
var delta := n / Abs(b - a) * 1e-14;
var bplus := b + delta;
var bminus := b - delta;
@ -5238,7 +5265,7 @@ begin
end;
if a > bminus then
yield b;
end
end}
end;
function ArrRandom(n: integer; a: integer; b: integer): array of integer;

View file

@ -10,7 +10,7 @@ begin
case name of
'LoopErr2': begin
TaskResult := ErrFix;
TaskResult := ErrFix; // Это задача на исправление ошибок. Откомпилировалась 1 раз - и внеслась в базу
if OutputString.ToString = '*' then
ColoredMessage('Сотри ; после do!',MsgColorGray);
if OutputString.ToString = '*'*50 then
@ -24,48 +24,43 @@ begin
ColoredMessage('Молодец! Если в цикле - несколько действий, окайми их операторными скобками begin-end',MsgColorGray);
end;
'Loop_Arithm1': begin
ClearOutputListFromSpaces;
var n := 10;
CheckData(InitialOutput := |cInt|*n);
CheckOutputAfterInitialSeq(ArrGen(n,1,i->i+2));
CheckOutputAfterInitial(ArrGen(n,1,i->i+2));
end;
'Loop_Arithm2': begin
ClearOutputListFromSpaces;
CheckData(Input := Empty);
var sq := ObjectList.New.AddArithm(10,19,-2).AddArithm(9,1.1,0.1);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'For1': begin
ClearOutputListFromSpaces;
CheckData(Empty);
TaskResult := InitialTask;
ColoredMessage('Что лучше в данном случае: цикл loop или цикл for?',msgColorGray);
end;
'For1a': begin
ClearOutputListFromSpaces;
var n := 10;
CheckData(InitialOutput := |cInt|*n);
var sq := ObjectList.New.AddArithm(10,2,2).AddArithm(10,2,2);
CheckOutputSeq(sq);
var sq := ObjectList.New.AddArithm(n,2,2).AddArithm(n,2,2);
CheckOutput(sq);
end;
'For1b': begin
ClearOutputListFromSpaces;
var n := 10;
CheckData(InitialOutput := |cInt|*n);
var sq := ObjectList.New.AddArithm(10,1,2).AddArithm(10,1,2);
CheckOutputSeq(sq);
var sq := ObjectList.New.AddArithm(n,1,2).AddArithm(n,1,2);
CheckOutput(sq);
end;
'For1b_step': begin
ClearOutputListFromSpaces;
CheckData(Empty);
var sq := ObjectList.New.AddArithm(10,2,2).AddArithm(10,1,2);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'For1c': begin
ClearOutputListFromSpaces;
CheckData(Empty);
var sq := ObjectList.New.AddArithm(11,15,-1);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'For1d': begin
ClearOutputListFromSpaces;
@ -77,13 +72,13 @@ begin
ClearOutputListFromSpaces;
CheckData(Empty);
var sq := ObjectList.New.AddArithm(10,5,5).AddArithm(7,40,-4);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'For1f': begin
ClearOutputListFromSpaces;
CheckData(Empty);
var sq := ObjectList.New.AddArithm(9,1.9,-0.1).AddArithm(9,1.9,-0.1);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'ForErr1': begin
TaskResult := ErrFix; // Задание на исправление ошибок
@ -121,35 +116,30 @@ begin
'Tabl1': begin
CheckData(InitialOutput := |cInt|*20);
var sq := (1..10).SelectMany(x -> |x,x*x,x*x*x|);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'Tabl2': begin
CheckData(Empty);
var sq := (1..10).SelectMany(x -> |object(x),object(sqrt(x))|); // приводим к object поскольку типы разные
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'Tabl4': begin
CheckData(Empty);
var sq := PartitionPoints(1.1,1.9,8).SelectMany(x -> |x,x*x|);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'Sum1': begin
FilterOnlyNumbers;
// Частичные решения не проработаны. Они крайне редки конечно
TaskResult := PartialSolution; // Решение состоит в последовательном решении нескольких родственных задач
FilterOnlyNumbers;
//CheckInitialOutputValues(55);
if (OutputList.Count = 1) and OutIsInt(0) then
begin
var a := OutInt(0);
if a=4905 then
ColoredMessage('Отлично! Теперь найдите сумму квадратов всех двузначных чисел', MsgColorGray)
else if a=328065 then
TaskResult := Solved;
end;
if CompareValuesWithOutput(4905) then // CompareValuesWithOutput используется именно для частичного решения
ColoredMessage('Отлично! Теперь найдите сумму квадратов всех двузначных чисел', MsgColorGray)
else if CompareValuesWithOutput(328065) then
TaskResult := Solved;
end;
'Sum1a': begin
FilterOnlyNumbers;
CheckData(Input := |cInt|*2);
CheckData(Input := cInt*2);
var (a,b) := (Int(0),Int(1));
TestCount := 10;
GenerateTestData := tnum -> begin
@ -177,6 +167,8 @@ begin
'Prod1': begin
TaskResult := PartialSolution;
FilterOnlyNumbers;
// CompareValuesWithOutput - более низкоуровневая чем CheckOutput
// Она просто сравнивает значения с выводом и возвращает True/False
if CompareValuesWithOutput(3*3*3*3*3*3*3) then
ColoredMessage('Вычислите 4 в степени 6', MsgColorGray)
else if CompareValuesWithOutput(4*4*4*4*4*4) then
@ -200,7 +192,7 @@ begin
FilterOnlyNumbers;
CheckData(InitialOutput := |cInt|*11);
var sq := ObjectList.New.AddGeom(15,1,3);
CheckOutputAfterInitialSeq(sq);
CheckOutputAfterInitial(sq);
end;
'Geom2': begin
FilterOnlyNumbers;
@ -209,7 +201,7 @@ begin
sq.Add(integer.MaxValue);
if OutputList.Count = 11 then
ColoredMessage('Выведите integer.MaxValue - самое большое целое типа integer',MsgColorMagenta);
CheckOutputSeqNew(sq);
CheckOutput(sq);
end;
'Geom3': begin
FilterOnlyNumbers;
@ -218,13 +210,13 @@ begin
sq.Add(real.MaxValue);
if OutputList.Count = 20 then
ColoredMessage('Выведите real.MaxValue - самое большое целое типа real',MsgColorMagenta);
CheckOutputSeqNew(sq);
CheckOutput(sq);
end;
'Geom4': begin
FilterOnlyNumbers;
CheckData(Empty);
var sq := ObjectList.New.AddGeom(8,1.0,0.999);
CheckOutputSeq(sq);
CheckOutput(sq);
end;
'Loop_If_1': begin
FilterOnlyNumbersAndBools;
@ -233,7 +225,7 @@ begin
GenerateTests(10,tInt(1,100)*n);
var a := IntArr(n);
CheckOutputSeq(a.Where(x->x.IsEven));
CheckOutput(a.Where(x->x.IsEven));
end;
'Loop_If_2': begin
var n := 10;
@ -253,7 +245,7 @@ begin
for var i:=0 to n-1 do
if Int(i) in 10..99 then
lst.Add(Int(i));
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Loop_If_2a': begin
var n := 10;
@ -263,7 +255,7 @@ begin
for var i:=0 to n-1 do
if Int(i).Divs(3) and Int(i).NotDivs(5) then
lst.Add(Int(i));
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Loop_If_3': begin
FilterOnlyNumbersAndBools;
@ -274,7 +266,7 @@ begin
for var i:=1 to n do
if i.IsEven then
lst.Add(Int(i-1));
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Loop_If_4': begin
FilterOnlyNumbersAndBools;
@ -285,7 +277,7 @@ begin
for var i:=0 to n-1 do
if Int(i).IsEven then
lst.Add(i+1);
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Loop_If_5_Count': begin
var n := 10;
@ -312,8 +304,8 @@ begin
FilterOnlyNumbersAndBools;
var n := 10;
CheckData(Input := |cInt|*n);
var c := 0;
GenerateTests(10,tInt(1,10)*n);
var c := 0;
for var i:=0 to n-1 do
if Int(i) not in 2..5 then
c += 1;
@ -362,7 +354,7 @@ begin
FilterOnlyNumbers;
CheckData(InitialOutput := |cInt|*18);
CheckOutputSeq(Arr(1..9)*3);
CheckOutput(Arr(1..9)*3);
end;
'Wh2': begin
FilterOnlyNumbers;
@ -372,7 +364,7 @@ begin
'Wh3': begin
FilterOnlyNumbers;
CheckData(Empty);
CheckOutputSeq(ArrGen(45,99,x->x-2));
CheckOutput(ArrGen(45,99,x->x-2));
end;
'Дюймы1': begin
FilterOnlyNumbers;
@ -393,7 +385,6 @@ begin
'Дюймы4': begin
FilterOnlyNumbers;
CheckData(Input := cRe * 2);
CheckData(Input := cRe * 2);
CheckOutput(Re(0) - Trunc(Re(0)/Re(1)));
end;
'Sum1W': begin
@ -414,7 +405,7 @@ begin
'Умножение1': begin
FilterOnlyNumbers;
CheckData(Empty);
CheckOutputSeq(ArrGen(14,1,x->x*2));
CheckOutput(ArrGen(14,1,x->x*2));
end;
'Умножение2': begin
FilterOnlyNumbers;
@ -424,11 +415,11 @@ begin
еление1': begin
FilterOnlyNumbers;
CheckData(Empty);
CheckOutputSeq(ArrGen(6,26.5,x->x/2));
CheckOutput(ArrGen(6,26.5,x->x/2));
end;
еление2': begin
FilterOnlyNumbers;
CheckInitialOutputSeq(Arr(cInt)*0);
CheckData(Empty);
CheckOutput(7);
end;
'Digits': begin
@ -439,7 +430,7 @@ begin
'Bank_ForLeaders': begin
FilterOnlyNumbers;
CheckData(Empty);
CheckOutputSeq(ArrGen(9,109000.0,x->x*1.09));
CheckOutput(ArrGen(9,109000.0,x->x*1.09));
end;
'Digits1': begin
FilterOnlyNumbers;
@ -492,7 +483,7 @@ begin
L.Add(x mod 2);
x := x div 2;
end;
CheckOutputSeq(L.ToArray);
CheckOutput(L);
end;
'BinNumSystem2': begin
FilterOnlyNumbers;
@ -518,23 +509,24 @@ begin
end;
'Min1': begin
CheckData(InitialInput := |cRe|*2);
Generatetests(10,tRe(1,100)*2);
GenerateTests(10,tRe(1,100)*2);
CheckOutput(Min(Re(0),Re(1)),Max(Re(0),Re(1)));
end;
'Min2': begin
CheckData(InitialInput := |cRe|*2);
Generatetests(10,tRe(1,100)*2);
GenerateTests(10,tRe(1,100)*2);
CheckOutput(Min(Re(0),Re(1)));
end;
'Min3': begin
CheckData(InitialInput := |cRe|*3);
Generatetests(10,tRe(1,100)*3);
GenerateTests(10,tRe(1,100)*3);
CheckOutput(Min(Re(0),Re(1),Re(2)));
end;
'SeriesMin2': begin
var n := 10;
CheckData(Input := |cInt|*n);
GenerateTests(10,tInt(1,100)*n);
// Лучше var a := IntArr(n)
CheckOutput(InputListAsIntegers.Max - InputListAsIntegers.Min)
end;
'Break1': begin
@ -615,9 +607,9 @@ begin
if x < 5 then
c += 1;
until False;
TestCount := 10;
TestCount := 10; // Это немного неудобно - надо не забыть присвоить!
GenerateTestData := tnum -> begin
var n := Random(7,12);
var n := Random(7,12); // Разобраться, как работает в Test mode
var a := ArrRandomInteger(n,1,10);
a[^1] := 0;
InputList.AddTestData(a);
@ -635,6 +627,7 @@ begin
c += x;
until False;
TestCount := 10;
//CheckData(Input := |cInt|*i);
GenerateTestData := tnum -> begin
var n := Random(7,12);
var a := ArrRandomInteger(n,1,10);
@ -667,6 +660,7 @@ begin
CheckOutputString((9*'*'+#13#10) * 5);
end;
'сс2': begin
// Уже можно использовать многострочную строку! Но лень переписывать. Работает.
CheckOutputString(9*'1'+#13#10 + 9*'2'+#13#10 + 9*'3'+#13#10 + 9*'4'+#13#10 + 9*'5'+#13#10)
end;
'сс3': begin
@ -762,7 +756,6 @@ begin
CheckOutputString(sb.ToString);
end;
'Combinations': begin
ClearOutputListFromSpaces;
CheckData(Empty);
var lst := ObjectList.New;
for var c := 'a' to 'z' do
@ -771,7 +764,7 @@ begin
lst.Add(c);
lst.Add(i);
end;
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Primes': begin
FilterOnlyNumbersAndBools;
@ -789,12 +782,12 @@ begin
if IsPrime then
lst.Add(n);
end;
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'Счастливые билеты': begin
FilterOnlyNumbersAndBools;
CheckData(Empty);
CheckOutputNew(55252);
CheckOutput(55252);
end;
'1_ПрямоугольныеТреугольники': begin
FilterOnlyNumbers;
@ -805,11 +798,11 @@ begin
for var c:=1 to 20 do
if (a*a + b*b = c*c) and (a<b) then
lst.AddRange(|a,b,c|);
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'2_Перебор вариантов': begin
CheckData(Empty);
CheckOutputSeq(Arr(4,6,12,3));
CheckOutput(4,6,12,3);
end;
'ДесятичныеЧисла': begin
FilterOnlyNumbers;
@ -823,7 +816,7 @@ begin
if (d1 + d2 + d3).Divs(3) and (d1<d2) and (d2<d3) then
lst.Add(a);
end;
CheckOutputSeq(lst);
CheckOutput(lst);
end;
'ДвоичныеЧисла': begin
FilterOnlyNumbers;
@ -836,7 +829,7 @@ begin
var a := d1*4 + d2*2 + d3;
Lst.AddRange(|d1,d2,d3,a|);
end;
CheckOutputSeq(lst);
CheckOutput(lst);
end;
end;

View file

@ -6,14 +6,14 @@ var AllTaskNames: array of string;
procedure CheckTaskT(name: string);
begin
FlattenOutput; // Во всех задачах на массивы
ClearOutputListFromSpaces; // Это чтобы a.Print работал. По идее, надо писать всегда. Яне знаю задач, где пробелы в ответе
//FlattenOutput; // Это теперь делается автоматически до вызова CheckTask
ClearOutputListFromSpaces; // Это чтобы a.Print работал. По идее, надо писать всегда. Я не знаю задач, где пробелы в ответе
case name of
'Arr1','Arr2': begin
FilterOnlyNumbersAndBools;
CheckData(InitialOutput := |cInt|*5);
CheckOutputSeq(|cInt|*10);
CheckData(InitialOutput := cInt*5);
CheckOutputSeq(|cInt|*10); // Это еще и типы проверяет. Бывает, что только типы и надо проверить
// Надо проверить, что Output[9] - целое ненулевое
if OutputList.Count<10 then // чтобы не получить исключение
exit;
@ -71,7 +71,7 @@ begin
CheckData(|cInt|*n, |cInt|*(n+1), |cInt|*n);
var a := IntArr(n);
var p := integer(a.Product);
var p := integer(a.Product); // потому что ученик будет вычислять в вещественной переменной
CheckOutputAfterInitial(p)
end;
'Arr_Sum3': begin
@ -259,7 +259,7 @@ begin
var ind2 := arr.IndexOf(2);
var ind5 := arr.IndexOf(5);
Swap(arr[ind2],arr[ind5]);
CheckOutputAfterInitialSeq(arr);
CheckOutputAfterInitial(arr);
end;
'Arr_Index4': begin
FilterOnlyNumbersAndBools;
@ -348,33 +348,33 @@ begin
FilterOnlyNumbersAndBools;
CheckData(Input := nil);
CheckOutputSeq(ArrFill(10,1));
CheckOutput(ArrFill(10,1));
end;
'Arr_Fill2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := nil);
CheckOutputSeq(ArrFill(10,1));
CheckOutput(ArrFill(10,1));
end;
'Заполнение1','ЗаполнениеЛямбда1': begin
FilterOnlyNumbersAndBools;
CheckData(Input := Empty);
CheckOutputSeq(ArrGen(10,i->i*i));
CheckOutput(ArrGen(10,i->i*i));
end;
'Заполнение2','ЗаполнениеЛямбда2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := Empty);
CheckOutputSeq(ArrGen(10,1,i->i+2));
CheckOutput(ArrGen(10,1,i->i+2));
end;
'ЗаполнениеПоПред1','ЗаполнениеПоПред2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := Empty);
CheckOutputSeq(ArrGen(10,5,i->i+5));
CheckOutput(ArrGen(10,5,i->i+5));
end;
'ЗаполнениеГеом1','ЗаполнениеГеом2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := Empty);
CheckOutputSeq(ArrGen(10,1,i->i*2));
CheckOutput(ArrGen(10,1,i->i*2));
end;
'ЗаполнениеСумма1': begin
FilterOnlyNumbersAndBools;
@ -398,7 +398,7 @@ begin
foreach var i in a.Indices do
if i.IsOdd then
a[i] := 0;
CheckOutputAfterInitialSeq(a);
CheckOutputAfterInitial(a);
end;
'Arr_Reverse1','Arr_Reverse2': begin