Ошибка 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'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д