#!/usr/bin/env python3 import math,random h=.5;W,H=int(140/h),int(110/h) pos=[(x,y) for y in range(0,111,5) for x in range(0,141,5)] def circle(x,y,r): z=0 for j in range(H): b=(j+.5)*h;q=r*r-(b-y)**2 if q>=0: d=math.sqrt(q);l=max(0,math.ceil((x-d)/h-.5));u=min(W-1,math.floor((x+d)/h-.5)) if u>=l:z|=((1<<(u-l+1))-1)<<(j*W+l) return z def square(x,y): z=0;l=max(0,math.ceil((x-5)/h-.5));u=min(W-1,math.floor((x+5)/h-.5)) for j in range(H): b=(j+.5)*h if abs(b-y)<=5 and u>=l:z|=((1<<(u-l+1))-1)<<(j*W+l) return z M=[[circle(x,y,20) for x,y in pos],[circle(x,y,5) for x,y in pos],[square(x,y) for x,y in pos]] idx={p:i for i,p in enumerate(pos)} c2=[(50,20),(125,90),(110,55),(70,55),(90,90),(90,20),(20,90),(30,55),(15,20),(125,20),(55,90)] c1=[(135,50),(5,70),(5,55),(5,45)];squares=[(135,60)] s=[(0,idx[p]) for p in c2]+[(1,idx[p]) for p in c1]+[(2,idx[p]) for p in squares] def uni(ss): u=0 for t,i in ss:u|=M[t][i] return u cur=uni(s).bit_count();print('start',cur*h*h) for sweep in range(6): imp=0 for q in range(len(s)): base=uni(s[:q]+s[q+1:]);t=s[q][0] v,i=max(((base|m).bit_count(),i) for i,m in enumerate(M[t])) if v>cur:s[q]=(t,i);cur=v;imp+=1 print('sweep',sweep,cur*h*h,imp) if not imp:break print([(t,pos[i]) for t,i in s])