# Sunday Times Teaser 3024 – Triple Jump

### by Bill Kinally

#### Published Sunday September 06 2020 (link)

From a set of playing cards, Tessa took 24 cards consisting of three each of the aces, twos, threes, and so on up to the eights. She placed the cards face up in single row and decided to arrange them such that the three twos were each separated by two cards, the threes were separated by three cards and so forth up to and including the eights, duly separated by eight cards. The three aces were numbered with a one and were each separated by nine cards. Counting from the left, the seventh card in the row was a seven.

In left to right order, what were the numbers on the first six cards?

Brian:
Once again, you’ve come up with a very elegant and instructive solution
but the ‘if’ statement:

is unnecessary because the range in the previous ‘for’ statement

prevents this from ever being false:

the maximum of k is 21-2*i Substituting this in the expression of the ‘if’ statement:

21 – 2*i + 2*i + 2 < 24

gives

23 < 24

which is always true (and also true for values of k less than the maximum).

Thanks John,

I added the 2 * (11 – i) range to my original solution later and didn’t notice that
the validity check was no longer needed. I’ll update it.

@Frits

Thank you for posting a very interesting solution and one that is also very fast (it runs on my system in 350$$\mu$$s). I hope you won’t mind if I make a few comments.

First, shouldn’t the comment on line 36 refer to card ‘positions’ rather than card ‘values’? Second, the construction on lines 49 and 50 is truly horrible! Although I encourage a two space indent on this site to save horizontal space, I otherwise encourage people who post here to stay close to the Python PEP8 style guide in order to give the site a consistent ‘look and feel’. And the construction on lines 49/50 is listed in PEP8 as a ‘definitely not’! In any event, as I’m sure you know, it is an easy Python one liner using the ‘A if C else B’ construct.

On a more interesting note, Jim Randell had a specific reason for using middle card positions but once you hard code the index ranges this no longer gives you any advantage over the use of the lowest card positions and actually produces less clarity in the resulting code. Here, for example, is my version of your approach (which runs at the same speed on my system):

Hi John

Thank you for posting your solution.

I hope you don’t mind this request, but I would be most grateful if you could use Python’s style guide when formatting your code as this makes it easier to understand posted code and also helps to maintain a consistent ‘look and feel’ for this site as a whole.

In the main, the guide (known in Python jargon as ‘PEP8’) encourages spaces around binary operators, equal signs, etc. and generally discourages statements on the same line after ‘:’s (it accepts very short statements here such as ‘return’ or ‘continue’ but I prefer to avoid these exceptions anyway since they can visually obscure program structure).

The guide, which is available here, is well worth a read.

Hi Brian,

I like your “lvd” determination using enumerate. A space after “v:” would have improved my immediate understanding.

I am not used coding conditional logic at the right hand side of an assignment. I knew it but forgot it. As line 49/50 is probably executed only once I coded it the old fashioned / lazy way without using too many lines. I have read the PEP8 guide but find the “definitely not” a bit harsh. It doesn’t look very ugly to me.

I have made a different version of the first card variant.
It uses hardcoded values for the possible first card positions.

May I ask how you test (or debug) Python code?
I use a normal text editor for the code and a DOS window for testing the code.

Hi Frits,

I use two development environments depending on what sort of development I am doing. For most of my fun stuff (like that here) I use the Wing IDE. For my professional Python (and C/C++) code I use Microsoft Visual Studio.

For timing Python code that runs in 100 milliseconds or more I typically use the Python profile program but for fast code I use a small timer class:

and then embed the code to be timed in a with clause:

I use ‘timed’ above as a decorator to time subroutines.

This produces pretty consistent timing except if a timing run catches the garbage collector (which is obvious and hence easily avoided by doing a few repeat timings).. I don’t use total run times as I don’t want to include interpreter load times etc.

Thanks.

I will have a look at Wing IDE.

Timer() runs fine with CPython 3.8.5 but not (yet) with PyPy (Python 3.6.9) as perf_counter_ns has only been introduced with version 3.7.

For my fun stuff I always use the latest Python version (soon to be 3.9) and I don’t use PyPy because they don’t offer it as a 64-bit application on Windows (and I don’t have the time to port it).