# Poo
# Crea, mediante composición, una clase línea que permita modelar líneas que
# se componen de un punto inicial y otro final.
import math
# No es posible importar el módulo punto en IDEOne, aunque esté presente.
#import punto
class Punto:
"""Representa puntos formados por las coordenadas x e y"""
ORIGEN = None
num_puntos = 0
@ staticmethod
def get_origen( ) :
if Punto.ORIGEN == None :
Punto.ORIGEN = Punto( 0 , 0 )
return Punto.ORIGEN
def __init__ ( self , x, y) :
"""Crea un nuevo punto, dadas las coordenadas.
:param x: Coordenada x del punto
:param y: Coordenada y del punto
"""
self .x = x
self .y = y
Punto.num_puntos += 1
def calcula_distancia( self , p2) :
"""Retorna la distancia entre este punto y otro
:param: p2 El otro punto.
:return: La distancia entre este punto y p2.
"""
distancia_x = self .x - p2.x
distancia_y = self .y - p2.y
return math .sqrt ( ( distancia_x ** 2 ) + ( distancia_y ** 2 ) )
def calcula_distancia_origen( self ) :
"""Retorna la distancia desde el origen de coordenadas
a este punto
:return: La distancia entre ambos puntos"""
return self .calcula_distancia ( Punto( 0 , 0 ) )
def __str__ ( self ) :
return str .format ( "({0}, {1})" , self .x , self .y )
class Linea:
"""Representa lins. formadas por dos puntos, p1 y p2."""
def __init__ ( self , x1, y1, x2, y2) :
"""Crea nuevas lins., dados dos puntos.
:param x1: Coordenada x del primer punto
:param y1: Coordenada y del primer punto
:param x2: Coordenada x del segundo punto
:param y2: Coordenada y del segundo punto
"""
self .p1 = Punto( x1, y1)
self .p2 = Punto( x2, y2)
def calcula_longitud( self ) :
"""Calcula la longitud, distancia entre los dos puntos."""
return self .p1 .calcula_distancia ( self .p2 )
def __str__ ( self ) :
return "({0}, {1})" .format ( self .p1 , self .p2 )
if __name__ == "__main__" :
l = Linea( 1 , 2 , 3 , 4 )
print ( "Línea:" , l, "de longitud:" , l.calcula_longitud ( ) )
IyBQb28KIyBDcmVhLCBtZWRpYW50ZSBjb21wb3NpY2nDs24sIHVuYSBjbGFzZSBsw61uZWEgcXVlIHBlcm1pdGEgbW9kZWxhciBsw61uZWFzIHF1ZQojIHNlIGNvbXBvbmVuIGRlIHVuIHB1bnRvIGluaWNpYWwgeSBvdHJvIGZpbmFsLgoKaW1wb3J0IG1hdGgKCiMgTm8gZXMgcG9zaWJsZSBpbXBvcnRhciBlbCBtw7NkdWxvIHB1bnRvIGVuIElERU9uZSwgYXVucXVlIGVzdMOpIHByZXNlbnRlLgojaW1wb3J0IHB1bnRvCgoKY2xhc3MgUHVudG86CiAgICAiIiJSZXByZXNlbnRhIHB1bnRvcyBmb3JtYWRvcyBwb3IgbGFzIGNvb3JkZW5hZGFzIHggZSB5IiIiCgogICAgT1JJR0VOID0gTm9uZQogICAgbnVtX3B1bnRvcyA9IDAKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZ2V0X29yaWdlbigpOgogICAgICAgIGlmIFB1bnRvLk9SSUdFTiA9PSBOb25lOgogICAgICAgICAgICBQdW50by5PUklHRU4gPSBQdW50bygwLCAwKQoKICAgICAgICByZXR1cm4gUHVudG8uT1JJR0VOCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgogICAgICAgICIiIkNyZWEgdW4gbnVldm8gcHVudG8sIGRhZGFzIGxhcyBjb29yZGVuYWRhcy4KCiAgICAgICAgICAgIDpwYXJhbSB4OiBDb29yZGVuYWRhIHggZGVsIHB1bnRvCiAgICAgICAgICAgIDpwYXJhbSB5OiBDb29yZGVuYWRhIHkgZGVsIHB1bnRvCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi54ID0geAogICAgICAgIHNlbGYueSA9IHkKICAgICAgICBQdW50by5udW1fcHVudG9zICs9IDEKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWEoc2VsZiwgcDIpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBvdHJvCiAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbTogcDIgRWwgb3RybyBwdW50by4KICAgICAgICAgICAgOnJldHVybjogTGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBwMi4KICAgICAgICAiIiIKICAgICAgICBkaXN0YW5jaWFfeCA9IHNlbGYueCAtIHAyLngKICAgICAgICBkaXN0YW5jaWFfeSA9IHNlbGYueSAtIHAyLnkKICAgICAgICByZXR1cm4gbWF0aC5zcXJ0KChkaXN0YW5jaWFfeCAqKiAyKSArIChkaXN0YW5jaWFfeSAqKiAyKSkKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWFfb3JpZ2VuKHNlbGYpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGRlc2RlIGVsIG9yaWdlbiBkZSBjb29yZGVuYWRhcwogICAgICAgICAgICBhIGVzdGUgcHVudG8KICAgICAgICAgICAgCiAgICAgICAgICAgIDpyZXR1cm46IExhIGRpc3RhbmNpYSBlbnRyZSBhbWJvcyBwdW50b3MiIiIKICAgICAgICByZXR1cm4gc2VsZi5jYWxjdWxhX2Rpc3RhbmNpYShQdW50bygwLCAwKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyLmZvcm1hdCgiKHswfSwgezF9KSIsIHNlbGYueCwgc2VsZi55KQoKCmNsYXNzIExpbmVhOgogICAgIiIiUmVwcmVzZW50YSBsaW5zLiBmb3JtYWRhcyBwb3IgZG9zIHB1bnRvcywgcDEgeSBwMi4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgeDEsIHkxLCB4MiwgeTIpOgogICAgICAgICIiIkNyZWEgbnVldmFzIGxpbnMuLCBkYWRvcyBkb3MgcHVudG9zLgoKICAgICAgICAgICAgOnBhcmFtIHgxOiBDb29yZGVuYWRhIHggZGVsIHByaW1lciBwdW50bwogICAgICAgICAgICA6cGFyYW0geTE6IENvb3JkZW5hZGEgeSBkZWwgcHJpbWVyIHB1bnRvCiAgICAgICAgICAgIDpwYXJhbSB4MjogQ29vcmRlbmFkYSB4IGRlbCBzZWd1bmRvIHB1bnRvCiAgICAgICAgICAgIDpwYXJhbSB5MjogQ29vcmRlbmFkYSB5IGRlbCBzZWd1bmRvIHB1bnRvCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5wMSA9IFB1bnRvKHgxLCB5MSkKICAgICAgICBzZWxmLnAyID0gUHVudG8oeDIsIHkyKQoKICAgIGRlZiBjYWxjdWxhX2xvbmdpdHVkKHNlbGYpOgogICAgICAgICIiIkNhbGN1bGEgbGEgbG9uZ2l0dWQsIGRpc3RhbmNpYSBlbnRyZSBsb3MgZG9zIHB1bnRvcy4iIiIKICAgICAgICByZXR1cm4gc2VsZi5wMS5jYWxjdWxhX2Rpc3RhbmNpYShzZWxmLnAyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiKHswfSwgezF9KSIuZm9ybWF0KHNlbGYucDEsIHNlbGYucDIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbCA9IExpbmVhKDEsIDIsIDMsIDQpCiAgICBwcmludCgiTMOtbmVhOiIsIGwsImRlIGxvbmdpdHVkOiIsIGwuY2FsY3VsYV9sb25naXR1ZCgpKQo=