python coding contest

Tim Hochberg tim.hochberg at ieee.org
Fri Dec 30 11:29:31 EST 2005


Shane Hathaway wrote:
> Andrew Durdin wrote:
> 
>>On 12/28/05, Shane Hathaway <shane at hathawaymix.org> wrote:
>>
>>
>>>I just found a 125 character solution.  It's actually faster and more
>>>readable than the 133 character solution (though it's still obscure.)
>>
>>
>>Having spent a good deal of time and effort, and not getting below 144
>>characters, I am now very eager to see how these shorter versions
>>work, particularly the 6  120-character solutions. I also expect that
>>someone (I'll certainly give it a try) will produce a yet shorter
>>version after the contest closes, based on the knowledge from the
>>winning solutions.
> 
> 
> Roberto Alsina fully documented his 120 byte solution here:
> 
> http://www.pycs.net/lateral/weblog/2005/12/29.html#P333
> 
> My 120 byte solution is equivalent.  Many others probably did the same 
> thing.  Python's philosophy of one way to do it seems to be leading us 
> all down the same road.
> 
> However, it still feels like there's room for improvement.  I have a 123 
> byte solution based on a fairly repetitive 21 character string; if I 
> could compress the representation of the string, it could win.

Apparently there was as someone put out a 119 byte solution. I can't get 
to Roberto's code at present (perhaps he's suffering a bandwidth 
crisis?), but it seems that my 120 character solution is different. It 
sounds like he encoded his as a row at a time and did two loops one for 
each character and one for each row. I encoded the data per character 
and did three loops one per column, one per character and one per row. 
I'm sure that's not clear, so here's the code:

g=''.join;seven_seg=lambda i:g(
g(' _|x|'[ord("~$]m'k{d\x7fo"[int(n)])>>s&j]
for n in i for j in(2,1,4))+'\n'for s in(6,0,3))

I've replaced the unprintable characters and added some preemptive 
linebreaks so that hopefully this won't get too munged. It's all clear 
now, right? Two hints: 6,0,3->row, 2,1,4->column and the 6 and 1 have to 
be where they are to exploit the property that the top row only ever has 
a center character in it. That way things can be encoded in 7-bits and 
fit in a character string that Python likes. The order of the other loop 
indices is mostly accidental but not all permutations may work.

I'm off to try to figure out how to do it the other way now, before the 
code gets revealed.


-tim
-tim





More information about the Python-list mailing list