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]

project euler problem #1

Aside

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.

http://projecteuler.net/problem=1


  • try solving it as a python one-liner
  • try optimizing your solution for speed

highlight below for my solution:


sum(range(0,1000,3)) + sum(range(0,1000,5)) - sum(range(0,1000,15))

[More programming riddles]

project euler problem #4

Aside

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.

http://projecteuler.net/problem=4


highlight below for my solution:


def is_palindrome(num):
    return str(num) == str(num)[::-1]

def fn(n):
    max_palindrome = 1
    for x in range(n,1,-1):
        if x*n < max_palindrome:
            break
        for y in range(n,x-1,-1):
            if is_palindrome(x*y) and x*y > max_palindrome:
                max_palindrome = x*y
            elif x * y < max_palindrome:
                break
    return max_palindrome

print fn(999)


[More programming riddles]

sudoku solution verifier – python

Aside

write a sudoku solution verifier in python.

that is, given a list of lists, representing a solution to an nxn sudoku puzzle, verify that the solution is a correct sudoku solution:

fn ([[1,2],[2,1]]) # True
fn ([[1,3],[2,1]]) # False

(question seen as a Udacity programming course homework question)


highlight to see a solution:


def fn(x):
    b = [(j + 1) for j in range(0,len(x))]
    for i in x:
        if sorted(i) != b: return False
    return True

[More programming riddles]

python counters

in my pythonic trolling of the internet, i found a character counter, written by ashoksk. given a string of text, return a count for each character in the string (a tool that might be used when attempting to crack an encrypted message)

so i wondered, could this be a python one liner? turns out that, from python 2.7 on, it can be (highlight to see the code below):


from collections import Counter
def fn(x): c = Counter(x); return {x: c[x] for x in c.keys()}

it’s a cheat, though. anyone have a real one-line implementation of this?


[More programming riddles]