ソースを参照

bookstore : add to track (#310)

* dibs : I will implement exercise bookstore

* bookstore : add to track

* bookstore : add to track

 update config.json

* Update config.json : added orc-numbers

* add missing test from the canonical spec and delete the remaning test

* using camelCase instead of snake_case for tests methods

* adding @Ignore annotation

* using List instead of ArrayList

* using instance methods instead of class method

* delete useless stuff

* modify magic numbers

* update CostPerGroup method

* update class name and files name to Bookstore from Bookstore  + using camelCase for methods

* pass the integers directly to the Arrays.asList() methods

* adding brackets

* fix constant variable

* using static for constants
Thibault LADENT 9 年 前
コミット
458f5c19cd

+ 6
- 1
config.json ファイルの表示

@@ -315,10 +315,15 @@
315 315
       "difficulty": 1,
316 316
       "topics": []
317 317
     },
318
-    {
318
+     {
319 319
       "slug": "isogram",
320 320
       "difficulty": 1,
321 321
       "topics": []
322
+    },
323
+    {
324
+      "slug": "book-store",
325
+      "difficulty": 1,
326
+      "topics": []
322 327
     }
323 328
   ],
324 329
   "deprecated": [

+ 17
- 0
exercises/book-store/build.gradle ファイルの表示

@@ -0,0 +1,17 @@
1
+apply plugin: "java"
2
+apply plugin: "eclipse"
3
+apply plugin: "idea"
4
+
5
+repositories {
6
+  mavenCentral()
7
+}
8
+
9
+dependencies {
10
+  testCompile "junit:junit:4.12"
11
+}
12
+test {
13
+  testLogging {
14
+    exceptionFormat = 'full'
15
+    events = ["passed", "failed", "skipped"]
16
+  }
17
+}

+ 0
- 0
exercises/book-store/src/example/java/.keep ファイルの表示


+ 61
- 0
exercises/book-store/src/example/java/Bookstore.java ファイルの表示

@@ -0,0 +1,61 @@
1
+import java.awt.print.Printable;
2
+import java.util.ArrayList;
3
+import java.util.Arrays;
4
+import java.util.List;
5
+import java.util.stream.Collectors;
6
+
7
+public class Bookstore{
8
+
9
+	private static int BOOK_PRICE = 8, MAX_GROUP_SIZE = 5;
10
+	private List<Integer> books;
11
+	private static double[] DISCOUNT_TIERS = {0,5,10,20,25};   	
12
+
13
+	public Bookstore (List<Integer> books){
14
+		this.books = books;
15
+	}	
16
+	
17
+
18
+
19
+
20
+	public double calculateTotalCost(){
21
+		return calculateTotalCost(this.books,0);
22
+	}
23
+
24
+	private double calculateTotalCost (List<Integer> books,double priceSoFar ){
25
+		double minPrice = Double.MAX_VALUE;
26
+
27
+
28
+		if(books.size() == 0){
29
+			return priceSoFar;
30
+		}
31
+
32
+		List<Integer> groups = (ArrayList<Integer>) books.stream().distinct().collect(Collectors.toList());
33
+
34
+		
35
+		double price = 0;
36
+
37
+		for(int i = 0;i<groups.size();i++){
38
+			books.remove(groups.get(i));	
39
+		}
40
+				
41
+		try {
42
+			price = calculateTotalCost(books,priceSoFar + costPerGroup(groups.size()));
43
+		} catch (Exception e) {
44
+			e.printStackTrace();
45
+		}
46
+		
47
+		minPrice = Math.min(minPrice, price);
48
+		return minPrice;
49
+
50
+
51
+	}
52
+
53
+	private double costPerGroup(int groupSize) throws Exception{
54
+		if (groupSize < 1 || groupSize > MAX_GROUP_SIZE){
55
+        		throw new Exception("Invalid group size : " + groupSize );
56
+     		}
57
+    		return BOOK_PRICE * groupSize * (100 - DISCOUNT_TIERS[groupSize-1])/100;
58
+	}
59
+
60
+
61
+}

+ 0
- 0
exercises/book-store/src/main/java/.keep ファイルの表示


+ 0
- 0
exercises/book-store/src/test/java/.keep ファイルの表示


+ 117
- 0
exercises/book-store/src/test/java/BookstoreTest.java ファイルの表示

@@ -0,0 +1,117 @@
1
+import static org.junit.Assert.assertEquals;
2
+
3
+import java.util.List;
4
+import java.util.ArrayList;
5
+import java.util.Arrays;
6
+
7
+import org.junit.Test;
8
+
9
+public class BookstoreTest{
10
+
11
+	@Test
12
+	public void onlyASingleBook(){
13
+		List<Integer> books = new ArrayList<>(Arrays.asList(1));
14
+		Bookstore bookstore = new Bookstore(books);
15
+		assertEquals(8,bookstore.calculateTotalCost(),2);
16
+	}
17
+	
18
+	@Ignore
19
+	@Test
20
+	public void twoOfSameBook(){
21
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1));
22
+		Bookstore bookstore = new Bookstore(books);
23
+		assertEquals(16,bookstore.calculateTotalCost(),2);
24
+	}
25
+
26
+	@Ignore
27
+	@Test
28
+	public void emptyBasket(){
29
+		List<Integer> books = new ArrayList<>();
30
+		Bookstore bookstore = new Bookstore(books);
31
+		assertEquals(0,bookstore.calculateTotalCost(),2);
32
+	}
33
+
34
+	@Ignore
35
+	@Test
36
+	public void twoDifferentBooks(){
37
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,2));
38
+		Bookstore bookstore = new Bookstore(books);
39
+		assertEquals(15.20,bookstore.calculateTotalCost(),2);
40
+	}
41
+
42
+	@Ignore
43
+	@Test
44
+	public void threeDifferentBooks(){
45
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,2,3));
46
+		Bookstore bookstore = new Bookstore(books);
47
+		assertEquals(21.6,bookstore.calculateTotalCost(),2);
48
+	}
49
+
50
+	@Ignore
51
+	@Test
52
+	public void fourDifferentBooks(){
53
+		ArrayList<Integer> books = new ArrayList<>(Arrays.asList(1,2,3,4));
54
+		Bookstore bookstore = new Bookstore(books);
55
+		assertEquals(25.6,bookstore.calculateTotalCost(),2);
56
+
57
+	}
58
+
59
+	@Ignore
60
+	@Test
61
+	public void fiveDifferentBooks(){
62
+		ArrayList<Integer> books = new ArrayList<>(Arrays.asList(1,2,3,4,5));
63
+		Bookstore bookstore = new Bookstore(books);
64
+		assertEquals(30,bookstore.calculateTotalCost(),2);
65
+	}
66
+
67
+	@Ignore
68
+	@Test
69
+	public void twoGroupsOfFourIsCheaperThanGroupOfFivePlusGroupOfThree(){
70
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,3,4,5));
71
+		Bookstore bookstore = new Bookstore(books);
72
+		assertEquals(51.20,bookstore.calculateTotalCost(),2);
73
+	}
74
+
75
+	@Ignore
76
+	@Test
77
+	public void groupOfFourPlusGroupOfTwoIsCheaperThanTwoGroupsOfThree(){
78
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,4));
79
+		Bookstore bookstore = new Bookstore(books);
80
+		assertEquals(40.8,bookstore.calculateTotalCost(),2);
81
+	}
82
+
83
+	@Ignore
84
+	@Test
85
+	public void twoEachOfFirst4BooksAnd1CopyEachOfRest(){
86
+		Integer[] p = {1,1,2,2,3,3,4,4,5};
87
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,3,4,4,5));
88
+		Bookstore bookstore = new Bookstore(books);
89
+		assertEquals(55.60,bookstore.calculateTotalCost(),2);
90
+	}
91
+
92
+	@Ignore
93
+	@Test
94
+	public void twoCopiesOfEachBook(){
95
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,3,4,4,5,5));
96
+		Bookstore bookstore = new Bookstore(books);
97
+		assertEquals(60.00,bookstore.calculateTotalCost(),2);
98
+	}
99
+
100
+	@Ignore
101
+	@Test
102
+	public void threeCopiesOfFirstBookAnd2EachOfRemaining(){
103
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,3,4,4,5,5,1));
104
+		Bookstore bookstore = new Bookstore(books);
105
+		assertEquals(68.00,bookstore.calculateTotalCost(),2);
106
+	}
107
+
108
+	@Ignore
109
+	@Test
110
+	public void threeEachOFirst2BooksAnd2EachOfRemainingBooks(){
111
+		List<Integer> books = new ArrayList<>(Arrays.asList(1,1,2,2,3,3,4,4,5,5,1,2));
112
+		Bookstore bookstore = new Bookstore(books);
113
+		assertEquals(75.20,bookstore.calculateTotalCost(),2);
114
+	}
115
+
116
+}
117
+

+ 1
- 0
exercises/settings.gradle ファイルの表示

@@ -9,6 +9,7 @@ include 'binary'
9 9
 include 'binary-search'
10 10
 include 'binary-search-tree'
11 11
 include 'bob'
12
+include 'book-store'
12 13
 include 'bracket-push'
13 14
 include 'change'
14 15
 include 'clock'