wtf javascript


javascript riddle time.

say that you’ve ventured into the land of XmlHTTPRequest ( $.ajax calls for the jquery people), and you’ve heard through the grapevine that (gasp!) it may be possible to make cross-domain http calls with this tool.

excitement! if you’re like me, you’ll see a chance to hack in fixes for a myriad of small bits of javascript you have lying around. so, off you’ll go, merrily trying anything that might work – your initial code might even look something like this, if you’re used to jquery:

  request = $.ajax({
        type: "POST", // !? - request sent through as HTTP GET
        url: ',
        data: 'some data',
        async: true,
        cache: false,
        dataType: 'jsonp',
        crossDomain: true,
        xhrFields: {
	       withCredentials: true //share cookies across domains!
  request.abort(); // !? - does nothing


ok, so, technically this is a wtf jquery, more so than a wtf javascript. ‘jsonp’ crossdomain requests aren’t currently supported, natively, by most browsers – a native implementation would take significant care to avoid being a security risk (i’m not entirely sure it’s possible, even). there is, though, a fairly generic hack for implementing them. take a look at jquery-jsonp, which is close to the state of the art of what’s possible nowadays, and you’ll even see it there:

  // Create the script tag
  script = $( STR_SCRIPT_TAG )[ 0 ]; = STR_JQUERY_JSONP + count++;

  // Set source
  script.src = url;

create a new script tag, with the source set to be the target of your jsonp request, dynamically add it to the document tree, and wrap it in event handlers to handle the response or any errors.

since it’s a html script tag, it always leads to a browser HTTP GET request; and, since the request is initiated indirectly, by adding the tag to the document tree, some of the usual niceties for XmlHTTPRequest aren’t available – eg, the ability to interrupt.

mystery demystified – the behaviour is correct, though still unpleasantly surprising to me

[More programming riddles]

project euler problem #8


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


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


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.

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]

project euler problem #7


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?

highlight below for my solution:

#using a prime number set datastructure -
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


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?

highlight below for my solution:

#using a prime number set datastructure -
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


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

What is the largest prime factor of the number 600851475143 ?

highlight below for my solution:

#using a prime number set datastructure -
p_set = PrimeSet()
n = 600851475143
sqrt = int(n ** 0.5) 
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


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.

  • 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 -
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


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

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:


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]