Another week, another riddler. The problem is:

*Consider four square-shaped ranches, arranged in a two-by-two pattern, as if part of a larger checkerboard. One family lives on each ranch, and each family builds a small house independently at a random place within the property. Later, as the families in adjacent quadrants become acquainted, they construct straight-line paths between the houses that go across the boundaries between the ranches, four in total. These paths form a quadrilateral circuit path connecting all four houses. This circuit path is also the boundary of the area where the families’ children are allowed to roam.*

*What is the probability that the children are able to travel in a straight line from any allowed place to any other allowed place without leaving the boundaries? (In other words, what is the probability that the quadrilateral is convex?)*

I wish I could say I did something cool. Instead I just brute forced it. After ten million iterations the resulting probability of a convex ranch is **9.09%**

github

import random import matplotlib.pyplot as plt from matplotlib.path import Path import matplotlib.patches as patches def dot_prod(A,B,C): #Ax,Ay,Bx,By,Cx,Cy): #Find the vector components BAx = B[0] - A[0] #Bx-Ax BAy = B[1] - A[1] #By-Ay BCx = C[0] - B[0] #Cx-Bx BCy = C[1] - B[1] #Cy-By #Find cross prod return BAx*BCy-BAy*BCx def draw_ranch(coords,iteration,fail): codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY, ] verts = [ (coords[0][0], coords[0][1]), # left, bottom (coords[3][0], coords[3][1]), # left, top (coords[2][0], coords[2][1]), # right, top (coords[1][0], coords[1][1]), # right, bottom (0., 0.), # ignored ] path = Path(verts, codes) fig = plt.figure() plt.axhline(y=1, xmin=0, xmax=2, linewidth=1, color = 'k', linestyle='dashed') plt.axvline(x=1, ymin=0, ymax=2, linewidth=1, color = 'k', linestyle='dashed') ax = fig.add_subplot(111) if fail: patch = patches.PathPatch(path, ec='r', facecolor='none', lw=1) else: patch = patches.PathPatch(path, ec='g', facecolor='none', lw=1) ax.add_patch(patch) xs, ys = zip(*verts[0:4]) ax.plot(xs, ys, 'x', lw=2, color='black', ms=10) ax.set_xlim(0,2) ax.set_ylim(0,2) plt.savefig(str(iteration)+'.png') #plt.show() plt.clf() plt.close() return def check_convexity(coordinates,iteration): got_neg = False got_paws = False num_families = len(coordinates) for i in range(0,num_families): sign = dot_prod(coordinates[i],coordinates[(i+1)%num_families],coordinates[(i+2)%num_families]) if sign > 0: got_paws = True else: got_neg = True #Draw and show data if you want #if (got_paws & got_neg): #print(coord1," ",coord2," ",coord3) #print(sign," ",got_paws," ",got_neg) #draw_ranch(coordinates,iteration,(got_paws & got_neg)) return got_paws & got_neg #Returns false if they were all the same sign def run_tests(iterations): num_convex = 0 total = 0 for j in range(0,iterations): coords = [[random.random(),random.random()],[random.random()+1,random.random()],[random.random()+1,random.random()+1],[random.random(),random.random()+1]] num_convex = check_convexity(coords,j) + num_convex total = total + 1 return float(num_convex/total) print(run_tests(10000000))