# your code goes here
__author__ = 'sidharthgoyal'
import math
increment = 0.1
startingPoint = [1, 1]
point1 = [1,5]
point2 = [6,4]
point3 = [5,2]
point4 = [2,1]
def distance(x1, y1, x2, y2):
dist = math.pow(x2-x1, 2) + math.pow(y2-y1, 2)
return dist
def sumOfDistances(x1, y1, px1, py1, px2, py2, px3, py3, px4, py4):
d1 = distance(x1, y1, px1, py1)
d2 = distance(x1, y1, px2, py2)
d3 = distance(x1, y1, px3, py3)
d4 = distance(x1, y1, px4, py4)
return d1 + d2 + d3 + d4
def newDistance(x1, y1, point1, point2, point3, point4):
d1 = [x1, y1]
d1temp = sumOfDistances(x1, y1, point1[0],point1[1], point2[0],point2[1],
point3[0],point3[1], point4[0],point4[1] )
d1.append(d1temp)
return d1
minDistance = sumOfDistances(startingPoint[0], startingPoint[1], point1[0],point1[1], point2[0],point2[1],
point3[0],point3[1], point4[0],point4[1] )
flag = True
def newPoints(minimum, d1, d2, d3, d4):
if d1[2] == minimum:
return [d1[0], d1[1]]
elif d2[2] == minimum:
return [d2[0], d2[1]]
elif d3[2] == minimum:
return [d3[0], d3[1]]
elif d4[2] == minimum:
return [d4[0], d4[1]]
i = 1
while flag:
d1 = newDistance(startingPoint[0]+increment, startingPoint[1], point1, point2, point3, point4)
d2 = newDistance(startingPoint[0]-increment, startingPoint[1], point1, point2, point3, point4)
d3 = newDistance(startingPoint[0], startingPoint[1]+increment, point1, point2, point3, point4)
d4 = newDistance(startingPoint[0], startingPoint[1]-increment, point1, point2, point3, point4)
print i,' ', round(startingPoint[0], 2), round(startingPoint[1], 2)
minimum = min(d1[2], d2[2], d3[2], d4[2])
if minimum < minDistance:
startingPoint = newPoints(minimum, d1, d2, d3, d4)
minDistance = minimum
#print i,' ', round(startingPoint[0], 2), round(startingPoint[1], 2)
i+=1
else:
flag = False
IyB5b3VyIGNvZGUgZ29lcyBoZXJlCl9fYXV0aG9yX18gPSAnc2lkaGFydGhnb3lhbCcKaW1wb3J0IG1hdGgKCmluY3JlbWVudCA9IDAuMQpzdGFydGluZ1BvaW50ID0gWzEsIDFdCnBvaW50MSA9IFsxLDVdCnBvaW50MiA9IFs2LDRdCnBvaW50MyA9IFs1LDJdCnBvaW50NCA9IFsyLDFdCgpkZWYgZGlzdGFuY2UoeDEsIHkxLCB4MiwgeTIpOgogICAgZGlzdCA9IG1hdGgucG93KHgyLXgxLCAyKSArIG1hdGgucG93KHkyLXkxLCAyKQogICAgcmV0dXJuIGRpc3QKCmRlZiBzdW1PZkRpc3RhbmNlcyh4MSwgeTEsIHB4MSwgcHkxLCBweDIsIHB5MiwgcHgzLCBweTMsIHB4NCwgcHk0KToKICAgIGQxID0gZGlzdGFuY2UoeDEsIHkxLCBweDEsIHB5MSkKICAgIGQyID0gZGlzdGFuY2UoeDEsIHkxLCBweDIsIHB5MikKICAgIGQzID0gZGlzdGFuY2UoeDEsIHkxLCBweDMsIHB5MykKICAgIGQ0ID0gZGlzdGFuY2UoeDEsIHkxLCBweDQsIHB5NCkKCiAgICByZXR1cm4gZDEgKyBkMiArIGQzICsgZDQKCmRlZiBuZXdEaXN0YW5jZSh4MSwgeTEsIHBvaW50MSwgcG9pbnQyLCBwb2ludDMsIHBvaW50NCk6CiAgICBkMSA9IFt4MSwgeTFdCiAgICBkMXRlbXAgPSBzdW1PZkRpc3RhbmNlcyh4MSwgeTEsIHBvaW50MVswXSxwb2ludDFbMV0sIHBvaW50MlswXSxwb2ludDJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQzWzBdLHBvaW50M1sxXSwgcG9pbnQ0WzBdLHBvaW50NFsxXSApCiAgICBkMS5hcHBlbmQoZDF0ZW1wKQogICAgcmV0dXJuIGQxCgptaW5EaXN0YW5jZSA9IHN1bU9mRGlzdGFuY2VzKHN0YXJ0aW5nUG9pbnRbMF0sIHN0YXJ0aW5nUG9pbnRbMV0sIHBvaW50MVswXSxwb2ludDFbMV0sIHBvaW50MlswXSxwb2ludDJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQzWzBdLHBvaW50M1sxXSwgcG9pbnQ0WzBdLHBvaW50NFsxXSApCmZsYWcgPSBUcnVlCgpkZWYgbmV3UG9pbnRzKG1pbmltdW0sIGQxLCBkMiwgZDMsIGQ0KToKICAgIGlmIGQxWzJdID09IG1pbmltdW06CiAgICAgICAgcmV0dXJuIFtkMVswXSwgZDFbMV1dCiAgICBlbGlmIGQyWzJdID09IG1pbmltdW06CiAgICAgICAgcmV0dXJuIFtkMlswXSwgZDJbMV1dCiAgICBlbGlmIGQzWzJdID09IG1pbmltdW06CiAgICAgICAgcmV0dXJuIFtkM1swXSwgZDNbMV1dCiAgICBlbGlmIGQ0WzJdID09IG1pbmltdW06CiAgICAgICAgcmV0dXJuIFtkNFswXSwgZDRbMV1dCgppID0gMQp3aGlsZSBmbGFnOgogICAgZDEgPSBuZXdEaXN0YW5jZShzdGFydGluZ1BvaW50WzBdK2luY3JlbWVudCwgc3RhcnRpbmdQb2ludFsxXSwgcG9pbnQxLCBwb2ludDIsIHBvaW50MywgcG9pbnQ0KQogICAgZDIgPSBuZXdEaXN0YW5jZShzdGFydGluZ1BvaW50WzBdLWluY3JlbWVudCwgc3RhcnRpbmdQb2ludFsxXSwgcG9pbnQxLCBwb2ludDIsIHBvaW50MywgcG9pbnQ0KQogICAgZDMgPSBuZXdEaXN0YW5jZShzdGFydGluZ1BvaW50WzBdLCBzdGFydGluZ1BvaW50WzFdK2luY3JlbWVudCwgcG9pbnQxLCBwb2ludDIsIHBvaW50MywgcG9pbnQ0KQogICAgZDQgPSBuZXdEaXN0YW5jZShzdGFydGluZ1BvaW50WzBdLCBzdGFydGluZ1BvaW50WzFdLWluY3JlbWVudCwgcG9pbnQxLCBwb2ludDIsIHBvaW50MywgcG9pbnQ0KQogICAgcHJpbnQgaSwnICcsIHJvdW5kKHN0YXJ0aW5nUG9pbnRbMF0sIDIpLCByb3VuZChzdGFydGluZ1BvaW50WzFdLCAyKQogICAgbWluaW11bSA9IG1pbihkMVsyXSwgZDJbMl0sIGQzWzJdLCBkNFsyXSkKICAgIGlmIG1pbmltdW0gPCBtaW5EaXN0YW5jZToKICAgICAgICBzdGFydGluZ1BvaW50ID0gbmV3UG9pbnRzKG1pbmltdW0sIGQxLCBkMiwgZDMsIGQ0KQogICAgICAgIG1pbkRpc3RhbmNlID0gbWluaW11bQogICAgICAgICNwcmludCBpLCcgJywgcm91bmQoc3RhcnRpbmdQb2ludFswXSwgMiksIHJvdW5kKHN0YXJ0aW5nUG9pbnRbMV0sIDIpCiAgICAgICAgaSs9MQogICAgZWxzZToKICAgICAgICBmbGFnID0gRmFsc2UK