# Exercises: Functions

To solve problems with code, you need to be able to break large problems into small ones. Usually, these smaller problems will take the form of functions that are used to solve the larger problem. Therefore, to solve problems with code, you need to be skilled at writing functions. And to master functions, you need to write a lot of them.

These exercises ask you to write many relatively small functions, which combine to form larger, more complicated ones.

At the end, you will be able to create strings of shapes, like this nifty diamond:

``````     #
###
#####
#######
#########
#########
#######
#####
###
#
``````

There is no starter code for these exercises, so create a new JavaScript file within your `javascript-projects/functions` directory to get started.

## Rectangles

### `makeLine(size)` function

Write a function `makeLine(size)` that returns a line with exactly `size` hashes.

``````console.log(makeLine(5));
``````

Console Output

`````` #####
``````

### `makeSquare(size)` function

Write a function called `makeSquare(size)` that returns a `size` by `size` string of hashes. The function should NOT print each row of the square. Instead, it must return a single string that contains the entire shape.

``````console.log(makeSquare(5));
``````

Console Output

`````` #####
#####
#####
#####
#####
``````

### `makeRectangle(width, height)` function

Write a function `makeRectangle(width, height)` that returns a rectangle with the given width and height. Use your `makeLine` function to do this.

``````console.log(makeRectangle(5, 3));
``````

Console Output

`````` #####
#####
#####
``````

Now, go back and rewrite `makeSquare` to use `makeRectangle`.

## Triangles

### `makeDownwardStairs(height)` function

Write a function `makeDownwardStairs(height)` that prints the staircase pattern shown below, with the given height. Use your `makeLine` function to do this.

``````console.log(makeDownwardStairs(5));
``````

Console Output

`````` #
##
###
####
#####
``````

### `makeSpaceLine(numSpaces, numChars)` function

Write a function `makeSpaceLine(numSpaces, numChars)` that returns a line with exactly the specified number of spaces, followed by the specified number of hashes, followed again by `numSpaces` more spaces.

``````console.log(makeSpaceLine(3, 5));
``````

Console Output

``````___#####___
``````

### `makeIsoscelesTriangle(height)` function

Write a function `makeIsoscelesTriangle(height)` that returns a triangle of the given height.

``````console.log(makeIsoscelesTriangle(5));
``````

Console Output

``````     #
###
#####
#######
#########
``````

## Diamonds

### `makeDiamond(height)` function

Write a function `makeDiamond(height)` that returns a diamond where the triangle formed by the top portion has the given height.

``````console.log(makeDiamond(5));
``````

Console Output

``````     #
###
#####
#######
#########
#########
#######
#####
###
#
``````

## Bonus Mission

Refactor your functions so that they take a single character as a parameter, and draw the shapes with that character instead of always using `'#'`. Make the new parameter optional, with default value `'#'`.