|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 28 Aug 2002 16:41:57 To : Bulat Ziganshin Subject : Re: совпадение времени с пе риодом --------------------------------------------------------------------------------
Bulat Ziganshin wrote:
> * Originally in RU.PERL
> Приятного тебе дня и незабываемой ночи, Rostislav!
>
> Monday August 26 2002, Rostislav Podgornyi writes to All:
> RP> Имеем некий часовой пеpиод (с 23 до 7 часов):
> RP> $begin=23; $end=7;
>
> RP> Имеем текущее значение:
> RP> $now=5;
>
> RP> Как узнать входит ли $now в вышеуказанный пеpиод или нет? Что-то
>
> $end+=24 if $end<$begin;
> $now+=24 if $now<$begin;
Hепереносимое решение предполагающее, что в сутках 24 часа. Соответственно
работать на других планетах не сможет. (А также его нельзя будет использовать,
скажем, для проверки на попадание в интервал заданый минутами каждого часа).
Вот как эту задачу решил бы математик:
# Функция возвращает положительное число при попадании в интервал,
# 0 - при попадании на границу интервала, либо отрицательное -
# вне интервала
sub inside1 {
my ($begin, $end, $now) = @_;
($begin - $now) * ($end - $now) * ($begin - $end);
}
Либо, несколько более корректно, но решение требует перехвата
ошибок:
# То же, но генерирует исключение в случае совпадения $begin и
# $end, т.е. при неопределенности решения
sub inside1a {
my ($begin, $end, $now) = @_;
($begin - $now) * ($end - $now) / ($begin - $end);
}
А так бы решал эту задачу логик:
# Для начала примем, какие границы интервала включительны, а
# какие исключительны. Обычно работая с интервалами времени
# принимают одну границу включительно, а вторую исключительно, дабы
# следующие друг за другом интервалы не вызывали неоднозначности.
# Примем, как наиболее прывычный, вариант при котором $begin задается
# включительно, а $end - исключительно.
# Возвращает true при попадании в интервал, false - при непопадании.
# Совпадение $begin и $end трактуется как нулевой интервал.
sub inside2 {
my ($begin, $end, $now) = @_;
$now < $begin xor $now < $end xor $end < $begin;
}
Андрей
--- ifmail v.2.15dev5
* Origin: Demos online service (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/5284cd3df169.html, оценка из 5, голосов 10
|