Попалась мне сегодня на глаза простенькая задачка:
Задано точку с координатами х и у. Определить, в какой координатной четверти она расположена.
Входные данные: В единственной строке через пробел задано 2 вещественных числа — координаты точки, значения координат по модулю не превышают 100.
Выходные данные: Единственное число — номер соответствующей четверти, либо 0, если однозначно определить четверть невозможно.
Задача очень простая (из сборника для выпускников школ), но, мне показалось, что посмотреть вариант нестандартного решения читателям будет интересно.
Для начала, стандартное решение этой задачи — проверяем, не является ли одна из координат нулем, если является — выводим 0, иначе — в зависимости от знаков координат выводим соответствующую четверть:
1 2 3 4 5 6 7 8 9 10 11 | var x,y:real; begin readln(x,y); if (x=0) or (y=0) then Writeln(0) else begin if x > 0 then if y > 0 then Writeln(1) else Writeln(4) else if y > 0 then writeln(2) else Writeln(3); end; end. |
Вот реализация второго варианта решения (на языке Pascal):
1 2 3 4 5 | var x,y:real; begin readln(x,y); Writeln( ord(x*y <> 0)*(ord(x*y < 0) + 2*ord(y < 0) + 1) ); end. |
Вначале не понятна логика этого выражения, поэтому постараюсь объяснить, как вычисляется номер нужной четверти.
1. Проверяем, не лежит ли точка на одной из осей: ord(x*y <> 0)
. Если x
или y
равны 0, то ord(x*y <> 0)
будет равно 0, а вместе с ним и все выражения, что и требуется вывести.
2. Проверяем, разный ли знак у координат точки: ord(x*y < 0)
. Координаты точки имеют разный знак во второй и четвертой четвертях. Если точка принадлежит II или IV четверти, выражение ord(x*y < 0)
будет равно 1, иначе — 0, что образно можно показать так:
Показать / спрятать изображение
3. Если координата y
точки меньше 0, то выражение 2*ord(y < 0)
будет равно 2, иначе — 0. Таким образом, для точек в III и IV четвертях к сумме прибавляем 2:
Показать / спрятать изображение
4. Прибавим 1, независимо от расположения точки (таким образом получим необходимые номера четвертей в зависимости от координат точки):
Показать / спрятать изображение
Прикольный перевод логики в цифры! Маладец!
Спасибо) Очень понравилась реализация! Наверное, нужно почаще задумываться о интересных решениях, а не о стандартных и надоедливых. Стоит подумать))
Так держать! Молодец!