Building the Project Euler framework, part 1

As promised, here is the first part of the series of posts I hope to write demonstrating how I wrote my problem runner framework for Project Euler.

Firstly, before you continue reading, I suggest that you research the Command pattern, Google will also provide you with some good sources in your research.

Done? Ok then. It shouldn’t matter what IDE you use, I am using Eclipse (ganymede), any IDE should do. If you don’t know what an IDE is, then go and find out, and then come back.

Start Coding

In your IDE, and following the Java package naming conventions, create a package to hold the Project Euler code, for example: co.uk.temporalcohesion.euler.problems. Because we are going to need an interface, also create a package to hold those, as this can help keep things more organised, for example: co.uk.temporalcohesion.euler.interfaces

Let’s define that interface

public interface Problem {

	/**
	 * Answer method. Returns the answer for the problem
	 * @return - the integer answer to the problem
	 */
	String answer();

	/**
	 * The problem number.
	 * @return - The number of the problem
	 */
	int id();

	/**
	 * How long does it take to work out the answer?
	 * @return - The time in seconds it takes to work out the answer to the problem
	 */
	double time();
}

Before we move on an implement that interface in a problem, let’s write the basic problem runner itself. We’ll need a way to register an instance of a problem, and a way to run the problem and get the answer.

public class Euler {
	private List<Problem> problems = new ArrayList();

	public Euler() {
		problems.add(new One());
	}

	private void run() {
		for (Problem prob : problems) {
			System.out.println("Problem " + prob.id() + ": " + prob.answer());
		}
	}

	public static void main(String[] args) {
		new Euler().run();
	}
}

That’s pretty much all you need for a basic problem runner. You just register an instance of each problem you write into the problems List object in the constructor, and run the program, and it iterates through each Problem in the List, and outputs the answer.

I’m not going to give you the code to problem one, however it is pretty trivial if you know what the modulus operator is used for…

As you can see, the problem runner itself is fairly basic, and does present some immediate areas of improvement, such as running a specific problem.

I’ll cover that next time.

Project Euler problem runner framework in Java

Recently, I’ve been working on the problems on Project Euler, and I’ve done the first 16 problems (in Java), although I will freely admit that I had help on two of the most difficult ones. I do intend on continuing to do the problems, and I am currently working on problem 17, however I paused to write the problem runner framework I’m going to talk about in this post.

What I had started to do, was to write each solution in it’s own Class, and have the main(String[] args) method output the answer. This was fine for the first few problems, and I could have continued to do it like that for all of the problems – however I wanted to be able to run all the problems at once, or a specific problem, and get the answer(s), or not show the answers but still get the timings.

After chatting with one of the Senior Dev’s at my job, he pointed out that what I wanted to do was basically the Command pattern. He sent me some example code, although once he’d said “Command pattern” I knew exactly what it was that I needed to do.

Thus, my problem runner framework was born, and whilst fairly simple, it does employ some techniques that the beginning Java developer might not be aware of. So, what I am going to (try) to do over the next few weeks is write a series of posts that show how I wrote it, partly just to have some content on my blog (which I am really, really lazy at updating), secondly to see how good I am at explaining something like this, and thirdly – it might actually be useful to someone.

The output of the problem runner framework looks like this:

C:\development>java -jar euler.jar -noanswers
Project Euler : Problem Runner – http://projecteuler.net/

Problem: 1. Time: 0.0s
Problem: 2. Time: 0.0s
Problem: 3. Time: 0.347s
Problem: 4. Time: 0.307s
Problem: 5. Time: 63.803s
Problem: 6. Time: 0.0s
Problem: 7. Time: 0.335s
Problem: 8. Time: 0.0020s
Problem: 9. Time: 34.178s
Problem: 10. Time: 0.369s
Problem: 11. Time: 1.218275999017E9s
Problem: 12. Time: 0.021s
Problem: 13. Time: 0.0s
Problem: 14. Time: 21.717s
Problem: 15. Time: 0.0s
Problem: 16. Time: 0.0010s

As you can see, I have output a list of the problems, and the time taken to solve the problem, but I haven’t shown the answer.

Well, you didn’t think I was going to tell you the answers… Did you?

This also shows that I need to work on problem 5, 9 and 14 to try and optimise the solution to speed up performance, Project Euler says that problems “should” take under a minute to solve, however I’d still like to improve the code.

New Year’s Resolutions are so passé

It’s true, New Years resolutions are passé. Every year, you look at what is wrong in your life and triumphantly decide that you are going to resolve these problems by issuing a bold and sweeping set of statements, or edicts.

  • Lose weight
  • Stop smoking
  • Get fit

These are what you want to achieve, chasing that ever elusive dream of making your life better. Can you? Can a simple list of statements help you achieve these goals? I’m not so sure. For some people I’m sure that they don’t even have to write them down, those super motivated people who seem to exude success.

I used to do this, on scraps of easily lost paper, “Stuart’s New Year’s Resolutions!” it would say, with a list of two or three word ambition’s for the year. Lost by February. For the last few years I haven’t even bothered with writing them down, I’d just mouth off to anyone who would listen, “I’m gonna do this, and that, this year, you wait and see”.

Which funnily enough, didn’t get me very far with achieving very much. That said, 2007 was a year I’ll never forget, for a number of reasons (not all of which I want to go into here), and it has led me to believe even more than I did, that it is all well and good to strole through life without a care, thinking everything is fine and dandy. Because it is not. Doing that will get you stuck, trapped in a rut that you can’t get out of, never having made anything of your life.

Thankfully, I’m pretty certain that I’m not in a rut. Trust me, I’ve been there and I know what it is like.

So what to do instead of making ‘New Year’s Resolutions’? It’s simple: Set goals. “But”, I hear you cry, “a goal IS a resolution?!” Which in this sense I suppose they are, however there is a crucial difference. A goal set’s out what you want to do and how you are going to achieve it.

The above list could be re-written like so:

  • Lose weight by eating healthily and exercising more to get fit.
  • Stop smoking by using patches and will power, giving up completely by Easter.
  • Get fit, by joining a gym, running and cycling and lose 2 stone by Easter

These aren’t my goals for this year… Ok, I don’t smoke, but the other two count. I’m not revealing my other goals… yet. I have several though, and I intend to get stuck in and achieve them.

more cake

Something I discovered fairly quickly when coding (cake)PHP in eclipse, is that, like code completion in Models, unless you do a little extra configuration, code completion in Views won’t work.

If however, you make a slight modification to the Views index.ctp, and create a HtmlHelper() yourself, then you get code completion on $html->, and access to all the methods, and the rendered view isn’t affected at all.

For example:

I found the answer to this after posting on the CakePHP google group, and getting a good answer from a user. Top Stuff

cakePHP with Eclipse

cakePHP development in Eclipse

After chatting with one of my friends who is earning loads of cash doing php web development, I’ve decided that I’m going relearn PHP, not because I want a change of career, I’m happy where I am, but because… I just want to.

Because I’ve become a bit of a snob, used to having intellisense and and all the wonders that IDE’s such as Visual Studio and Borland Delphi provide, I wanted to do my PHP development in a proper IDE. Since I’ve been doing a lot of Java at work – enter Eclipse, and the Eclipse PHP plugins.

As you can see in the screenshot above (which shows some code from the cakePHP 15 minute blog tutorial), the plugins provide an awesome amount of functionality, such as:

  • Code folding
  • Intellisense/code completion
  • Syntax highlighting/colouring
  • API Documentation tool-tips

All this functionality is pretty easy to set up, and there is a pretty good guide available in The Bakery that covers just about everything you need to know to get going. There was a little bit of configuration that I did that was slightly different to that guide:

Firstly, I don’t believe that you need to set up cakePHP as a project in order to get the code completion to work. If you expand your project, and right click on your project include paths, you should be on the PHP Include path dialog, in the projects properties. If you add an external folder, and browse to the cake core directory (for me: C:\xampp\htdocs\cake), and click ok, you should now have code completion and all the associated awesomeness in your project, with the added benefit that for any different projects in your workspace, you can set up different versions of cakePHP or (I haven’t tried this though) a different framework such as Symfony.

Secondly, for code completion in Models, you just have to do something like this:

class PostsController extends AppController{var $name = 'Posts';

/**

* @var Post

*/

var $Post;

...code

}

Hope this is of use to somebody :)