[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Общего плана ->Сообщения об ошибках в DL
Автор Сообщение
Александр Керножицкий

Темы: 1
Сообщений: 3

Мой профиль
Вот в этой задаче, кажется, ошибка в чекере. Моя программа выдает на всех тестах ответ один в один с правильным выходным файлом (проверял локально и здесь на сервере, в онлайн-редакторе). Но чекер мне говорит: "не пройдены тесты 38-50".

Подозреваю, что проблема с тем, что чекер использует 16-битный тип данных вместо 32-битного (так как в 37ом тесте количество точек в ответе не превосходит 32767, а в 38ом уже превосходит).

Пожалуйста, исправьте чекер, если это возможно.
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
Надо указывать ссылку на задачу.

Нашёл сам

Ответ чекера
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.

Александр Керножицкий

Темы: 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) на Ваших тестах, вроде все работает.
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
Исправлено. Спасибо.

Перестировал твоё решение:

08.04.2017 13:03:51 08.04.2017 16:10:28 Керножицкий Александр Олимпиады по информатике D. Ломаные 100 Все тесты успешно пройдены lines.g54 DelTA3 at NIT7
Александр Керножицкий

Темы: 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.

Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль


Михаил Долинский:

Исправлено. Спасибо.

Перестировал твоё решение:

08.04.2017 13:03:51 08.04.2017 16:10:28 Керножицкий Александр Олимпиады по информатике D. Ломаные 100 Все тесты успешно пройдены lines.g54 DelTA3 at NIT7  
 
Индекс форума ->Общего плана ->Сообщения об ошибках в DL
Time:0,056