def f(p):
x,y=zip(*p);L=(X:=max(x),Y:=max(y)),(X,y:=min(y)),(x:=min(x),Y),(x,y);G=[]
for Q in p:
for W in p-{Q}:
if(Q in L)*(W in L):G={*G,Q,W};continue
if z:=W[0]-Q[0]:
S=(W[1]-Q[1])/z;B=W[1]-S*W[0];F=O=0
for i,h in(0,y),(1,Y):
if(x<=(h-B)/S<=X)*S:
O=1
for u,v in p-{Q,W}:F|=[h<=v<=S*u+B,S*u+B<=v<=h][i]
if F<O:G={*G,Q,W}
return G
s = [['{{1, 1}, {2, 2}, {3, 3}, {1, 3}}', '{{3, 3}, {1, 3}, {1, 1}}'], ["""{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}""", """{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}"""], ["""{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}""", """{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}"""]]
for i in s:
a, b=map(lambda x:eval(x.replace('{','(').replace('}', ')')), i)
assert sorted(f({*a})) == sorted(b)
print('tests passed')
ZGVmIGYocCk6CiB4LHk9emlwKCpwKTtMPShYOj1tYXgoeCksWTo9bWF4KHkpKSwoWCx5Oj1taW4oeSkpLCh4Oj1taW4oeCksWSksKHgseSk7Rz1bXQogZm9yIFEgaW4gcDoKICBmb3IgVyBpbiBwLXtRfToKICAgaWYoUSBpbiBMKSooVyBpbiBMKTpHPXsqRyxRLFd9O2NvbnRpbnVlCiAgIGlmIHo6PVdbMF0tUVswXToKICAgIFM9KFdbMV0tUVsxXSkvejtCPVdbMV0tUypXWzBdO0Y9Tz0wCiAgICBmb3IgaSxoIGluKDAseSksKDEsWSk6CiAgICAgaWYoeDw9KGgtQikvUzw9WCkqUzoKICAgICAgTz0xCiAgICAgIGZvciB1LHYgaW4gcC17USxXfTpGfD1baDw9djw9Uyp1K0IsUyp1K0I8PXY8PWhdW2ldCiAgICBpZiBGPE86Rz17KkcsUSxXfQogcmV0dXJuIEcKIApzID0gW1sne3sxLCAxfSwgezIsIDJ9LCB7MywgM30sIHsxLCAzfX0nLCAne3szLCAzfSwgezEsIDN9LCB7MSwgMX19J10sIFsiIiJ7ezQuNCwgMTR9LCB7Ni43LCAxNS4yNX0sIHs2LjksIDEyLjh9LCB7Mi4xLCAxMS4xfSwgezkuNSwgMTQuOX0sIAogezEzLjIsIDExLjl9LCB7MTAuMywgMTIuM30sIHs2LjgsIDkuNX0sIHszLjMsIDcuN30sIHswLjYsIDUuMX0sIHs1LjMsIDIuNH0sIAogezguNDUsIDQuN30sIHsxMS41LCA5LjZ9LCB7MTMuOCwgNy4zfSwgezEyLjksIDMuMX0sIHsxMSwgMS4xfX0iIiIsICIiInt7MTMuOCwgNy4zfSwgezEzLjIsIDExLjl9LCB7OS41LCAxNC45fSwgezYuNywgMTUuMjV9LCB7NC40LCAxNH0sIAogezIuMSwgMTEuMX0sIHswLjYsIDUuMX0sIHs1LjMsIDIuNH0sIHsxMSwgMS4xfSwgezEyLjksIDMuMX19IiIiXSwgWyIiInt7MSwgMH0sIHsxLCAxfSwgezEsIC0xfSwgezAuNjg5NTcsIDAuMjgzNjQ3fSwgezAuOTA5NDg3LCAwLjY0NDI3Nn0sIAogezAuMDM2MTg3NywgMC44MDM4MTZ9LCB7MC41ODMwMDQsIDAuOTE1NTV9LCB7LTAuNzQ4MTY5LCAwLjIxMDQ4M30sIAogey0wLjU1MzUyOCwgLTAuOTY3MDM2fSwgezAuMzE2NzA5LCAtMC4xNTM4NjF9LCB7LTAuNzkyNjcsIDAuNTg1OTQ1fSwKIHstMC43MDAxNjQsIC0wLjc1MDk5NH0sIHswLjQ1MjI3MywgLTAuNjA0NDM0fSwgey0wLjc5MTM0LCAtMC4yNDk5MDJ9LCAKIHstMC41OTQ5MTgsIC0wLjM5NzU3NH0sIHstMC41NDczNzEsIC0wLjQzNDA0MX0sIHswLjk1ODEzMiwgLTAuNDk5NjE0fSwgCiB7MC4wMzk5NDEsIDAuMDk5MDczMn0sIHstMC44OTE0NzEsIC0wLjQ2NDk0M30sIHswLjUxMzE4NywgLTAuNDU3MDYyfSwgCiB7LTAuOTMwMDUzLCAwLjYwMzQxfSwgezAuNjU2OTk1LCAwLjg1NDIwNX19IiIiLCAiIiJ7ezEsIC0xfSwgezEsIDF9LCB7MC41ODMwMDQsIDAuOTE1NTV9LCB7MC4wMzYxODc3LCAwLjgwMzgxNn0sIAogey0wLjkzMDA1MywgMC42MDM0MX0sIHstMC44OTE0NzEsIC0wLjQ2NDk0M30sIHstMC43MDAxNjQsIC0wLjc1MDk5NH0sIAogey0wLjU1MzUyOCwgLTAuOTY3MDM2fX0iIiJdXQoKZm9yIGkgaW4gczoKCWEsIGI9bWFwKGxhbWJkYSB4OmV2YWwoeC5yZXBsYWNlKCd7JywnKCcpLnJlcGxhY2UoJ30nLCAnKScpKSwgaSkKCWFzc2VydCBzb3J0ZWQoZih7KmF9KSkgPT0gc29ydGVkKGIpCgpwcmludCgndGVzdHMgcGFzc2VkJyk=