logoTh!nk Again


Python: Hallar el punto de intersección entre dos segmentos

Posted in Algoritmos, Ejemplos, Python by admin on the September 11th, 2009

Este segmento de código devuelve el punto de intersección entre dos rectas, no se consideran el caso de que no exista o exista más de uno (lineas paralelas). Depende del valor de la variable det, si es igual a cero, es necesario verificar que las lineas sean paralelas, si no lo son, entonces nunca se tocan.

#/usr/bin/env python
#interseccion EN UN UNICO PUNTO entre segmentos
class punto:
  def __init__(self,x,y):
    self.x = x
    self.y = y
  def __str__(self):
    return "("+str(self.x)+","+str(self.y)+")"
class linea:
  def __init__(self, p0, p1):
    self.p0 = p0
    self.p1 = p1
    self.A = p1.x - p0.x
    self.B = p1.y - p0.y
    self.C = p1.x*p0.y - p0.x*p1.y
  def intersecta(self, otro):
    det = self.A*otro.B - otro.A*self.B
    x = otro.A*self.C-self.A*otro.C
    y = otro.B*self.C-self.B*otro.C
    return punto(x/det,y/det)
   
  def __str__(self):
    return str(self.p0) + "," + str(self.p1)
   
if __name__=="__main__":
  l1 =linea(punto(0,0),punto(10,10))
  l2 =linea(punto(10,0),punto(0,10)) 
  print l1,l2
  print l1.intersecta(l2)

Python: calcular los n primeros números primos

Posted in Algoritmos, Python by admin on the September 8th, 2009

No conozco otro lenguaje más flexible y fácil que python. Este código te permite obtener los n primos menores que la variable MAX.

#/usr/bin/env python
#calcula los primos menores que 100
MAX = 100
primos = [2]

for k in range(3, MAX):
  for i in range(len(primos)):   
    if k%primos[i]==0: break
 
  if i==len(primos)-1: #solo si no es multimplo de los actuales primos
    primos.append(k)       
print primos

Python: Recorridos en un árbol

Posted in Algoritmos, Python by admin on the September 7th, 2009

Una manera muy fácil de representar un árbol binario es utilizando un vector. A partir de esta representación es fácil ejemplificar los recorridos en un árbol: pre-orden, in-orden y post-orden.

#/usr/bin/env python
arbol = [5,3,7,2,4,6,9]
#como se representa un arbol binario casi-completo con una lista?
#    5      Nos enfocamos en el nodo 7, su indice en la lista es 2,
#   / \     el hijo izquierdo esta en la posicion 2*indice + 1
#  3   7    y el hijo derecho esta en la posicion 2*indice + 2
# / \ / \
#2  4 6  9
def postorden(nodo): #id*
  if nodo >= len(arbol): #nodo sin hijo
    return
  else:  
    postorden(2*nodo+1) #subarbol izquierdo
    postorden(2*nodo+2) #subarbol derecho
    print arbol[nodo],

def preorden(nodo): #*id
  if nodo >= len(arbol): #nodo sin hijo
    return
  else:  
    print arbol[nodo],
    preorden(2*nodo+1) #subarbol izquierdo
    preorden(2*nodo+2) #subarbol derecho

def inorden(nodo): #i*d
  if nodo >= len(arbol): #nodo sin hijo
    return
  else:    
    inorden(2*nodo+1) #subarbol izquierdo
    print arbol[nodo],
    inorden(2*nodo+2) #subarbol derecho

if __name__=="__main__":   
  print "pre-orden:"
  preorden(0)
  print "\nin-orden:"
  inorden(0)
  print "\npost-orden:"
  postorden(0)

Salida desde la terminal

pre-orden:
5 3 2 4 7 6 9
in-orden:
2 3 4 5 6 7 9
post-orden:
2 4 3 6 9 7 5

¿Cómo reservar el espacio de listas anidadas en Python?

Posted in Programming Languages, Python by admin on the June 27th, 2009

Si quieres crear una lista de n niveles inicializada con un valor por default, con las dimensiones [d1,d2,...,dn], esta función reserva_lista hará el trabajo por ti. A continuación se muestra un ejemplo de uso:

>>> def reserva_lista(niveles,index=0):
...     "crea una lista inicializada a 0's con dimensiones 'niveles'"
...     if index == len(niveles):
...             return 0               
...     level = niveles[index]         
...     lista = [ [] for x in range(level)]     
...     for i in range(level):                 
...             lista[i] = reserva_lista(niveles,index+1)
...     return lista
...
>>> a = reserva_lista([2,3,4])
>>> a
[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]
>>>

hack del día: ¿Cómo copiar listas anidadas en Python?

Posted in Programming Languages, Python by admin on the June 26th, 2009

Después de una tarde de estar escribiendo código en Python, tuve la necesidad de hacer una copia de listas y no encontré un método que resolviera el problema. Así que mejor implemente esta función de clone_list que funciona incluso con listas anidadas.

>>> import types
>>> def clone_list(lista):             
...     if type(lista)!=types.ListType:
...             return lista   
...     copia=[]
...     for element in lista:
...             copia += [clone_list(element)]
...     return copia
...
>>> a = [1,[2,3],'nombre',['a',{'b':1,'c':2,'d':3}],[[['x','y','z']]]]
>>> b = clone_list(a)
>>> b[3]='challenges.qumax.org'
>>> b
[1, [2, 3], 'nombre', 'challenges.qumax.org', [[['x', 'y', 'z']]]]
>>> a
[1, [2, 3], 'nombre', ['a', {'c': 2, 'b': 1, 'd': 3}], [[['x', 'y', 'z']]]]
>>>