An interesting programming challenge
Ben Rubinstein
benr_mc at cogapp.com
Fri Apr 10 11:25:13 EDT 2015
On 10/04/2015 16:04, Colin Holgate wrote:
> Don’t you have to continue exploring, if the running total goes over 31? There may be a mixture of negative and positive numbers ahead, that will show up a different valid slice of numbers.
>
> I tried using Jerry’s approach under ActionScript, slightly modified to use arrays instead of strings, and it took just over 300 mS. Tried as Javascript too, and that seemed to be under 2 milliseconds!
Hi Colin,
No, that's the other challenge (the CleverCat one) - we're in a sub-thread
talking about the metro populations one. Depending on your email client, this
may be more or less obvious!
But in regards to the CleverCat challenge, I had an interesting finding which
I still can't understand - maybe the wisdom of this list will explain?
On 10/04/2015 02:36, Jerry Jensen wrote:
> Here’s my script that gave the right answer the first time too. It runs in
> about 100 msec on a MacBookPro 2.6GHz i7 with Yosemite 10.10.3 and LC 6.7.4
Obviously, my attempt gave the right answer as well (otherwise I'd have kept
my mouth shut - but when I then went back and looked at Jerry's code, it was
very similar, but I smugly thought mine would probably be faster; because his
solution involves a lot of cropping of the string, and mine doesn't change the
string at all, instead making use of arrays which I always believe are
insanely fast.
Then I timed mine, and the opposite is true: my function is about six times
slower than Jerry's.
Looking at them more closely, this still seems surprising to me. I think
we're doing the same number of additions; the same number of loops. I'm
accessing the array twice as often as Jerry is accessing tRunningSum, but I
would expect that to be more than offset by the effort of cropping the string.
Why is Jerry's function so much faster than mine?
function cleverCatJerry tRay
local tSlices, tRunningSum, tLoopCount, tItem, tMsec
put 0 into tSlices
put 0 into tRunningSum
put the number of items in tRay into tLoopCount
repeat tLoopCount times
put 0 into tRunningSum
repeat for each item tItem in tRay
add tItem to tRunningSum
if tRunningSum >= 32 then add 1 to tSlices
end repeat
delete item 1 of tRay
end repeat
return tSlices
end cleverCatJerry
function cleverCatBen tNumbers
local iNumSlices, aSumFromLoc, index, i
put 0 into iNumSlices
put empty into aSumFromLoc
put 0 into index
repeat for each item n in tNumbers
add 1 to index
repeat with i = 1 to index
add n to aSumFromLoc[i]
if aSumFromLoc[i] > 31 then add 1 to iNumSlices
end repeat
end repeat
return iNumSlices
end cleverCatBen
More information about the use-livecode
mailing list