I have been solving some exercises commonly done in Coding Dojos to practice some TDD and basic programming logic, and decided to post them on GitHub and here so anyone that is interested can take a look.

GitHub: https://github.com/danielgimenes/CodingDojo

Harry Potter

To try and encourage more sales of the 5 different Harry Potter books they sell, a bookshop has decided to offer discounts of multiple-book purchases.

One copy of any of the five books costs 8 EUR.

If, however, you buy two different books, you get a 5% discount on those two books.

If you buy 3 different books, you get a 10% discount.

If you buy 4 different books, you get a 20% discount.

If you go the whole hog, and buy all 5, you get a huge 25% discount.

Note that if you buy, say, four books, of which 3 are different titles, you get a 10% discount on the 3 that form part of a set, but the fourth book still costs 8 EUR.

Your mission is to write a piece of code to calculate the price of any conceivable shopping basket (containing only Harry Potter books), giving as big a discount as possible.

For example, how much does this basket of books cost?

2 copies of the first book 2 copies of the second book 2 copies of the third book 1 copy of the fourth book 1 copy of the fifth book

One way of group these 8 books is: 1 group of 5 --> 25% discount (1st,2nd,3rd,4th,5th) +1 group of 3 --> 10% discount (1st,2nd,3rd) This would give a total of 5 books at a 25% discount +3 books at a 10% discount Giving 5 x (8 - 2.00) == 5 x 6.00 == 30.00 +3 x (8 - 0.80) == 3 x 7.20 == 21.60 For a total of 51.60

However, a different way to group these 8 books is: 1 group of 4 books --> 20% discount (1st,2nd,3rd,4th) +1 group of 4 books --> 20% discount (1st,2nd,3rd,5th) This would give a total of 4 books at a 20% discount +4 books at a 20% discount Giving 4 x (8-1.60) == 4 x 6.40 == 25.60 +4 x (8-1.60) == 4 x 6.40 == 25.60 For a total of 51.20

And 51.20 is the price with the biggest discount.

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/HarryPotter

Tennis Scoring

You task is to implement a tennis scoring program. Summary of tennis scoring:

  1. A game is won by the first player to have won at least four points in total and at least two points more than the opponent.
  2. The running score of each game is described in a manner peculiar to tennis: scores from zero to three points are described as "love", "fifteen", "thirty", and "forty" respectively.
  3. If at least three points have been scored by each player, and the scores are equal, the score is "deuce".
  4. If at least three points have been scored by each side and a player has one more point than his opponent, the score of the game is "advantage" for the player in the lead.

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/TennisScoring

Game Of Life

Develop an algorithm that takes "one step" in the game of life. The behaviour examples may simply be the rules of the game:

  1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation.
  2. Any live cell with more than three live neighbours dies, as if by overcrowding.
  3. Any live cell with two or three live neighbours lives on to the next generation.
  4. Any dead cell with exactly three live neighbours becomes a live cell.

You also have to think of things such as how to represent the board in a test-friendly way, and what "value" cells outside the board has. Or maybe the board does not have borders?

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/GameOfLife

Fizz Buzz

For numbers 1 through 100,

if the number is divisible by 3 print Fizz; if the number is divisible by 5 print Buzz; if the number is divisible by 3 and 5 (15) print FizzBuzz; else, print the number.

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/FizzBuzz

SQL String Generator

Given table metadata (name, columns/types, etc.), generate a well-formed SQL string. For example:

String[] columns = { "a", "b", "c" };
assertEquals("select a,b,c from x", sql.select(tableName, columns));

Do this for the usual SQL queries: SELECT, INSERT, UPDATE, DELETE. Remember to only do one thing at a time, and try not to think of the solution "ahead of time". Let the methods and objects just grow by themselves, as you write more and more tests.

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/SQLStringGenerator

Postfix Form

Given an expression in infix form (operators appear inline in the expression) like:

3 * (2 + 5)

Transform it to its postfix equivalent:

3 2 5 + *


Infix: 3 * (2 + 5)
Postfix: 3 2 5 + *

Infix: ((2 + 3) / 4) + (3 + 1) * 4
Postfix: 2 3 + 4 / 3 1 + 4 * +

Solution: https://github.com/danielgimenes/CodingDojo/tree/master/PostfixForm