project euler problem #8

Aside

Find the greatest product of five consecutive digits in the following 1000-digit number:

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

http://projecteuler.net/problem=8


highlight below for my solution:


a_string = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"

print max([reduce(lambda x, y : x * y, [int(x) for x in a_string[i:i+5]]) 
           for i in range(len(a_string) - 5)
          ])

[More programming riddles]

project euler problem #6

Aside

The sum of the squares of the first ten natural numbers is,

12 + 22 + … + 10^2 = 385
The square of the sum of the first ten natural numbers is,

(1 + 2 + … + 10)^2 = 552 = 3025
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.

Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.

http://projecteuler.net/problem=6


highlight below for my solution:


# A = (sum[1..n])^2 = [n(n+1)/2] ^ 2
# B = sum[1^2..n^2] = n(n+1)(2n+1)/6
# A-B = n(n+1)(3n^2-n-2)/12


def delta_sum_products_product_sum(n):
    return n * (n + 1) * (3 * (n ** 2) - n - 2) / 12


print delta_sum_products_product_sum(100)
[More programming riddles]

Apple vs. downloaded code: quarantined libraries

i do the majority of my work on OSX based machines – which means that i consistently run into a problem that looks like this:

osx file permissions

the context always throws me for a bit of a loop – usually, i’ve just downloaded some sort of library, or tool, file, and i can’t seem to be able to use it as i intend to. today, for example, i’d downloaded a javascript library and tried serving it via the osx version of apache, as part of an ongoing project – leading to strange looking 404 errors.

almost always (today is no exception), i find hints suggesting some sort of read permission related problem, and i eventually end up listing the file:

bash: ls -al some_file.ext

only to find that i do have read permissions, but the file has that pesky ‘@’ indicator (or, sometimes, a ‘+’ indicator) at the end.

so i’ve learned to associate the ‘@’ or ‘+’ symbol in a permission listing with ‘read permissions denied’, (despite knowing it’s actual meaning: the file has ‘extended permissions’, which is apple-speak for permissions which do not easily map to the unix-like permission system you’ll see at a bash shell)

at any rate, if you run into this kind of problem, there are two easy things you can do to get unstuck:

  1. use the finder to look at the file, and its access permissions – right click on the file, go to “Get Info”, and then expand the “Sharing and Permissions” tab. whatever problem you’re faced with, is almost always fixable from there.
  2. try finding the same info, only from the bash prompt – try running:
bash: xattr -d com.apple.FinderInfo

project euler problem #7

Aside

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?

http://projecteuler.net/problem=7


highlight below for my solution:


#using a prime number set datastructure - https://gist.github.com/aausch/6709819
p =  PrimeSet()

i = 10001

while (len(p)<10001):
    i in p
    i += i

print sorted(list(p))[10000]

(see also my solution to problem #5)


[More programming riddles]

project euler problem #5

Aside

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?

http://projecteuler.net/problem=5


highlight below for my solution:


#using a prime number set datastructure - https://gist.github.com/aausch/6709819
p = PrimeSet()

def min_product(n):
    n in p #initialize the PrimeSet with all primes less than n
    product = 1
    for prime in p:
        product = product * (prime ** (int(n ** (1.0/prime))))
    return product

print min_product(20)

(see also my solution to problem #3)


[More programming riddles]

project euler problem #3

Aside

The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?

http://projecteuler.net/problem=3


highlight below for my solution:


#using a prime number set datastructure - https://gist.github.com/aausch/6709819
p_set = PrimeSet()
n = 600851475143
sqrt = int(n ** 0.5) 
p_set[sqrt]
max_factor = 1
for x in p_set:
    if n % x == 0 and x > max_factor:
        max_factor = x       
print max_factor


[More programming riddles]

project euler problem #2

Aside

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

http://projecteuler.net/problem=2


  • try solving it as a python one-liner – i couldn’t figure out a clean solution
  • try optimizing your solution for speed

highlight below for my solution:


#using a fibonacci dictionary - https://gist.github.com/aausch/6707846
fib_dict = FibDict()
j = 3
while (fib_dict[j] < 4000000):
    j = j + 3
print sum([fib_dict[i] for i in range(3,j,3)])  # j = 36, probably


[More programming riddles]

sorting for humans

Aside

how would you go about implementing natural string sort in python?
seeknuance


natural sort order – it’s like encryption. everyone tries to roll their own, and it never works out well (if you didn’t follow the link above, jeff atwood said it best).

don’t reinvent the wheel unless you really have to. for the code in post linked above, i’d say, “don’t forget about capital letters”, and also, “length is not as important as you’d think”. imagine, for example, this [low-end,value,high-end] setup for the range:

['a','m15','z']

is m15 in that range or not?

(John, from seeknuance, observes in the comments that this and other cases are not relevant for his specific implementation; he can afford to stay much simpler, and more efficient, than my code below)

anyways, this is what i’d do:


import re

def in_natural_range(low, value, high):
    result = []
    for s in [low,value,high]:
        result.append( [int(c) if c.isdigit() else c.lower() for c in re.split('([0-9]+)', s)])
    return ''.join([str(i) for i in sorted(result)[1]]) == value.lower() #fixed based on comment below

print in_natural_range('a','b','c')
print in_natural_range('1','2','3')
print in_natural_range('a1','b','c1')
print in_natural_range('a1','a1','a1')
print in_natural_range('a1','a2','a3')
print in_natural_range('a1','a22','a3')
print in_natural_range('11','12','13')
print in_natural_range('11','123','13')

well, if i had to i’d do that. in practice, i’d just stick to python’s natsort library.


[More programming riddles]