# GeniusPenguin9's solution

## to Book Store in the C# Track

Published at Jan 19 2019 · 0 comments
Instructions
Test suite
Solution

To try and encourage more sales of different books from a popular 5 book series, a bookshop has decided to offer discounts on multiple book purchases.

One copy of any of the five books costs \$8.

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 buy all 5, you get a 25% discount.

Note: that if you buy 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.

Your mission is to write a piece of code to calculate the price of any conceivable shopping basket (containing only books of the same series), 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 grouping 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

Resulting in:

• 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

Resulting in:

• 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.

## Running the tests

To run the tests, run the command `dotnet test` from within the exercise directory.

Initially, only the first test will be enabled. This is to encourage you to solve the exercise one step at a time. Once you get the first test passing, remove the `Skip` property from the next test and work on getting that test passing. Once none of the tests are skipped and they are all passing, you can submit your solution using `exercism submit BookStore.cs`

## Further information

For more detailed information about the C# track, including how to get help if you're having trouble, please visit the exercism.io C# language page.

## Source

Inspired by the harry potter kata from Cyber-Dojo. http://cyber-dojo.org

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### BookStoreTest.cs

``````// This file was auto-generated based on version 1.4.0 of the canonical data.

using System;
using Xunit;

public class BookStoreTest
{
[Fact]
public void Only_a_single_book()
{
var basket = new[] { 1 };
}

[Fact(Skip = "Remove to run test")]
public void Two_of_the_same_book()
{
var basket = new[] { 2, 2 };
}

[Fact(Skip = "Remove to run test")]
{
}

[Fact(Skip = "Remove to run test")]
public void Two_different_books()
{
var basket = new[] { 1, 2 };
}

[Fact(Skip = "Remove to run test")]
public void Three_different_books()
{
var basket = new[] { 1, 2, 3 };
}

[Fact(Skip = "Remove to run test")]
public void Four_different_books()
{
var basket = new[] { 1, 2, 3, 4 };
}

[Fact(Skip = "Remove to run test")]
public void Five_different_books()
{
var basket = new[] { 1, 2, 3, 4, 5 };
}

[Fact(Skip = "Remove to run test")]
public void Two_groups_of_four_is_cheaper_than_group_of_five_plus_group_of_three()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 5 };
}

[Fact(Skip = "Remove to run test")]
public void Two_groups_of_four_is_cheaper_than_groups_of_five_and_three()
{
var basket = new[] { 1, 1, 2, 3, 4, 4, 5, 5 };
}

[Fact(Skip = "Remove to run test")]
public void Group_of_four_plus_group_of_two_is_cheaper_than_two_groups_of_three()
{
var basket = new[] { 1, 1, 2, 2, 3, 4 };
}

[Fact(Skip = "Remove to run test")]
public void Two_each_of_first_4_books_and_1_copy_each_of_rest()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5 };
}

[Fact(Skip = "Remove to run test")]
public void Two_copies_of_each_book()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5 };
}

[Fact(Skip = "Remove to run test")]
public void Three_copies_of_first_book_and_2_each_of_remaining()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1 };
}

[Fact(Skip = "Remove to run test")]
public void Three_each_of_first_2_books_and_2_each_of_remaining_books()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 1, 2 };
}

[Fact(Skip = "Remove to run test")]
public void Four_groups_of_four_are_cheaper_than_two_groups_each_of_five_and_three()
{
var basket = new[] { 1, 1, 2, 2, 3, 3, 4, 5, 1, 1, 2, 2, 3, 3, 4, 5 };
}
}``````
``````﻿using System;
using System.Collections.Generic;
using System.Linq;

public static class BookStore
{
private static List<decimal> totalcost;
private static Dictionary<int, decimal> dicBookCost = new Dictionary<int, decimal>{ { 1, 8m },
{ 2, 15.2m },
{ 3, 21.6m},
{ 4, 25.6m },
{ 5, 30m } };

public static decimal Total(IEnumerable<int> books)
{
totalcost = new List<decimal> { 0, 0, 0, 0, 0, 0 };

var listBooksNum = new List<int> {books.Count(i => i == 1),
books.Count(i => i == 2),
books.Count(i => i == 3),
books.Count(i => i == 4),
books.Count(i => i == 5)};

for (int i = 1; i < 6; i ++)
{
chooseBook( listBooksNum, i);
}

return Enumerable.Range(1,5).Select(i => totalcost[i]).Min();
}

private static bool chooseBook(List<int> listCurrentBooksNum, int maxChooseNum)
{
List<int> listCurrentBooksNumTemp = new List<int>(listCurrentBooksNum);
listCurrentBooksNumTemp.Sort();
listCurrentBooksNumTemp.Reverse();

if (listCurrentBooksNumTemp[0] == 0)
return true;

var currentChooseNum = Math.Min(maxChooseNum, listCurrentBooksNumTemp.Count(i => i != 0));
totalcost[maxChooseNum] += dicBookCost[currentChooseNum];
for (int i = 0; i < currentChooseNum; i++)
{
listCurrentBooksNumTemp[i] -= 1;
}
return chooseBook(listCurrentBooksNumTemp, maxChooseNum);
}
}``````
{"found_math": false, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 0, "mathjax_display_tex": 0, "mathjax_asciimath": 0, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0, "katex": 0, "math-container": 0, "wp-katex-eq": 0, "align": 0, "equation": 0, "x-ck12": 0, "texerror": 0, "url": "https://exercism.io/tracks/csharp/exercises/book-store/solutions/719905ae94854c2398b7b4f42ffe3760", "fetch_time": 1563340543000000000, "content_mime_type": "text/html", "warc_filename": "crawl-data/CC-MAIN-2019-30/segments/1563195525046.5/warc/CC-MAIN-20190717041500-20190717063500-00151.warc.gz", "warc_record_offset": 389479082, "warc_record_length": 7269, "token_count": 1962, "char_count": 6171, "score": 3.890625, "int_score": 4, "crawl": "CC-MAIN-2019-30", "snapshot_type": "latest", "language": "en", "language_score": 0.9306964874267578, "file_path": "/sailhome/yjruan/project/latent-lm/data/processed/finemath-4plus/finemath-4plus/train-00002-of-00064.parquet"}