I’m the teaching assistant for MATH116 this semester and the office hours I originally chose didn’t suit most of my students. To remedy this, I set up a doodle poll asking them which times they could do. I downloaded their responses as an Excel table and exported it .csv (comma-separated values).

## An intuitive definition of total derivatives

I’ve been working with derivatives recently and once again found that the definition of the total derivative doesn’t make too much sense.

Continue reading An intuitive definition of total derivatives

## Addition is commutative

I have never felt this certain that addition of natural numbers is commutative! I proved it myself from scratch (including annoying steps using symmetry of equality). But more importantly it was my first proof in Agda.

## Yoneda’s lemma and Cayley’s theorem

Many sources, including Wikipedia claim that the Yoneda lemma is a generalisation of Cayley’s theorem. I was quite puzzled by this fact, and was unhappy with some of the explanations on the internet, so I decided to prove it for myself:

## Protected: Part B results

## I repeat

There’s less than two weeks left before exams, trials more difficult than anything I’ve ever had to face. I find myself in a destructive loop of procrastination and anxiety. Today was a pleasant day spent revising Principles of Programming Languages. Well, it was spent coding something that was more exciting than preparing for exams.

## Becoming a Champion

My girlfriend’s father enjoys a casual game of *Bubble Breaker,* he even got into the top 100 players on the website he frequents. Trying to impress/troll him lead me to the following challenge: become the Bubble Breaker champion.

### Bubble Breaker

**Rules**: pop a connected set [blob] of bubbles () to make them disappear and be replaced by bubbles above. When a row is emptied, it will be removed.

**Goal**: remove rows and columns

**Utility**:

- popping a blob of size :
- removing columns in a single move:

**Termination**: the game ends when the goal is reached or when there are no blobs of size

### Cheating

Well, as I didn’t want to spend a lot of my time playing Bubble Breaker there was an *obvious* plan: write a program that plays it for me. To make things a lot easier I asked a more experienced programmer, exFalso to help.

### Components

**Sensor**: a scraper that runs the java applet and collects the data necessary for the controller

**Controller**: a (limited) depth-first search in the graph of game states armed with awesome heuristics

**Actuator**: play the game (in the applet) according to the „best” sequence of moves found by the actuator

As for heuristics we planned introduce a number of variables regarding the game state and see how they correlated with high scores.

*Moar* Cheating

While I was working on the controller, exFalso started working on the sensor. He wanted to use Javascript to get the applet’s position but I thought it would be a better idea to trick the applet into running outside of the browser.

This required exFalso to decompile the applet. The result was shocking: the decompiled code had sensible variable names and was well-formatted. After writing a Swing container for the applet exFalso realised something that would change everything: despite the fact that the applet interacted with the server on each move, it was possible to send an arbitrary high score without playing.

### A note on premature optimisation

Prior to discovering that we could “print our own money” we spent a lot of time arguing about the controller: I thought it should be written in Haskell (rather unsurprisingly) and he pushed C++. His argument was that depth-first search was inherently stateful (as well as the whole algorithm) and that mutable linked lists are part of the obvious solution. Even after I convinced myself that this was rubbish, I still spent a lot of time thinking about the difference between using immutable arrays or lists of lists for the representation of the grid.

I think this is a rather striking example of premature optimisation: when you optimise code that won’t even be used in the final “product”.

Finally I’d like to thank Alex and Pete for their advice.