From: richard.nospam@gmail.com   
      
   On 28/11/2022 15:30, Tim Rentsch wrote:   
   > Richard Harnden writes:   
   >   
   >> On 21/11/2022 20:45, Ben Bacarisse wrote:   
   >>   
   >>> I wonder if there are any real posters here? Let's see...   
   >>>   
   >>> I came across a trivial programming task that must have been solved a   
   >>> thousand times by other programmers, but it had never crossed my path   
   >>> until yesterday. I must be feeling my age because I made a real hash of   
   >>> tackling it at first. Anyway, I thought it might be of interest.   
   >>>   
   >>> 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 en 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. Do all the news   
   >>> readers used by programmers (or ex programmers) all respect the presence   
   >>> of a form-feed character...   
   >>>    
   >>> ... like this? Because that's my favourite way, rather than posting   
   >>> lots of dummy lines before the solution.   
   >>   
   >> I think this works ...   
   >>   
   >> int in_subrange(int range, int start, int end, int check)   
   >> {   
   >> check %= range;   
   >>   
   >> if ( ( end < start && (   
   >> (check >= 0 && check <= end)   
   >> || (check >= start && check < range)   
   >> )   
   >> )   
   >> || ( check >= start && check <= end )   
   >> )   
   >> return 1;   
   >>   
   >> return 0;   
   >> }   
   >   
   > Have you thought about a case where the values of check, start,   
   > and end are chosen from the interval -9000000000 to 9000000000?   
   > How about the interval -18000000000 to 18000000000?   
      
   Nope, I assume that start and end are between zero and range, and that   
   check is greater that zero.   
      
   I didn't think about overflows at all.   
      
   With unsigned integers ...   
      
   int in_subrange(uint_fast64_t range, uint_fast64_t start, uint_fast64_t   
   end, uint_fast64_t check)   
   {   
    check %= range;   
      
    if ( ( end < start && (   
    check <= end   
    || (check >= start && check < range)   
    )   
    )   
    || ( check >= start && check <= end )   
    )   
    return 1;   
      
    return 0;   
   }   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|