Parcourir la source

Merge remote-tracking branch 'upstream/master'

Souvatzis Vasilios il y a 9 ans
Parent
révision
bdbf8248b8

+ 0
- 0
.Rhistory Voir le fichier


+ 12
- 0
config.json Voir le fichier

3
   "language": "Java",
3
   "language": "Java",
4
   "repository": "https://github.com/exercism/xjava",
4
   "repository": "https://github.com/exercism/xjava",
5
   "active": true,
5
   "active": true,
6
+
6
   "exercises": [
7
   "exercises": [
7
     {
8
     {
8
       "slug": "hello-world",
9
       "slug": "hello-world",
313
       "slug": "ocr-numbers",
314
       "slug": "ocr-numbers",
314
       "difficulty": 1,
315
       "difficulty": 1,
315
       "topics": []
316
       "topics": []
317
+    },
318
+     {
319
+      "slug": "isogram",
320
+      "difficulty": 1,
321
+      "topics": []
322
+    },
323
+    {
324
+      "slug": "book-store",
325
+      "difficulty": 1,
326
+      "topics": []
316
     }
327
     }
317
   ],
328
   ],
318
   "deprecated": [
329
   "deprecated": [
335
     "say"
346
     "say"
336
   ]
347
   ]
337
 }
348
 }
349
+

+ 17
- 0
exercises/book-store/build.gradle Voir le fichier

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 Voir le fichier


+ 61
- 0
exercises/book-store/src/example/java/Bookstore.java Voir le fichier

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 Voir le fichier


+ 0
- 0
exercises/book-store/src/test/java/.keep Voir le fichier


+ 117
- 0
exercises/book-store/src/test/java/BookstoreTest.java Voir le fichier

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
+

+ 11
- 2
exercises/hamming/src/example/java/Hamming.java Voir le fichier

1
 public class Hamming {
1
 public class Hamming {
2
+    private final int hammingDistance;
2
 
3
 
3
-    public static int compute(String leftStrand, String rightStrand) {
4
+    public Hamming(String leftStrand, String rightStrand) {
5
+        hammingDistance = computeHammingDistance(leftStrand, rightStrand);
6
+    }
7
+
8
+    public int getHammingDistance() {
9
+        return hammingDistance;
10
+    }
11
+
12
+    private int computeHammingDistance(String leftStrand, String rightStrand) {
4
         if(leftStrand.length() != rightStrand.length()) {
13
         if(leftStrand.length() != rightStrand.length()) {
5
             throw new IllegalArgumentException("leftStrand and rightStrand must be of equal length.");
14
             throw new IllegalArgumentException("leftStrand and rightStrand must be of equal length.");
6
         }
15
         }
13
         return distance;
22
         return distance;
14
     }
23
     }
15
 
24
 
16
-    private static int hammingContributionAt(int index, String leftStrand, String rightStrand) {
25
+    private int hammingContributionAt(int index, String leftStrand, String rightStrand) {
17
       return leftStrand.charAt(index) != rightStrand.charAt(index) ? 1 : 0;
26
       return leftStrand.charAt(index) != rightStrand.charAt(index) ? 1 : 0;
18
     }
27
     }
19
 
28
 

+ 9
- 10
exercises/hamming/src/test/java/HammingTest.java Voir le fichier

7
 import org.junit.rules.ExpectedException;
7
 import org.junit.rules.ExpectedException;
8
 
8
 
9
 public class HammingTest {
9
 public class HammingTest {
10
-    
11
 
10
 
12
     @Rule
11
     @Rule
13
     public ExpectedException thrown = ExpectedException.none();
12
     public ExpectedException thrown = ExpectedException.none();
14
     
13
     
15
     @Test
14
     @Test
16
     public void testNoDifferenceBetweenIdenticalStrands() {
15
     public void testNoDifferenceBetweenIdenticalStrands() {
17
-        assertThat(Hamming.compute("A", "A"), is(0));
16
+        assertThat(new Hamming("A", "A").getHammingDistance(), is(0));
18
     }
17
     }
19
 
18
 
20
     @Ignore
19
     @Ignore
21
     @Test
20
     @Test
22
     public void testHammingDistanceForSingleNucleotideStrand() {
21
     public void testHammingDistanceForSingleNucleotideStrand() {
23
-        assertThat(Hamming.compute("A", "G"), is(1));
22
+        assertThat(new Hamming("A", "G").getHammingDistance(), is(1));
24
     }
23
     }
25
 
24
 
26
     @Ignore
25
     @Ignore
27
     @Test
26
     @Test
28
     public void testHammingDistanceForSmallStrand() {
27
     public void testHammingDistanceForSmallStrand() {
29
-        assertThat(Hamming.compute("AG", "CT"), is(2)); 
28
+        assertThat(new Hamming("AG", "CT").getHammingDistance(), is(2));
30
     }
29
     }
31
 
30
 
32
     @Ignore
31
     @Ignore
33
     @Test
32
     @Test
34
     public void testSmallHammingDistance() {
33
     public void testSmallHammingDistance() {
35
-        assertThat(Hamming.compute("AT", "CT"), is(1));
34
+        assertThat(new Hamming("AT", "CT").getHammingDistance(), is(1));
36
     }
35
     }
37
 
36
 
38
     @Ignore
37
     @Ignore
39
     @Test
38
     @Test
40
     public void testSmallHammingDistanceInLongerStrand() {
39
     public void testSmallHammingDistanceInLongerStrand() {
41
-        assertThat(Hamming.compute("GGACG", "GGTCG"), is(1));
40
+        assertThat(new Hamming("GGACG", "GGTCG").getHammingDistance(), is(1));
42
     }
41
     }
43
 
42
 
44
     @Ignore
43
     @Ignore
45
     @Test
44
     @Test
46
     public void testValidatesFirstStrandNotLonger() {
45
     public void testValidatesFirstStrandNotLonger() {
47
         thrown.expect(IllegalArgumentException.class);
46
         thrown.expect(IllegalArgumentException.class);
48
-        Hamming.compute("AAAG", "AAA");                
47
+        new Hamming("AAAG", "AAA");
49
     }
48
     }
50
 
49
 
51
     @Ignore
50
     @Ignore
52
     @Test
51
     @Test
53
     public void testValidatesOtherStrandNotLonger() {
52
     public void testValidatesOtherStrandNotLonger() {
54
         thrown.expect(IllegalArgumentException.class);
53
         thrown.expect(IllegalArgumentException.class);
55
-        Hamming.compute("AAA", "AAAG");
54
+        new Hamming("AAA", "AAAG");
56
     }
55
     }
57
 
56
 
58
     @Ignore
57
     @Ignore
59
     @Test
58
     @Test
60
     public void testLargeHammingDistance() {
59
     public void testLargeHammingDistance() {
61
-        assertThat(Hamming.compute("GATACA", "GCATAA"), is(4));
60
+        assertThat(new Hamming("GATACA", "GCATAA").getHammingDistance(), is(4));
62
     }
61
     }
63
 
62
 
64
     @Ignore
63
     @Ignore
65
     @Test
64
     @Test
66
     public void testHammingDistanceInVeryLongStrand() {
65
     public void testHammingDistanceInVeryLongStrand() {
67
-        assertThat(Hamming.compute("GGACGGATTCTG", "AGGACGGATTCT"), is(9));
66
+        assertThat(new Hamming("GGACGGATTCTG", "AGGACGGATTCT").getHammingDistance(), is(9));
68
     }
67
     }
69
 
68
 
70
 }
69
 }

+ 17
- 0
exercises/isogram/build.gradle Voir le fichier

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
+}

+ 34
- 0
exercises/isogram/src/example/java/IsogramChecker.java Voir le fichier

1
+package example;
2
+
3
+import java.util.HashSet;
4
+import java.util.Set;
5
+import static java.util.Arrays.stream;
6
+import static java.util.stream.Collectors.joining;
7
+
8
+public class IsogramChecker {
9
+	
10
+	public IsogramChecker(){
11
+	}
12
+	
13
+	public boolean isIsogram(String word){
14
+		
15
+		Set<Character> charSet = new HashSet<>();
16
+		
17
+		String[] words = word.split(" ");
18
+		String newWord = concat(words);
19
+		
20
+		words = newWord.split("-");
21
+		newWord = concat(words).toLowerCase();
22
+		
23
+		for(int i = 0; i < newWord.length(); i++){
24
+			charSet.add(newWord.charAt(i));
25
+		}
26
+		
27
+		return charSet.size() == newWord.length();
28
+	}
29
+	
30
+	private String concat(String[] words){
31
+		return stream(words).collect(joining());
32
+	}
33
+	
34
+}

+ 0
- 0
exercises/isogram/src/main/java/.keep Voir le fichier


+ 80
- 0
exercises/isogram/src/test/java/IsogramTest.java Voir le fichier

1
+package test;
2
+
3
+import static org.junit.Assert.*;
4
+
5
+import org.junit.Ignore;
6
+import org.junit.Test;
7
+import example.IsogramChecker;
8
+
9
+public class IsogramTest {
10
+
11
+	@Test
12
+	public void testIsogram() {
13
+		IsogramChecker iso = new IsogramChecker();
14
+		assertTrue(iso.isIsogram("duplicates"));
15
+	}
16
+	
17
+	@Ignore
18
+	@Test
19
+	public void testNotIsogram() {
20
+		IsogramChecker iso = new IsogramChecker();
21
+		assertFalse(iso.isIsogram("eleven"));
22
+	}
23
+	
24
+	@Ignore
25
+	@Test
26
+	public void testMediumLongIsogram() {
27
+		IsogramChecker iso = new IsogramChecker();
28
+		assertTrue(iso.isIsogram("subdermatoglyphic"));
29
+	}
30
+	
31
+	@Ignore
32
+	@Test
33
+	public void testCaseInsensitive() {
34
+		IsogramChecker iso = new IsogramChecker();
35
+		assertFalse(iso.isIsogram("Alphabet"));
36
+	}
37
+	
38
+	@Ignore
39
+	@Test
40
+	public void testIsogramWithHyphen() {
41
+		IsogramChecker iso = new IsogramChecker();
42
+		assertTrue(iso.isIsogram("thumbscrew-japingly"));
43
+	}
44
+	
45
+	@Ignore
46
+	@Test
47
+	public void testIgnoresMultipleHyphens() {
48
+		IsogramChecker iso = new IsogramChecker();
49
+		assertTrue(iso.isIsogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"));
50
+	}
51
+	
52
+	@Ignore
53
+	@Test
54
+	public void testWorksWithGermanLetters() {
55
+		IsogramChecker iso = new IsogramChecker();
56
+		assertTrue(iso.isIsogram("Heizölrückstoßabdämpfung"));
57
+	}
58
+	
59
+	@Ignore
60
+	@Test
61
+	public void testIgnoresSpaces() {
62
+		IsogramChecker iso = new IsogramChecker();
63
+		assertFalse(iso.isIsogram("the quick brown fox"));
64
+	}
65
+	
66
+	@Ignore
67
+	@Test
68
+	public void testIgnoresSpaces2() {
69
+		IsogramChecker iso = new IsogramChecker();
70
+		assertTrue(iso.isIsogram("Emily Jung Schwartzkopf"));
71
+	}
72
+	
73
+	@Ignore
74
+	@Test
75
+	public void testDuplicateAccentedLetters() {
76
+		IsogramChecker iso = new IsogramChecker();
77
+		assertFalse(iso.isIsogram("éléphant"));
78
+	}
79
+
80
+}

+ 2
- 0
exercises/settings.gradle Voir le fichier

9
 include 'binary-search'
9
 include 'binary-search'
10
 include 'binary-search-tree'
10
 include 'binary-search-tree'
11
 include 'bob'
11
 include 'bob'
12
+include 'book-store'
12
 include 'bracket-push'
13
 include 'bracket-push'
13
 include 'change'
14
 include 'change'
14
 include 'clock'
15
 include 'clock'
23
 include 'hamming'
24
 include 'hamming'
24
 include 'hexadecimal'
25
 include 'hexadecimal'
25
 include 'hello-world'
26
 include 'hello-world'
27
+include 'isogram'
26
 include 'largest-series-product'
28
 include 'largest-series-product'
27
 include 'linked-list'
29
 include 'linked-list'
28
 include 'list-ops'
30
 include 'list-ops'