# Punto: crea una clase que representa puntos 2D. 
# Poo. 
 
import  math 
 
 
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 ) 
 
if  __name__ ==  "__main__" :
    p0 =  Punto.get_origen ( ) 
    p1 =  Punto( 3 ,  4 ) 
    p2 =  Punto( 5 ,  5 ) 
 
    print ( "Punto 0: "  + str ( p0) ) 
    print ( "Punto 1: "  + str ( p1) ) 
 
    print ( "De" ,  str ( p0) ,  "a" ,  str ( p1) ,  ":" ,  p1.calcula_distancia ( p0) ) 
    print ( "De" ,  str ( p0) ,  "a" ,  str ( p2) ,  ":" ,  p2.calcula_distancia_origen ( ) ) 
 
 
				IyBQdW50bzogY3JlYSB1bmEgY2xhc2UgcXVlIHJlcHJlc2VudGEgcHVudG9zIDJELgojIFBvby4KCmltcG9ydCBtYXRoCgoKY2xhc3MgUHVudG86CiAgICAiIiJSZXByZXNlbnRhIHB1bnRvcyBmb3JtYWRvcyBwb3IgbGFzIGNvb3JkZW5hZGFzIHggZSB5IiIiCgogICAgT1JJR0VOID0gTm9uZQogICAgbnVtX3B1bnRvcyA9IDAKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZ2V0X29yaWdlbigpOgogICAgICAgIGlmIFB1bnRvLk9SSUdFTiA9PSBOb25lOgogICAgICAgICAgICBQdW50by5PUklHRU4gPSBQdW50bygwLCAwKQoKICAgICAgICByZXR1cm4gUHVudG8uT1JJR0VOCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOgogICAgICAgICIiIkNyZWEgdW4gbnVldm8gcHVudG8sIGRhZGFzIGxhcyBjb29yZGVuYWRhcy4KCiAgICAgICAgICAgIDpwYXJhbSB4OiBDb29yZGVuYWRhIHggZGVsIHB1bnRvCiAgICAgICAgICAgIDpwYXJhbSB5OiBDb29yZGVuYWRhIHkgZGVsIHB1bnRvCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi54ID0geAogICAgICAgIHNlbGYueSA9IHkKICAgICAgICBQdW50by5udW1fcHVudG9zICs9IDEKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWEoc2VsZiwgcDIpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBvdHJvCiAgICAgICAgCiAgICAgICAgICAgIDpwYXJhbTogcDIgRWwgb3RybyBwdW50by4KICAgICAgICAgICAgOnJldHVybjogTGEgZGlzdGFuY2lhIGVudHJlIGVzdGUgcHVudG8geSBwMi4KICAgICAgICAiIiIKICAgICAgICBkaXN0YW5jaWFfeCA9IHNlbGYueCAtIHAyLngKICAgICAgICBkaXN0YW5jaWFfeSA9IHNlbGYueSAtIHAyLnkKICAgICAgICByZXR1cm4gbWF0aC5zcXJ0KChkaXN0YW5jaWFfeCAqKiAyKSArIChkaXN0YW5jaWFfeSAqKiAyKSkKCiAgICBkZWYgY2FsY3VsYV9kaXN0YW5jaWFfb3JpZ2VuKHNlbGYpOgogICAgICAgICIiIlJldG9ybmEgbGEgZGlzdGFuY2lhIGRlc2RlIGVsIG9yaWdlbiBkZSBjb29yZGVuYWRhcwogICAgICAgICAgICBhIGVzdGUgcHVudG8KICAgICAgICAgICAgCiAgICAgICAgICAgIDpyZXR1cm46IExhIGRpc3RhbmNpYSBlbnRyZSBhbWJvcyBwdW50b3MiIiIKICAgICAgICByZXR1cm4gc2VsZi5jYWxjdWxhX2Rpc3RhbmNpYShQdW50bygwLCAwKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyLmZvcm1hdCgiKHswfSwgezF9KSIsIHNlbGYueCwgc2VsZi55KQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHAwID0gUHVudG8uZ2V0X29yaWdlbigpCiAgICBwMSA9IFB1bnRvKDMsIDQpCiAgICBwMiA9IFB1bnRvKDUsIDUpCgogICAgcHJpbnQoIlB1bnRvIDA6ICIgKyBzdHIocDApKQogICAgcHJpbnQoIlB1bnRvIDE6ICIgKyBzdHIocDEpKQoKICAgIHByaW50KCJEZSIsIHN0cihwMCksICJhIiwgc3RyKHAxKSwgIjoiLCBwMS5jYWxjdWxhX2Rpc3RhbmNpYShwMCkpCiAgICBwcmludCgiRGUiLCBzdHIocDApLCAiYSIsIHN0cihwMiksICI6IiwgcDIuY2FsY3VsYV9kaXN0YW5jaWFfb3JpZ2VuKCkpCg==