Path: csiph.com!eternal-september.org!reader01.eternal-september.org!.POSTED!not-for-mail
From: Tim Rentsch
Newsgroups: comp.programming
Subject: Re: A little puzzle.
Date: Tue, 22 Nov 2022 05:24:33 -0800
Organization: A noiseless patient Spider
Lines: 91
Message-ID: <865yf79l66.fsf@linuxsc.com>
References: <875yf8nijb.fsf@bsb.me.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Info: reader01.eternal-september.org; posting-host="0b8f1b00ad451c4da87815129da31114"; logging-data="119594"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+qTwT722uf0oYdMk8LbU1ClBbfKAk51Uk="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:ueadR6IjxUJxhrnT0icEZmHTW8E= sha1:qoMp7DJRM5kIUWet98Wk2lCaNqQ=
Xref: csiph.com comp.programming:15936
Ben Bacarisse writes:
[...]
> Consider any ordered measure that "wraps round" -- bearings in degrees,
> minutes in the hour, indeed hours in either the 12 or 24 hour clock.
> The problem is to determine if a given value is in the sub-range
> specified by a start and an [end] value.
>
> I was specifically concerned with integer values where the sub-range
> includes the start value but excludes the end value.
>
> Though I am not sure this merits the term "puzzle", I suggest that
> solutions be posted with some spoiler protection.
My answer below (forgive me for resorting to "low tech" spoiler
protection)...
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
(spoiler alert)
/* is_circularly_between( a, b, c ) -
* 1 if b is circularly between a and c,
* 0 otherwise
* the interval of interest [ a, c ) is understood to be
* closed at the 'a' end, and
* open at the 'c' end
*
* The parameters a, b, and c are all of a single type T,
* where T allows relational (ordering) comparisons.
*
* Assumes a, b, and c all have legitimate values.
*/
int
is_circularly_between( T a, T b, T c ){
return a <= c ? a <= b && b < c : a <= b || b < c;
}
This function works if T is any integer type, or any real
floating-point type, or is a type pointer to any complete
object type. (Disclaimer: I didn't think carefully about
the case where T is a pointer to an array type.)