Исправлена Range(a, b, step: real)
LightPT - CheckOutput может принимать параметры типа последователльность - они будут вытягиваться в одну последовательность Для этого исправлен FlattenElement FlattenOutput применяется автоматически - его теперь не надо вызывать явно TaskLoops поправлен и упрощен в соответствии с CheckOutput
This commit is contained in:
parent
008a2eddfe
commit
bd7059c079
|
|
@ -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; // хоть один тест неудачный - выходим!
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue