From 96d449bfd81f254a3af4d4114ceea3ff7f7aeb50 Mon Sep 17 00:00:00 2001 From: Mikhalkovich Stanislav Date: Fri, 24 Mar 2023 23:16:49 +0300 Subject: [PATCH] =?UTF-8?q?LightPT=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20CheckOutputNew=20CheckOutputSeqNew?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Configuration/GlobalAssemblyInfo.cs | 2 +- Configuration/Version.defs | 4 +- Localization/DefaultLang.resources | Bin 100861 -> 101068 bytes Release/pabcversion.txt | 2 +- ReleaseGenerators/PascalABCNET_version.nsh | 2 +- bin/Lib/LightPT.pas | 131 +++++++++++++++++++++ 6 files changed, 136 insertions(+), 5 deletions(-) diff --git a/Configuration/GlobalAssemblyInfo.cs b/Configuration/GlobalAssemblyInfo.cs index 7e3fd7e22..b57aa09af 100644 --- a/Configuration/GlobalAssemblyInfo.cs +++ b/Configuration/GlobalAssemblyInfo.cs @@ -15,7 +15,7 @@ internal static class RevisionClass public const string Major = "3"; public const string Minor = "8"; public const string Build = "3"; - public const string Revision = "3253"; + public const string Revision = "3254"; public const string MainVersion = Major + "." + Minor; public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision; diff --git a/Configuration/Version.defs b/Configuration/Version.defs index 669af1f0a..9a071d781 100644 --- a/Configuration/Version.defs +++ b/Configuration/Version.defs @@ -1,4 +1,4 @@ -%MINOR%=8 -%REVISION%=3253 %COREVERSION%=3 +%REVISION%=3254 +%MINOR%=8 %MAJOR%=3 diff --git a/Localization/DefaultLang.resources b/Localization/DefaultLang.resources index b3f9dcae4cdd9d43a11531f2cbe71645a4feb04a..5f02f6c92e448727b8322e406657dbf58e609d44 100644 GIT binary patch delta 204 zcmex6neEI}wh0dyUu=AM+*dp`J+rtZwa76q#W_E(q$ocpAg44vGjB4Zg0M&sR8k=^ zFGT?=Jvoq3qCUvg-7`4EH7MTE&n4d3-!CM{-zPr6C)C~3FP@jn&(YV__Q0c0?>@YE z{@~k-|GZo-uEEYho&h1A{(i_3Rtk^4zI&qZ_Nl_7-|yeOe*5&T0xy@Fe~>Sx3A|jq YT>AP!rFkWpxv9zmF@3jwh0dyB{x1i?%Q1MzrEa_G1M9WiXsYy diff --git a/Release/pabcversion.txt b/Release/pabcversion.txt index 5e0599f05..207702e0d 100644 --- a/Release/pabcversion.txt +++ b/Release/pabcversion.txt @@ -1 +1 @@ -3.8.3.3253 +3.8.3.3254 diff --git a/ReleaseGenerators/PascalABCNET_version.nsh b/ReleaseGenerators/PascalABCNET_version.nsh index 955647ec1..30d48bca3 100644 --- a/ReleaseGenerators/PascalABCNET_version.nsh +++ b/ReleaseGenerators/PascalABCNET_version.nsh @@ -1 +1 @@ -!define VERSION '3.8.3.3253' +!define VERSION '3.8.3.3254' diff --git a/bin/Lib/LightPT.pas b/bin/Lib/LightPT.pas index bfe9882cd..26aa96805 100644 --- a/bin/Lib/LightPT.pas +++ b/bin/Lib/LightPT.pas @@ -1133,6 +1133,54 @@ begin DoNewLineBeforeMessage := False; end; +procedure CheckOutputNew(params arr: array of object); +begin + if (TaskResult = InitialTask) or (TaskResult = BadInitialTask) then + exit; + + var mn := Min(arr.Length, OutputList.Count); + + // Несоответствие типов или значений + var ind := -1; + for var i := 0 to mn - 1 do + begin + // Если типы не совпадают + if arr[i].GetType <> OutputList[i].GetType then + begin + ind := i; // то запомнить индекс первого несовпадения + if ind > InitialOutputList.Count then + ColoredMessage('Часть выведенных данных правильная',MsgColorGray); + raise new OutputTypeException(i + 1, TypeName(arr[i]), TypeName(OutputList[i])); + end; + // Если значения не совпадают + if not CompareValues(arr[i], OutputList[i]) then + begin + ind := i; // то запомнить индекс первого несовпадения + if ind > InitialOutputList.Count then + begin + ColoredMessage('Часть выведенных данных правильная',MsgColorGray); + ColoredMessage($'Элемент {i + 1}: ожидалось значение {arr[i]}, а выведено {OutputList[i]}',MsgColorGray); + end; + TaskResult := BadSolution; + exit; + end; + end; + if ind = -1 then + ind := mn; + + if arr.Length <> OutputList.Count then + begin + if (ind = mn) and (ind<>0) then + ColoredMessage('Все выведенные данные правильны',MsgColorGray) + else if ind > 0 then + ColoredMessage('Часть выведенных данных правильная',MsgColorGray); + raise new OutputCountException(OutputList.Count, arr.Length); + end; + TaskResult := Solved; +end; + + + function NValues(n: integer): string; begin case n of @@ -1490,6 +1538,89 @@ begin end; end; +function Char2Str(c: char): string; +begin + if (c = #10) or (c = #13) then + Result := '''ПереходНаНовуюСтроку''' + else Result := '''' + c + ''''; +end; + +procedure CheckOutputString(str: string); +begin + if (TaskResult = InitialTask) or (TaskResult = BadInitialTask) then + exit; + var ostr := OutputString.ToString; + var mn := Min(str.Length, ostr.Length); + + var ind := -1; + for var i := 1 to mn do + begin + if str[i] <> ostr[i] then + begin + ind := i; + ColoredMessage($'Элемент {i}: ожидался символ {Char2Str(str[i])}, а выведен символ {Char2Str(ostr[i])}',MsgColorGray); + TaskResult := BadSolution; + exit; + end; + end; + if ind = -1 then + ind := mn; + + if str.Length <> ostr.Length then + begin + if (ind = mn) and (ind<>0) then + ColoredMessage('Все выведенные данные правильны',MsgColorGray) + else if ind > 0 then + ColoredMessage('Часть выведенных данных правильная',MsgColorGray); + raise new OutputCountException(ostr.Length, str.Length); + end; + + TaskResult := Solved; +end; + + +procedure CheckOutputSeqNew(a: sequence of integer) := CheckOutputNew(ToObjArray(a.ToArray)); +procedure CheckOutputSeqNew(a: sequence of real) := CheckOutputNew(ToObjArray(a.ToArray)); +procedure CheckOutputSeqNew(a: sequence of string) := CheckOutputNew(ToObjArray(a.ToArray)); +procedure CheckOutputSeqNew(a: sequence of char) := CheckOutputNew(ToObjArray(a.ToArray)); +procedure CheckOutputSeqNew(a: sequence of boolean) := CheckOutputNew(ToObjArray(a.ToArray)); +procedure CheckOutputSeqNew(a: sequence of object) := CheckOutputNew(a.ToArray); +procedure CheckOutputSeqNew(a: ObjectList) := CheckOutputNew(a.lst.ToArray); +procedure CheckOutputSeqNew(a: sequence of word) := CheckOutputSeqNew(a.Select(x->object(x))); + +type + IntAr = array of integer; + RealAr = array of real; + IntAr2 = array [,] of integer; + RealAr2 = array [,] of real; + +function FlattenElement(x: object): List; +begin + var lst := new List; + if x is IntAr (var iarr) then + lst.AddRange(iarr.Select(x -> object(x))) + else if x is RealAr (var rarr) then + lst.AddRange(rarr.Select(x -> object(x))) + else if x is IntAr2 (var iarr) then + lst.AddRange(iarr.ElementsByRow.Select(x -> object(x))) + else if x is RealAr2 (var rarr) then + lst.AddRange(rarr.ElementsByRow.Select(x -> object(x))) + else if x is List (var larr) then + lst.AddRange(larr.Select(x -> object(x))) + else if x is List (var lrarr) then + lst.AddRange(lrarr.Select(x -> object(x))) + else lst.Add(x); + Result := lst; +end; + +procedure FlattenOutput; +begin + // если в OutputList массивы, вытянуть их в единый список + OutputList := OutputList.SelectMany(x -> FlattenElement(x)).ToList; +end; + + + procedure WriteInfoToDatabases(LessonName,TaskName,TaskPlatform: string; TaskResult: TaskStatus; AdditionalInfo: string := ''); begin try