Project Euler Problem #109

Problem #109 concerns checking out in a game of darts. The question reads:

My solution for this problem is another example of the powers of brute force. Here’s my solution:

Solution #1: Brute Force Approach

We simply check every combination of dart scores that end in a double and count the ones with a total less than 100. There are 62 possibilities for each of the three darts, so at most there are 62^3 = 238328 possibilities to consider. Here’s an implementation of this approach in Python 2.7:

 '''
 Author: Walker Kroubalkian
 Brute Force Approach to Project Euler Problem #109
 '''
 
 import time
 
 def checkout(n):
     possible = [25,50]
     for x in range(1,21):
         possible.append(x)
         possible.append(2*x)
         possible.append(3*x)
     possible = sorted(possible)
     total = 0
     for a in possible:
         v = n-a
         for b in possible:
             if(b>a):
                 break
             else:
                 w = v-b
                 if(w%2==0 and (w<=40 or w==50)):
                     total+=1
     return total
 
 def projectEulerProblemOneHundredNine(n):
     possible = [25,50]
     doubles = []
     for x in range(1,21):
         possible.append(x)
         possible.append(2*x)
         possible.append(3*x)
         doubles.append(2*x)
     possible = sorted(possible)
     doubles.append(50)
     total = 0
     l = len(possible)
     for i in range(l):
         for j in range(i,l):
             v = possible[i]+possible[j]
             for d in doubles:
                 if v+d<n:
                     total+=1
                 else:
                     break
             if v>=n:
                 break
     for i in range(l):
         v = possible[i]
         for d in doubles:
             if v+d<n:
                 total+=1
             else:
                 break
         if v>=n:
             break
     for d in doubles:
         if d<n:
             total+=1
         else:
             break
     return total
 
 start = time.time()
 print projectEulerProblemOneHundredNine(100)
 print ("--- %s seconds ---" % (time.time()-start))
 
 '''
 Prints
 
 38182
 --- 0.00199699401855 seconds ---
 
 for input of n = 100.
 '''  

And with that, we’re done. While this may have been a brute force solution, it was more than efficient enough for this problem. I may come back to this problem eventually to look for a different approach.

Thanks for reading! See you tomorrow.

Published by Walker Kroubalkian

My name is Walker Kroubalkian. I really enjoy math, computer science, and hiking.

Leave a comment

Design a site like this with WordPress.com
Get started