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: Sun, 27 Nov 2022 18:38:52 -0800
Organization: A noiseless patient Spider
Lines: 167
Message-ID: <8635a3951f.fsf@linuxsc.com>
References: <875yf8nijb.fsf@bsb.me.uk> <865yf79l66.fsf@linuxsc.com> <87wn7nj9mb.fsf@bsb.me.uk> <86sfi98xnx.fsf@linuxsc.com> <87leo1i5bo.fsf@bsb.me.uk> <86k03k7yqe.fsf@linuxsc.com> <87o7stisxy.fsf@bsb.me.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Injection-Info: reader01.eternal-september.org; posting-host="8f857c192f6688ee1cdff50f6ccf3164"; logging-data="1999369"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+W4In+oroMBb4G1YpMvpmDLjvX1aBsgjQ="
User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Cancel-Lock: sha1:06GIsJpY7ESVP4KBzVylgX0mtJE= sha1:D0O7/VYX7xxNTBErTpQQZORJ7TM=
Xref: csiph.com comp.programming:15977
Ben Bacarisse writes:
> Tim Rentsch writes:
>
>> Ben Bacarisse writes:
>>
>>> Tim Rentsch writes:
>>>
>>>> I think this problem would make a good interview question,
>>>> provided care were taken to phrase it so the subtleties were
>>>> still there, but possible points of confusion were reduced.
>>>> Not that I know how to do that... :)
>>>
>>> I didn't make a good job of presenting it. It certainly didn't
>>> pique anyone else's interest, but then comp.programming is not
>>> well populated.
>>
>> I think part of the problem is that the question looks "easier"
>> than it really is. People have an initial reaction (certainly I
>> know I did) but don't continue to think through what the issues
>> might be.
>
> I think so. I am, to be honest, rather disappointed by the
> reception this problem has had. Even after various examples and
> two explanations, some posters still don't know what's being
> asked, but at the time it is claimed that it's trivial and not
> worth coding up. Sometimes both claims are made by the same
> poster.
I am somewhat baffled by the replies. I thought what was being
sought was evident in your initial posting. Perhaps not obvious,
but still clear enough after a bit of thought.
>> For what it's worth, here is a stab at presenting the problem.
>> It's longer than I would like it to be, but maybe it will be
>> helpful.
>>
>> We are interested in writing a function to answer a more general
>> version of the example problem stated below.
>>
>> Consider a plane flying easterly (and for simplicity, directly
>> above the equator). We measure the plane's progress by its
>> longitude, measured to the nearest second of arc (1/3600 of a
>> degree), so from -180 degrees to 179 degrees 59 minutes 59
>> seconds (or equivalently from -648000 seconds to 647999 seconds).
>> We would like to know if a given longitude is between the plane's
>> starting longitude and ending longitude. (Note that the
>> longitude measurements below are given in degrees, minutes, and
>> seconds, but we may assume that internally they are represented
>> as an integer number of seconds.)
>>
>> For example, if the plane flies
>>
>> from Los Angeles, US (longitude -118 14' 37")
>> to New York, US (longitude -73 56' 7")
>>
>> does it cross over the longitude lines of
>>
>> Denver, US (longitude -104 59' 30"), or
>> Moscow, Russia (longitude 37 37' 6")?
>>
>> Answer: the plane does cross the longitude line of Denver but not
>> that of Moscow.
>>
>> Similarly, if the plane flies
>>
>> from Beijing, China (longitude 116 23' 0")
>> to Los Angeles, US (longitude -118 14' 37")
>>
>> does it cross over
>>
>> Tokyo, Japan (longitude 139 50' 32"),
>> Waikiki, Hawaii, US (longitude -157 50' 4"), or
>> Moscow, Russia (longitude 37 37' 6")?
>>
>> Answer: the plane does cross the longitude lines of Tokyo and
>> Waikiki but not that of Moscow.
>>
>> For the general case we would like to handle any circular measure
>> (for convenience having coordinates in some integer range).
>>
>> Exercise: write a function to answer this kind of question for
>> circular measures in general. You may assume integer coordinates
>> and intervals that include the starting point but do not include
>> the end point. Give a suitable declaration for the function,
>> and separately give a function definition to implement the given
>> interface.
>
> I think this is good, though the example with seconds of arc may
> appear fiddly to some people. Degrees would do, but then the
> examples would become a bit fuzzy.
I agree on both points. I didn't like the fiddly-ness, but no
better example came to mind.
> I would probably use times of day. For example, my cheap
> "off-peak" electricity is from 22:00 to 00:30 and from 02:30 to
> 7:30 but there are all sorts possible examples: times of day when
> I do not want to be disturbed, times when particular parking rules
> apply and so on.
I was looking for a circular measure that is widely known and also
has some negative values. Longitude was the best I could think of.
> The problem would then be to determine, given a time of day (in
> minutes past midnight), if that time is within a particular
> period.
Hours of the day, especially on a 24-hour clock, is probably better
than longitude for the initial example.
> I don't think it's a spoiler to give, first, a very concrete
> example, even including the function interface. A second part of
> the question would be by ask about generalising this interface to
> any "circular" measure.
I was trying to be faithful (what I thought was) your not wanting
to give away the simplicity of a general solution. I can't
decide if your example below gives away too much or might be
slightly misleading (because the modulus is inherent in the
measure). It's hard to find a phrasing that is both specific
enough to clearly state what is being sought and also not so
specific that it gives away the nature of the problem. I was
trying to strike a balance point, apparently not quite balanced
enough. :)
> So I don't think it would matter to help DAK by giving
>
> with Ada.Text_IO;
> use Ada.Text_IO;
>
> procedure Longitude is
>
> function Flight_East_Crosses_Longitude
> (Start_Seconds, End_Seconds, Longitude : Integer) return Boolean is
> begin
> -- Your code here
> end Flight_East_Crosses_Longitude;
>
> Beijing : constant Integer := ((+116 * 60) + 23) * 60 + 0;
> Los_Angeles : constant Integer := ((-118 * 60) + 14) * 60 + 37;
> Tokyo : constant Integer := ((+139 * 60) + 50) * 60 + 32;
> Waikiki : constant Integer := ((-157 * 60) + 50) * 60 + 4;
> Moscow : constant Integer := ((+037 * 60) + 37) * 60 + 6;
>
> begin
> Put_Line(
> Flight_East_Crosses_Longitude(Beijing, Los_Angeles, Tokyo)'img
> );
> Put_Line(
> Flight_East_Crosses_Longitude(Beijing, Los_Angeles, Waikiki)'img
> );
> Put_Line(
> Flight_East_Crosses_Longitude(Beijing, Los_Angeles, Moscow)'img
> );
> end Longitude;
(I reformatted the calls to Put_Line() so they wouldn't violate
my newsreader's idea of how long lines should be.)
> Of course, Ada is one of the few languages where one can actually
> implement largely type-generic functions, so it's a shame to be
> this specific, but as I say, that could come later.
I can't help feeling that your suggestion of using times of
day -- especially if expressed in 4-digit military time format --
would be a better choice for the example.