Monthly Archives: March 2013

NASA Space Apps Challenge 2013: A Bit of A Solution to “Wish You Were Here”

I canĀ Can’t post now, here’s my Python code as a solution to this:

import urllib2, os, re

file_name = ""
data = dict()

def get_xml(url="http://cab.inta-csic.es/rems/rems_weather.xml", del_xml=False):
	global file_name
	file_name = url.split('/')[-1]
	u = urllib2.urlopen(url)
	f = open(file_name, 'wb')
	meta = u.info()
	file_size = int(meta.getheaders("Content-Length")[0])

	file_size_dl = 0
	block_sz = 8192
	while True:
	    buffer = u.read(block_sz)
	    if not buffer:
	        break
		file_size_dl += len(buffer)
	    f.write(buffer)
	f.close()

	#Build the data dictionary
	global data
	data = dict(
		(x, y) for x, y in (
			re.findall(
				r'<(\w+)>(.*)</\w+>', xml()
				)
			)
		)
	if del_xml:
		delete_xml_file()

def xml():
	return open(xmlpath()).read()

def xmlpath():
	return os.getcwd() + "/" + file_name

def get_data(id):
	try:
		return data[id]
	except Exception, e:
		raise KeyError, "No such key!"

def get_data_dict():
	return data

def delete_xml_file():
	os.remove(xmlpath())

def weather_report(delete_xml=False):
	get_xml(del_xml=delete_xml)
	gd=get_data
	print	("Mars weather report provided by " + gd('title'))

	print	(
				"It's {} today!"
				.format	(
							gd('atmo_opacity').lower()
						)
			)

	print	(
				"The sun rises at {} and sets at {} today."
				.format	(
							gd('sunrise'), gd('sunset')
						)
			)

	print	(
				"The pressure on Mars today is {0} mb, which is {1:.2f}% of that on earth."
				.format	(
							gd('pressure'), (float(gd('pressure'))/10.18)
						)
			)

	print	(
				"The wind is blowing at a speed of {} km/h today, in direction {}."
				.format	(
							gd('wind_speed'), gd('wind_direction')
						)
			)

	print	(
				"Temperatures range from {} to {} degrees Celsius."
				.format	(
							gd('min_temp'), gd('max_temp')
						)
			)

	print	("It's {} on Mars."
				.format	(
							gd('season').lower()
						)
			)

print(weather_report(delete_xml=True))
Advertisements

Multiples of 3 or 5 below 1000 [Project Euler Problem 1]

This is the first Project Euler problem:

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.

Pretty simple, right? The dumb brute-force method would be:

public class M35 {
    public static void main(String[] args) {
        long time = System.nanoTime();

        int val = 0;
        for (int i = 0; i < 1000; i++){
            if(i%3==0 || i%5 == 0){val+=i;}
        }
        time = System.nanoTime() - time;

        System.out.println(time/1.0e9);
    }
}

It returns:

233168
2.6782E-5

Less than 0.0002 seconds? Neat, right? But what about an intelligent solution?
Try and recall how Gauss stumped his teacher in primary school when asked to sum the range 1 to 100 mentally. He understood that the range 1 to 100 consists of:
(1+100) + (2+99) + (3+98) … + (50+51) = 50 x 101 = 5050.

Now, in our case, we need the sum of all multiples of either three or five – but what about 15? 30? They’ll get counted twice, right?

In our case, what we need to do is,

(sum of multiples of 3) + (sum of multiples of 5) – (sum of multiples of 15)

=> (3 + 6 + 9 + … +999) + (5 + 10 + 15 + … + 995) – (15 + 30 + 45 + … + 990)

=> 3 x (1 + 2 + 3 + … + 333) + 5 x (1 + 2 + 3 + … + 199 ) – 15 x (1 + 2 + 3 + … + 66)

I’ll leave you to find out how these series can be summed.

After all, Project Euler tells us not to give out spoilers :D

PS. Hint, hint, arithmetic progression sums.