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.)