Ошибка Presentation Error в проверяющей системе - Pascal

Узнай цену своей работы

Формулировка задачи:

Краткое условие задачи По координатам двух клеток шахматной доски, определить какие фигуры могут перейти с первой на вторую клетку. Если нужны подробности, вот:
По заданным координатам двух клеток шахматной доски необходимо определить список шахматных фигур, которые могут перемещаться при игре за «белых» по правилам шахмат из первой координаты во вторую без взятия фигуры соперника. Напомним, что для игры в шахматы используется доска размером 8х8. При этом горизонтальная координата нумеруется латинскими буквами от «A» до «H», а вертикальная – цифрами от 1 до 8 снизу вверх. Таким образом, координата клетки состоит из буквы и цифры. Например, «H1» и «A8» – правый нижний и левый верхний углы соответственно. Всего существует 6 шахматных фигур: ладья, слон, конь, ферзь, король и пешка. Опишем правила выполнения хода без взятия на свободной доске: король ходит на расстояние 1 по вертикали, горизонтали или диагонали; ферзь ходит на любое расстояние по вертикали, горизонтали или диагонали; ладья ходит на любое расстояние по вертикали или горизонтали; слон ходит на любое расстояние по диагонали; конь ходит буквой «Г», т.е. на поле, находящееся на расстоянии 2 по вертикали и 1 по горизонтали или 1 по вертикали и 2 по горизонтали; пешка ходит на 1 поле вперед по вертикали, начиная свое движение со второй линии, при первом ходе пешка может перемещаться на 2 поля вперед по вертикали. Следующие рисунки отражают возможные перемещения шахматных фигур (в скобках указаны англоязычные названия фигур): Шахматная доска Ладья (Rook) Слон (Bishop) Конь (Knight) Ферзь (Queen) Король (King) Пешка (Pawn) Входные данные В первой строке входного файла INPUT.TXT через пробел записаны начальная и конечная координаты шахматной доски. Каждая координата состоит из заглавной латинской буквы от «A» до «H» и цифры от 1 до 8. Гарантируется, что начальная и конечная координаты не совпадают. Выходные данные В выходной файл OUTPUT.TXT выведите по-английски названия шахматных фигур, которые могут совершить свободный ход из первой координаты во вторую по правилам шахмат. Если ни одна из фигур не может выполнить такой ход, то следует вывести «Nobody». Фигуры следует выводить без повторов в произвольном порядке. Примеры № INPUT.TXT OUTPUT.TXT 1 D3 D7 Queen Rook 2 F4 H5 Knight 3 E2 E3 King Queen Rook Pawn 4 A1 H7 Nobody
Тесты из примеров моя программа проходит. Еще проверял на A1 H8 и подобных где ответ Bishop или Pawn Сделал максимально понятно с функциями для каждой фигуры. В описании ошибок нашел что ошибки типа Presentation Error возникают, если неправильный формат вывода. Не понимаю что у них там в тестах и каким образом может быть неправильный формат вывода. Может ошибка в чём-нибудь не том?
function Rook(c1,c2:string):boolean;
begin
  if (c1[1]=c2[1]) or (c1[2]=c2[2]) then Rook:=True else Rook:=False;
end;
 
function Bishop(a,b:string):boolean;
begin
  if (abs(ord(a[1])-ord(b[1]))=abs(ord(a[2])-ord(b[2]))) then Bishop:=True else Bishop:=False;
end;
 
function Knight(a,b:string):boolean;
begin
  if ((abs(ord(a[1])-ord(b[1]))=1) and (abs(ord(a[2])-ord(b[2]))=2)) or
  ((abs(ord(a[2])-ord(b[2]))=1) and (abs(ord(a[1])-ord(b[1]))=2)) then  Knight:=True else Knight:=False;
end;
 
function Queen(a,b:string):boolean;
begin
  if Bishop(a,b) or Rook(a,b) then Queen:=True else Queen:=False;
end;
 
function King(a,b:string):boolean;
begin
  if ((abs(ord(a[1])-ord(b[1]))=0) or (abs(ord(a[1])-ord(b[1]))=1)) and
  ((abs(ord(a[2])-ord(b[2]))=0) or (abs(ord(a[2])-ord(b[2]))=1)) then King:=True else King:=False;
end;
 
function Pawn(a,b:string):boolean;
begin
  if a[2]='2' then
  begin
    if (a[1]=b[1]) and (((ord(b[2])-ord(a[2])=1)) or ((ord(b[2])-ord(a[2])=2))) then Pawn:=True else Pawn:=False;
  end
  else if (a[1]=b[1]) and (ord(b[2])-ord(a[2])=1) then Pawn:=True else Pawn:=False;
end;
  var s1,s2:string[2]; input:string;
begin
  readln(input);
  s1:=copy(input,1,2); s2:=copy(input,4,2);
  if Rook(s1,s2) then writeln('Rook');
  if Bishop(s1,s2) then writeln('Bishop');
  if Knight(s1,s2) then writeln('Knight');
  if Queen(s1,s2) then writeln('Queen');
  if King(s1,s2) then writeln('King');
  if Pawn(s1,s2) then writeln('Pawn');
  if not(Rook(s1,s2) or Bishop(s1,s2) or Knight(s1,s2) or Queen(s1,s2) or King(s1,s2) or Pawn(s1,s2)) then writeln('Nobody');
end.
Программа

Решение задачи: «Ошибка Presentation Error в проверяющей системе»

textual
Листинг программы
{$mode fpc}
{$B-}
program acmp_1088;
 
  function TestStepRook(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepRook := (x1 = x2) or (y1 = y2);
    if TestStepRook then
      writeln('Rook');
  end;
 
  function TestStepBishop(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepBishop := abs(x1 - x2) = abs(y1 - y2);
    if TestStepBishop then
      writeln('Bishop');
  end;
 
  function TestStepKnight(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepKnight := abs(x1 - x2) * abs(y1 - y2) = 2;
    if TestStepKnight then
      writeln('Knight');
  end;
 
  function TestStepQueen(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepQueen := (x1 = x2) or (y1 = y2) or (abs(x1 - x2) = abs(y1 - y2));
    if TestStepQueen then
      writeln('Queen');
  end;
 
  function TestStepKing(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepKing := (abs(x1 - x2) <= 1) and (abs(y1 - y2) <= 1);
    if TestStepKing then
      writeln('King');
  end;
 
  function TestStepPawn(x1, y1, x2, y2: integer): boolean;
  begin
    TestStepPawn := (x1 = x2) and ((y2 - y1 = 1) or ((y1 = 2) and (y2 - y1 = 2))) and
      (y1 > 1);
    if TestStepPawn then
      writeln('Pawn');
  end;
 
var
  s: string;
  x1, y1, x2, y2: integer;
  Result: boolean;
begin
  readln(s);
  x1 := Ord(s[1]) - Ord('A') + 1;
  y1 := Ord(s[2]) - Ord('1') + 1;
  x2 := Ord(s[4]) - Ord('A') + 1;
  y2 := Ord(s[5]) - Ord('1') + 1;
  Result := TestStepRook(x1, y1, x2, y2);
  Result := TestStepBishop(x1, y1, x2, y2) or Result;
  Result := TestStepKnight(x1, y1, x2, y2) or Result;
  Result := TestStepQueen(x1, y1, x2, y2) or Result;
  Result := TestStepKing(x1, y1, x2, y2) or Result;
  Result := TestStepPawn(x1, y1, x2, y2) or Result;
  if not Result then
    writeln('Nobody');
end.

Объяснение кода листинга программы

  1. Объявляются функции сравнения для шахматных фигур: Rook, Bishop, Knight, Queen, King, и Pawn с параметрами координат x1, y1, x2, y2.
  2. В каждой функции, вычисляется условие для соответствующего типа фигуры и возвращается булево значение. При этом, если условие выполнено, выводится название фигуры.
  3. В основной программе объявляются переменные s (строка для ввода), x1, y1, x2, y2 (числовые координаты), и Result (булевое значение).
  4. Читается ввод пользователя в переменную s.
  5. Преобразуются символы строки в числовые координаты x1, y1, x2, y2.
  6. В переменную Result последовательно записывается результат сравнения для каждого типа фигуры с использованием соответствующих функций.
  7. Если ни одно из условий не выполнено, на экран выводится 'Nobody'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы