title: Pycontest
link: http://jj.isgeek.net/2005/12/pycontest/
author: Jj
description: 
post_id: 82
date: 2005/12/30 11:01:07
created_gmt: 2005/12/30 16:01:07
comment_status: open
slug: pycontest

![Pycontest](https://bm.isgeek.net/dd/1b/d0f1f60c2c74d8b5c5d99912f11136dd1fa1c86af80d2adebe6ed87f595b.png)

[Pycontest](http://www.pycontest.net/), es un concurso que busca obtener la soluciÃ³n mas pequeÃ±a al problema de convertir un nÃºmero dado a un formato de [display de 7 leds](http://en.wikipedia.org/wiki/Seven-segment_display).

"31415" se verÃ­a algo asi:
    
    
     _           _ 
    
    
    
    
     _|  ||_|  ||_ 
    
    
    
    
     _|  |  |  | _|

El premio es un [teclado!](http://www.getdigital.de/index/0xdd).

Mi cÃ³digo tiene 185 caracteres con lo que me pone en puesto 194(al momento que lo enviÃ©), aquÃ­ estÃ¡:
    
    
    
    
    
    
    def seven_seg(x): return "".join(["".join([[' _|','   ','|_ ','| |',' _ ','|_|','  |'][int("435166402400156420425466455450"[3*int(j):3*int(j)+3][i])] for j in x])+"\n" for i in 0,1,2])
    
    
    
    
    

Ahora que lo veo y lo pienso con calma se me ocurren algunas mejoras que se le pocrÃ­an hacer para ocupar menos espacio:

  * PodrÃ­a hacerlo mas corto si lo hiciera recursivamente, `seven_seg("801") = seven_seg("8")+seven_seg("01")` o algo por ahi, asignar la funciÃ³n a una variable `f()` para ahorrar espacio. Quizas usando `labmda`

  * Se debe comprimir mi numero "435166402400156420425466455450" a alguna base mayor (36) para que ocupe menos espacio. AhorrarÃ­a unos 10 bytes

  * Comprimir el nÃºmero en caractÃ©res no ASCII(almacenar en los bytes) para ocupar menos espacio podrÃ­a ayudar, usar `ord("numero"[n])`. Ã‰se nÃºmero de 30 bytes es demasiado grande deberÃ­a ocupar sÃ³lo 10.

  * PodrÃ­a reordenar el arreglo `[' _|',' ','|_ ','| |',' _ ','|_|',' |']` para evitar muchos caracteres que se repiten y usarlo como un solo string, ahorrarÃ­a 18 bytes en las comas y apÃ³strofes mas unos cuantos bytes extra.

El concurso termina hoy asÃ­ que no le dediquÃ© mas tiempo a pensarlas e implementarlas :-P

En realidad convertir el nÃºmero a base 36 no ahorra tanto espacio, debido a las funciones `int(s,36)` y `str()` que habrÃ­a que usar. Acabo de convertir el nÃºmero y salio `166ucclerfg2crw6zdlm`

El [actual ganador](http://www.pycontest.net/ranking/) tiene un cÃ³digo de 119 bytes!

Ya es muy tarde para enviarlo nuevamente, pero tengo una pequeÃ±a mejora, como 10 bytes menos:
    
    
    
    
    
    
    def seven_seg(x): return "".join(["".join([[' _|','   ','|_ ','| |',' _ ','|_|','  |'][int("435166402400156420425466455450"[3*int(j)+i])] for j in x])+"\n" for i in 0,1,2])

## Comments

**[Q_NERD](#90 "2006-01-03 03:13:55"):** ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ...

