Python: Hallar el punto de intersección entre dos segmentos
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.
#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
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.
#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
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.
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
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?
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:
![]()
... "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?
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.
![]()
>>> 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']]]]
>>>
