# Exercise: Cookies and Pizza

Plan a party in JavaScript. Write functions with default parameters for cookies and boxes, then use filter, map, find, sort and reduce with arrow functions to pick pizzas, price an order and describe it, with tests run by Node.

Apprentice · JavaScript · Updated October 30, 2026

You're planning a party for 30 people, and JavaScript is doing the sums: how many cookies and boxes, how many pizzas, which are vegetarian, and what it all costs.

## Get the exercise code

Open this lesson's GitHub repository, [github.com/ask-codey/exercise-cookies-and-pizza](https://github.com/ask-codey/exercise-cookies-and-pizza), also linked from the **Exercise** box beside the lesson. Click **Code**, then **Download ZIP**, and unzip it into your `bootcamp` folder. Or clone it with Git. Then open the folder in **VS Code** (**File > Open Folder**), and open a terminal there (**Terminal > New Terminal**).

| File | What's in it |
|---|---|
| `cookies.js` | Three functions for you to finish |
| `pizza.js` | Six functions for you to finish |
| `party.js` | Plans a party with your functions |
| `cookies.test.js`, `pizza.test.js` | Tests for both files |

The requirements are in the comment at the top of `cookies.js` and `pizza.js`.

## What to do

Run the tests with:

```text
node --test
```

Node.js finds every file ending in `.test.js` and runs it. They all fail to start with. Finish the functions, running the tests as you go:

| File | Function | Does |
|---|---|---|
| `cookies.js` | `cookiesNeeded(guests, perGuest = 2)` | Cookies for the guests |
| | `boxesNeeded(cookies, boxSize = 12)` | Boxes, counting a part-full one |
| | `orderTotal(boxes, pricePerBox = 8.5)` | The price, 10% off for 5 or more boxes, rounded to cents |
| `pizza.js` | `pizzasNeeded(people, slicesEach = 3)` | Whole pizzas, at 8 slices each |
| | `vegetarianNames(menu)` | The vegetarian pizzas' names |
| | `cheapest(menu, count)` | The cheapest pizzas' names, cheapest first |
| | `findPizza(menu, name)` | A pizza, whatever the capitals, or `undefined` |
| | `orderPrice(menu, names)` | An order's total; an unknown pizza throws an `Error` |
| | `describeOrder(names)` | A sentence such as `3 pizzas: Margherita, Pepperoni and Veggie` |

Then plan the party with `node party.js`.

## Hints

- **`Math.ceil`** rounds up, so a part-full box or pizza still counts. To round to cents: `Math.round(total * 100) / 100`.
- **Defaults** go in the parameter list, as in C#: `function cookiesNeeded(guests, perGuest = 2)`.
- **`filter`, `map` and `find`** take arrow functions, just like LINQ's `Where`, `Select` and `FirstOrDefault`.
- **`sort` changes the array it's called on**, and one test checks that the menu keeps its order. Copy it first: `[...menu]` makes a new array with the same pizzas. Then sort the copy with `(a, b) => a.price - b.price`, and `slice(0, count)` takes the first `count`.
- **`reduce`** can add up the order; `findPizza` finds each name's price. `throw new Error(...)` throws, like C#'s `throw new Exception(...)`.
- **`describeOrder`**: `names.slice(0, -1)` is every name but the last.

## When you're done

Every test passes, and `node party.js` prints:

```text
Cookies: 60, in 5 boxes, $38.25
Pizzas: 12 for 30 guests
Vegetarian: Margherita, Veggie, Garlic Bread
Cheapest two: Garlic Bread, Margherita
3 pizzas: Margherita, Pepperoni and Veggie, $37.00
There is no Hawaiian on the menu
```

## Submit your exercise

The exercise is how you finish this lesson. When your work is done, put it on GitHub in a repo of your own, then submit that repo's address here.

1. On GitHub, click **+**, then **New repository**. Name it (for example `exercise-cookies-and-pizza`), choose **Public**, and click **Create repository**. Leave out the README: your folder already has one.
2. In a terminal in your exercise folder (Git Bash on Windows), send your work to your new repo. If you downloaded the ZIP:

   ```bash
   git init -b main
   git add .
   git commit -m "My solution"
   git remote add origin https://github.com/your-name/exercise-cookies-and-pizza.git
   git push -u origin main
   ```

   If you cloned the starter instead, point your copy at your own repo, then commit and push:

   ```bash
   git remote set-url origin https://github.com/your-name/exercise-cookies-and-pizza.git
   git add .
   git commit -m "My solution"
   git push -u origin main
   ```

3. Paste your repo's address, such as `https://github.com/your-name/exercise-cookies-and-pizza`, into **Submit your exercise** on this page. The site checks that the repo is public and holds your commits, and then the lesson is complete.

Changed something after you submitted? Push it, and submit again: your latest submission is the one that counts.

## So what

Functions with defaults, arrow functions, and array methods that are LINQ by another name: that's most of the JavaScript you'll write day to day. Next, you'll point it at a web page.

## Key terms

- [Default Parameter](https://www.ask-codey.com/glossary/default-parameter)
- [Arrow Function](https://www.ask-codey.com/glossary/arrow-function)
- [filter()](https://www.ask-codey.com/glossary/filter-javascript)
- [reduce()](https://www.ask-codey.com/glossary/reduce-javascript)

## Related

- [Arrays](https://www.ask-codey.com/lessons/csharp-vs-javascript-arrays)
- [Arrow Functions](https://www.ask-codey.com/lessons/csharp-vs-javascript-arrow-functions)

Source: https://www.ask-codey.com/lessons/exercise-cookies-and-pizza
