Explorar el Código

Merge remote-tracking branch 'upstream/master'

Souvatzis Vasilios hace 9 años
padre
commit
bdbf8248b8

+ 0
- 0
.Rhistory Ver fichero


+ 12
- 0
config.json Ver fichero

@@ -3,6 +3,7 @@
3 3
   "language": "Java",
4 4
   "repository": "https://github.com/exercism/xjava",
5 5
   "active": true,
6
+
6 7
   "exercises": [
7 8
     {
8 9
       "slug": "hello-world",
@@ -313,6 +314,16 @@
313 314
       "slug": "ocr-numbers",
314 315
       "difficulty": 1,
315 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 329
   "deprecated": [
@@ -335,3 +346,4 @@
335 346
     "say"
336 347
   ]
337 348
 }
349
+

+ 17
- 0
exercises/book-store/build.gradle Ver fichero

@@ -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 Ver fichero


+ 61
- 0
exercises/book-store/src/example/java/Bookstore.java Ver fichero

@@ -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 Ver fichero


+ 0
- 0
exercises/book-store/src/test/java/.keep Ver fichero


+ 117
- 0
exercises/book-store/src/test/java/BookstoreTest.java Ver fichero

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

+ 11
- 2
exercises/hamming/src/example/java/Hamming.java Ver fichero

@@ -1,6 +1,15 @@
1 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 13
         if(leftStrand.length() != rightStrand.length()) {
5 14
             throw new IllegalArgumentException("leftStrand and rightStrand must be of equal length.");
6 15
         }
@@ -13,7 +22,7 @@ public class Hamming {
13 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 26
       return leftStrand.charAt(index) != rightStrand.charAt(index) ? 1 : 0;
18 27
     }
19 28
 

+ 9
- 10
exercises/hamming/src/test/java/HammingTest.java Ver fichero

@@ -7,64 +7,63 @@ import org.junit.Rule;
7 7
 import org.junit.rules.ExpectedException;
8 8
 
9 9
 public class HammingTest {
10
-    
11 10
 
12 11
     @Rule
13 12
     public ExpectedException thrown = ExpectedException.none();
14 13
     
15 14
     @Test
16 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 19
     @Ignore
21 20
     @Test
22 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 25
     @Ignore
27 26
     @Test
28 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 31
     @Ignore
33 32
     @Test
34 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 37
     @Ignore
39 38
     @Test
40 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 43
     @Ignore
45 44
     @Test
46 45
     public void testValidatesFirstStrandNotLonger() {
47 46
         thrown.expect(IllegalArgumentException.class);
48
-        Hamming.compute("AAAG", "AAA");                
47
+        new Hamming("AAAG", "AAA");
49 48
     }
50 49
 
51 50
     @Ignore
52 51
     @Test
53 52
     public void testValidatesOtherStrandNotLonger() {
54 53
         thrown.expect(IllegalArgumentException.class);
55
-        Hamming.compute("AAA", "AAAG");
54
+        new Hamming("AAA", "AAAG");
56 55
     }
57 56
 
58 57
     @Ignore
59 58
     @Test
60 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 63
     @Ignore
65 64
     @Test
66 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 Ver fichero

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

+ 34
- 0
exercises/isogram/src/example/java/IsogramChecker.java Ver fichero

@@ -0,0 +1,34 @@
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 Ver fichero


+ 80
- 0
exercises/isogram/src/test/java/IsogramTest.java Ver fichero

@@ -0,0 +1,80 @@
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 Ver fichero

@@ -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'
@@ -23,6 +24,7 @@ include 'grade-school'
23 24
 include 'hamming'
24 25
 include 'hexadecimal'
25 26
 include 'hello-world'
27
+include 'isogram'
26 28
 include 'largest-series-product'
27 29
 include 'linked-list'
28 30
 include 'list-ops'