Ошибка Presentation Error в проверяющей системе - Pascal
Формулировка задачи:
Краткое условие задачи
По координатам двух клеток шахматной доски, определить какие фигуры могут перейти с первой на вторую клетку.
Если нужны подробности, вот:
Тесты из примеров моя программа проходит. Еще проверял на A1 H8 и подобных где ответ Bishop или Pawn
Сделал максимально понятно с функциями для каждой фигуры. В описании ошибок нашел что ошибки типа Presentation Error возникают, если неправильный формат вывода. Не понимаю что у них там в тестах и каким образом может быть неправильный формат вывода. Может ошибка в чём-нибудь не том?
Программа
По заданным координатам двух клеток шахматной доски необходимо определить список шахматных фигур, которые могут перемещаться при игре за «белых» по правилам шахмат из первой координаты во вторую без взятия фигуры соперника.
Напомним, что для игры в шахматы используется доска размером 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
Листинг программы
- 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.
Объяснение кода листинга программы
- Объявляются функции сравнения для шахматных фигур: Rook, Bishop, Knight, Queen, King, и Pawn с параметрами координат x1, y1, x2, y2.
- В каждой функции, вычисляется условие для соответствующего типа фигуры и возвращается булево значение. При этом, если условие выполнено, выводится название фигуры.
- В основной программе объявляются переменные s (строка для ввода), x1, y1, x2, y2 (числовые координаты), и Result (булевое значение).
- Читается ввод пользователя в переменную s.
- Преобразуются символы строки в числовые координаты x1, y1, x2, y2.
- В переменную Result последовательно записывается результат сравнения для каждого типа фигуры с использованием соответствующих функций.
- Если ни одно из условий не выполнено, на экран выводится 'Nobody'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д