Автор |
Сообщение |
07.04.2017 19:58:36
Тема: Ошибка в чекере
|
Александр Керножицкий
Темы: 1
Сообщений: 3
Мой профиль
|
Вот в этой задаче, кажется, ошибка в чекере. Моя программа выдает на всех тестах ответ один в один с правильным выходным файлом (проверял локально и здесь на сервере, в онлайн-редакторе). Но чекер мне говорит: "не пройдены тесты 38-50".
Подозреваю, что проблема с тем, что чекер использует 16-битный тип данных вместо 32-битного (так как в 37ом тесте количество точек в ответе не превосходит 32767, а в 38ом уже превосходит).
Пожалуйста, исправьте чекер, если это возможно.
|
08.04.2017 08:52:35
Тема: Re:Ошибка в чекере
|
Михаил Долинский
Темы: 1984
Сообщений: 47236
Мой профиль
|
Надо указывать ссылку на задачу.
Нашёл сам
Ответ чекера
38 0 0,1 0 Incorrect output (too few points) Run test
Некорректный вывод (слишком мало точек)
запустил под Хромом в Редакторе (через Run Test)
увидел ответ 2
и
----------
Time: 0,624s
Memory: 387,574MB
То есть памяти потребовалось 387 Мбт, если верить нашему подсчёту.
Т.к. по условиям задачи
Ограничение по памяти 65 536 Kb (64 Мбт)
Возможно твоё решение было снято по памяти.
И такие случаи уже были
"Неверный ответ" вместо "Превышен лимит по памяти" +1
На будущее пользуйся полным перечнем возможных источников проблем типа
Мое решение дает правильный ответ, а у Вас не принимается
Чтобы ты мог проверить и версию с чекером выкладываю его исходник
Uses
SysUtils, StrUtils;
CONST
ResFile = '$result$.txt';
CONST
p_InFile = 1;
p_ChkFile = 2;
p_OutFile = 3;
p_MaxBall = 4;
CONST
MaxN = 250;
MaxM = 2*MaxN-1;
MaxK = 2*Sqr(MaxN);
MaxL = 4*Sqr(MaxN);
VAR
InFile, ChkFile,
OutFile, Comment : AnsiString;
Max, Res : Byte;
Map : Array [0..MaxM, 0..MaxM] Of Word;
X, Y : Array [1..MaxK] Of Array Of SmallInt;
L : Array [1..MaxK] Of Word;
K1 : Word;
N, K : Byte;
Procedure RageExit (ErrMsg : AnsiString);
Begin
Assign(Output, ResFile);
Rewrite(Output);
WriteLn(0);
WriteLn(ErrMsg);
Close(Output);
Halt();
End;
Procedure Pre ();
Var
Code : Integer;
Begin
InFile:=ParamStr(p_InFile);
ChkFile:=ParamStr(p_ChkFile);
OutFile:=ParamStr(p_OutFile);
Val(ParamStr(p_MaxBall), Max, Code);
End;
Procedure ReadAll ();
Var
S : AnsiString;
P : LongWord;
Function GetNum(Min, Max1 : LongInt) : LongInt;
Var
Z : AnsiString = '';
P0 : LongWord;
Res : LongInt;
Code : Integer;
Begin
While (P <= Length(S)) and (S[P] = ' ')
Do Inc(P);
P0:=P;
While (P <= Length(S)) and (S[P] <> ' ')
Do Inc(P);
Z := Trim( Copy(S, P0, P-P0) );
If (Length(Z) = 0)
Then RageExit('Insufficient data in polyline');
Val(Z, Res, Code);
If (Code <> 0) or (Res < Min) or (Res >= Max1)
Then RageExit('Incorrect output (incorrect number)');
Exit(Res);
End;
Procedure SetPoint (X, Y : SmallInt; C : Word);
Begin
If (Map[X, Y] <> 0)
Then RageExit('Incorrect output (duplicate points)');
Map[X, Y] := C;
End;
Var
i, j, LSum : Word;
Begin
Assign(Input, InFile);
Reset(Input);
ReadLn(N);
Close(Input);
Assign(Input, ChkFile);
Reset(Input);
ReadLn(K);
Close(Input);
{$I-}
Assign(Input, OutFile);
Reset(Input);
If (IOResult <> 0)
Then RageExit('Output file not found!');
FillChar(Map, SizeOf(Map), $00);
ReadLn(K1);
If (IOResult <> 0) or (K1 < 1) or (K1 > 2*N*N)
Then RageExit('Incorrect output (incorrect K value)');
LSum := 0;
For i:=1 To K1 Do Begin
If EoF()
Then RageExit('Unexpected end of file');
ReadLn(S);
S:=Trim( Tab2Space(S, 1) );
If (Length(S) = 0)
Then RageExit('Unexpected empty line');
P:=1;
L[i] := GetNum(1, 4*N*N);
Inc(LSum, L[i]+1);
If (LSum > 4*N*N)
Then RageExit('Incorrect output (too many points)');
SetLength(X[i], L[i]+1);
SetLength(Y[i], L[i]+1);
X[i, 0] := GetNum(0, 2*N);
Y[i, 0] := GetNum(0, 2*N);
SetPoint(X[i, 0], Y[i, 0], i);
For j:=1 To L[i] Do Begin
X[i, j] := GetNum(0, 2*N);
Y[i, j] := GetNum(0, 2*N);
If (Abs(X[i, j] - X[i, j-1]) + Abs(Y[i, j] - Y[i, j-1]) <> 1)
Then RageExit('Incorrect output (incorrect line)');
SetPoint(X[i, j], Y[i, j], i);
End;
If (P <= Length(S))
Then RageExit('Excessive data in polyline');
End;
If (LSum <> 4*N*N)
Then RageExit('Incorrect output (too few points)');
While not EoF() Do Begin
ReadLn(S);
If (Length(Trim(S)) > 0)
Then RageExit('Excessive output');
End;
{$I+}
Close(Input);
End;
Procedure Check ();
Begin
If (K1 > K) Then Begin
Res := 0;
Comment := 'Wrong answer';
End Else Begin
Res := Max;
Comment := 'OK';
End;
End;
Procedure PrintAll ();
Begin
Assign(Output, ResFile);
Rewrite(Output);
WriteLn(Res);
WriteLn(Comment);
Close(Output);
End;
BEGIN
Pre();
ReadAll();
Check();
PrintAll();
END.
|
08.04.2017 13:31:04
Тема: Re:Ошибка в чекере
|
Александр Керножицкий
Темы: 1
Сообщений: 3
Мой профиль
|
Михаил Долинский:
запустил под Хромом в Редакторе (через Run Test)
увидел ответ 2
и
----------
Time: 0,624s
Memory: 387,574MB
На самом деле странно. Кажется, тут проблема Run Test. Я переотправил решение, добавив в него проверку на корректность ввода:
if (!(cin >> n)) {
cout << "Bad input!" << endl;
return 42;
}
В итоге на тестах получил такие же вердикты, а в Run Test получил следующее:
Bad input!
----------
Time: 0s
Memory: 1,168MB
Значит, скорее всего, Run Test не подает программе на вход никаких данных.
Михаил Долинский:
Чтобы ты мог проверить и версию с чекером выкладываю его исходник
Я нашёл ошибку в чекере. Получение длины ломаной в нем выглядит как
L[i] := GetNum(1, 4*N*N);
при том, что L[i] имеет тип word (от 0 до 65535). А в последних тестах ломаные содержат около 100000 точек.
Тесты 38 и 39 специфичны тем, что в них L[i] все-таки не переполняется, но зато переполняется LSum (тоже типа word), которая отвечает за общее количество точек. В коде есть вот такая вот проверка:
If (LSum <> 4*N*N)
Then RageExit('Incorrect output (too few points)');
Так как LSum переполняется, она никогда не станет равна 4*N*N, и следовательно, чекер выводит такой вердикт.
Проверял локально с исправленным чекером (все целые типы в нем заменил на LongInt) на Ваших тестах, вроде все работает.
|
08.04.2017 15:56:58
Тема: Re:Ошибка в чекере
|
Михаил Долинский
Темы: 1984
Сообщений: 47236
Мой профиль
|
Исправлено. Спасибо.
Перестировал твоё решение:
08.04.2017 13:03:51 08.04.2017 16:10:28 Керножицкий Александр Олимпиады по информатике D. Ломаные 100 Все тесты успешно пройдены lines.g54 DelTA3 at NIT7
|
08.04.2017 16:04:41
Тема: Re:Ошибка в чекере
|
Александр Керножицкий
Темы: 1
Сообщений: 3
Мой профиль
|
Михаил Долинский:
Пожалуйста, выложи сюда обратно исправленный исходник чекера.
Я его положу к задаче, перекомпилирую и перетестирую твоё решение.
Заранее благодарен.
Uses
SysUtils, StrUtils;
CONST
ResFile = '$result$.txt';
CONST
p_InFile = 1;
p_ChkFile = 2;
p_OutFile = 3;
p_MaxBall = 4;
CONST
MaxN = 250;
MaxM = 2*MaxN-1;
MaxK = 2*Sqr(MaxN);
MaxL = 4*Sqr(MaxN);
VAR
InFile, ChkFile,
OutFile, Comment : AnsiString;
Max, Res : LongInt;
Map : Array [0..MaxM, 0..MaxM] Of LongInt;
X, Y : Array [1..MaxK] Of Array Of LongInt;
L : Array [1..MaxK] Of LongInt;
K1 : LongInt;
N, K : LongInt;
Procedure RageExit (ErrMsg : AnsiString);
Begin
Assign(Output, ResFile);
Rewrite(Output);
WriteLn(0);
WriteLn(ErrMsg);
Close(Output);
Halt();
End;
Procedure Pre ();
Var
Code : LongInt;
Begin
InFile:=ParamStr(p_InFile);
ChkFile:=ParamStr(p_ChkFile);
OutFile:=ParamStr(p_OutFile);
Val(ParamStr(p_MaxBall), Max, Code);
End;
Procedure ReadAll ();
Var
S : AnsiString;
P : LongInt;
Function GetNum(Min, Max1 : LongInt) : LongInt;
Var
Z : AnsiString = '';
P0 : LongInt;
Res : LongInt;
Code : LongInt;
Begin
While (P <= Length(S)) and (S[P] = ' ')
Do Inc(P);
P0:=P;
While (P <= Length(S)) and (S[P] <> ' ')
Do Inc(P);
Z := Trim( Copy(S, P0, P-P0) );
If (Length(Z) = 0)
Then RageExit('Insufficient data in polyline');
Val(Z, Res, Code);
If (Code <> 0) or (Res < Min) or (Res >= Max1)
Then RageExit('Incorrect output (incorrect number)');
Exit(Res);
End;
Procedure SetPoint (X, Y : LongInt; C : LongInt);
Begin
If (Map[X, Y] <> 0)
Then RageExit('Incorrect output (duplicate points)');
Map[X, Y] := C;
End;
Var
i, j, LSum : LongInt;
Begin
Assign(Input, InFile);
Reset(Input);
ReadLn(N);
Close(Input);
Assign(Input, ChkFile);
Reset(Input);
ReadLn(K);
Close(Input);
{$I-}
Assign(Input, OutFile);
Reset(Input);
If (IOResult <> 0)
Then RageExit('Output file not found!');
FillChar(Map, SizeOf(Map), $00);
ReadLn(K1);
If (IOResult <> 0) or (K1 < 1) or (K1 > 2*N*N)
Then RageExit('Incorrect output (incorrect K value)');
LSum := 0;
For i:=1 To K1 Do Begin
If EoF()
Then RageExit('Unexpected end of file');
ReadLn(S);
S:=Trim( Tab2Space(S, 1) );
If (Length(S) = 0)
Then RageExit('Unexpected empty line');
P:=1;
L[i] := GetNum(1, 4*N*N);
Inc(LSum, L[i]+1);
If (LSum > 4*N*N)
Then RageExit('Incorrect output (too many points)');
SetLength(X[i], L[i]+1);
SetLength(Y[i], L[i]+1);
X[i, 0] := GetNum(0, 2*N);
Y[i, 0] := GetNum(0, 2*N);
SetPoint(X[i, 0], Y[i, 0], i);
For j:=1 To L[i] Do Begin
X[i, j] := GetNum(0, 2*N);
Y[i, j] := GetNum(0, 2*N);
If (Abs(X[i, j] - X[i, j-1]) + Abs(Y[i, j] - Y[i, j-1]) <> 1)
Then RageExit('Incorrect output (incorrect line)');
SetPoint(X[i, j], Y[i, j], i);
End;
If (P <= Length(S))
Then RageExit('Excessive data in polyline');
End;
If (LSum <> 4*N*N)
Then RageExit('Incorrect output (too few points)');
While not EoF() Do Begin
ReadLn(S);
If (Length(Trim(S)) > 0)
Then RageExit('Excessive output');
End;
{$I+}
Close(Input);
End;
Procedure Check ();
Begin
If (K1 > K) Then Begin
Res := 0;
Comment := 'Wrong answer';
End Else Begin
Res := Max;
Comment := 'OK';
End;
End;
Procedure PrintAll ();
Begin
Assign(Output, ResFile);
Rewrite(Output);
WriteLn(Res);
WriteLn(Comment);
Close(Output);
End;
BEGIN
Pre();
ReadAll();
Check();
PrintAll();
END.
|
08.04.2017 16:11:27
Тема: Re:Ошибка в чекере
|
Михаил Долинский
Темы: 1984
Сообщений: 47236
Мой профиль
|
Михаил Долинский:
Исправлено. Спасибо.
Перестировал твоё решение:
08.04.2017 13:03:51 08.04.2017 16:10:28 Керножицкий Александр Олимпиады по информатике D. Ломаные 100 Все тесты успешно пройдены lines.g54 DelTA3 at NIT7
|
|
|