Страница 1 из 1
Ошибка в ответах(Глава 16)
Добавлено: 02.05.2015 22:45:46
ramainen
Привет.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
На входные данные:
x = 5, y = 6;
x = 1; y = 2;
x = 7; y = 8;
x = 8; y = 5;
Выдает: Черная клетка, а это соответственно белая.
Я решил
вот такPS. Может я и не прав, все не проверил. Если прав, то поправьте в следующем релизе.
PSS. Спасибо автору за бесценный труд.
Re: Ошибка в ответах(Глава 16)
Добавлено: 03.05.2015 22:07:56
Oleg_D
ramainen писал(а):Привет.
Нашел ошибку в ответах: 16 глава, ж. Про черные и белые клетки шахматной доски.
Уважаемый
ramainen , спасибо за активное участие в нашем форуме!
Хотя ошибки у себя пока не обнаружил. По идее, если сумма номеров столбца и строки чётная, то клетка белая. Или не так?
Re: Ошибка в ответах(Глава 16)
Добавлено: 04.05.2015 01:35:09
ramainen
По вашему коду - да, но это не правильно. Во входные данные я указывал белую клетку, на них программа выводит "black".
Белых клеток на четном вообще нет, имею в виду: четно-четное.
PS. Да что уж мне, Вам спасибо за труд.
PSS. Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
Re: Ошибка в ответах(Глава 16)
Добавлено: 04.05.2015 08:43:03
Oleg_D
ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.
Re: Ошибка в ответах(Глава 16)
Добавлено: 04.05.2015 10:35:09
ramainen
Oleg_D писал(а):ramainen писал(а):Собственно в моих "Ответах" редакция 12.5 в условии задачи указано, что на 1, 1 стоит белая клетка, хотя в Песнях указано, что 1, 1 - это черная.
А, да, помню, был такой грех: чёрную и белую клетку перепутал. В песнях исправил, а в ответах забыл, надо поправить, спасибо.
Не за что, а задачку проверьте. Спасибо Вам.
Re: Ошибка в ответах(Глава 16)
Добавлено: 05.05.2015 00:37:50
Oleg_D
ramainen писал(а):Не за что, а задачку проверьте. Спасибо Вам.
Вот ваш вариант:
Код: Выделить всё
var line, column: integer;
begin
repeat
write('Please enter line(1-8): '); readln(line);
// Проверка на ноль строки
if line = 0 then begin
writeln('Error, Line = 0!');
break;
end;
// Проверка в числовом диапозоне
if (line >= 1) and (line <= 8) then begin
write('Please enter column(1-8): '); readln(column);
// Проверка на ноль столбца
if column = 0 then begin
writeln('Error, Column = 0!');
break;
end;
// Проверка в числовом диапозоне
if (column >= 1) and (column <= 8) then begin
// Выясняем какого цвета клетка
if (line mod 2 = 0) and (column mod 2 = 1) then
writeln('white')
else if (line mod 2 = 1) and (column mod 2 = 0) then
writeln('white')
else
writeln('Black');
end
else begin
writeln('Error, column = ', column, ', need 1-8');
break;
end;
end
else begin
writeln('Error, line = ', line, ', need 1-8');
break;
end;
until FALSE
end.
Я не запускал её, но с виду верно. Только решение, как уже сказано, можно упростить:
Код: Выделить всё
// Выясняем цвет клетки
if (column + line) mod 2 = 0
then writeln('Black')
else writeln('white');
Re: Ошибка в ответах(Глава 16)
Добавлено: 05.05.2015 21:10:12
ramainen
Ну да, спасибо Вам.
Re: Ошибка в ответах(Глава 16)
Добавлено: 06.05.2015 14:00:44
bormant
ramainen,
в общем случае условие
Код: Выделить всё
if (line mod 2 = 0) and (column mod 2 = 1) then writeln('white')
else if (line mod 2 = 1) and (column mod 2 = 0) then writeln('white')
по сути есть
Код: Выделить всё
if (line mod 2 = 0) and not (column mod 2 = 0)
or not (line mod 2 = 0) and (column mod 2 = 0) then writeln('white')
в котором теперь уже несложно узнать XOR:
Код: Выделить всё
if (line mod 2 = 0) xor (column mod 2 = 0) then writeln('white')
Re: Ошибка в ответах(Глава 16)
Добавлено: 06.05.2015 21:05:47
ramainen
bormant писал(а):ramainen,
в общем случае условие
Код: Выделить всё
if (line mod 2 = 0) and (column mod 2 = 1) then writeln('white')
else if (line mod 2 = 1) and (column mod 2 = 0) then writeln('white')
по сути есть
Код: Выделить всё
if (line mod 2 = 0) and not (column mod 2 = 0)
or not (line mod 2 = 0) and (column mod 2 = 0) then writeln('white')
в котором теперь уже несложно узнать XOR:
Код: Выделить всё
if (line mod 2 = 0) xor (column mod 2 = 0) then writeln('white')
Оо, я еще не знаю, что за xor(исключающие или), вариант Олега проще читается, хотя может это из-за моего незнания. Спасибо, что поучаствовали.
Re: Ошибка в ответах(Глава 16)
Добавлено: 07.05.2015 19:40:38
Oleg_D
ramainen писал(а):Оо, я еще не знаю, что за xor(исключающие или)
Булевы операции OR, AND, NOT рассмотрены в 13-й главе. Кстати, некоторых читателей почему-то затрудняла эта 13-я «песня», номер тому виной, что ли? И это при том, что там сознательно не сказано об операции XOR. Во-первых, она не так часто употребляется в булевых выражениях, а во-вторых – не хотелось усложнять повествование. Но при обработке битовых массивов она весьма полезна, и потому в 48-й главе упомянута.
Пусть объявлены три булевых переменных:
Тогда выражение:
Равносильно выражению:
Иначе говоря, операция XOR даёт TRUE, если операнды не совпадают.
То же самое эквивалентно следующему громоздкому выражению (скобки тут необязательны):
В этой связи для лучшего понимания темы предлагаю следующее упражнение. Написать эквивалентные выражения (и программу для проверки), пользуясь только операциями OR, AND, NOT для следующих выражений:
Код: Выделить всё
1) A:= B = C;
2) A:= B <> C;
3) A:= B > C;
4) A:= B >= C;
5) A:= B < C;
6) A:= B <= C;
Здесь все переменные булевы.
Тут надо учесть, что TRUE > FALSE.