Просмотр исходного кода

Merge pull request #686 from FridaTveit/PokerTidy

poker: sort settings.gradle and tidy up
Stuart Kent 9 лет назад
Родитель
Сommit
b4c338332c

+ 20
- 20
exercises/poker/src/example/java/Card.java Просмотреть файл

1
-public class Card {
2
-	private int rank;
3
-	private int suit;
1
+class Card {
2
+    private int rank;
3
+    private int suit;
4
 
4
 
5
-	public Card(String card) {
6
-		rank = parseRank(card);
7
-		suit = parseSuit(card);
8
-	}
5
+    Card(String card) {
6
+        rank = parseRank(card);
7
+        suit = parseSuit(card);
8
+    }
9
 
9
 
10
-	public int getRank() {
11
-		return rank;
12
-	}
10
+    int getRank() {
11
+        return rank;
12
+    }
13
 
13
 
14
-	public int getSuit() {
15
-		return suit;
16
-	}
14
+    int getSuit() {
15
+        return suit;
16
+    }
17
 
17
 
18
-	private int parseRank(String card) {
19
-		return "..23456789TJQKA".indexOf(card.charAt(0));
20
-	}
18
+    private int parseRank(String card) {
19
+        return "..23456789TJQKA".indexOf(card.charAt(0));
20
+    }
21
 
21
 
22
-	private int parseSuit(String card) {
23
-		return ".HSDC".indexOf(card.charAt(1));
24
-	}
25
-}
22
+    private int parseSuit(String card) {
23
+        return ".HSDC".indexOf(card.charAt(1));
24
+    }
25
+}

+ 96
- 91
exercises/poker/src/example/java/Hand.java Просмотреть файл

1
-import java.util.ArrayList;
2
-import java.util.Arrays;
3
-import java.util.Collections;
4
-import java.util.Comparator;
5
-import java.util.HashMap;
6
-import java.util.Iterator;
7
-import java.util.LinkedHashMap;
8
-import java.util.List;
9
-import java.util.Map;
1
+import java.util.*;
10
 import java.util.stream.Collectors;
2
 import java.util.stream.Collectors;
11
 
3
 
12
-public class Hand {
13
-	private String input;
14
-	private int score;
4
+class Hand {
5
+    private String input;
6
+    private int score;
15
 
7
 
16
-	public Hand(String hand) {
17
-		this.input = hand;
18
-		this.score = scoreHand(parseCards(hand));
19
-	}
8
+    Hand(String hand) {
9
+        this.input = hand;
10
+        this.score = scoreHand(parseCards(hand));
11
+    }
20
 
12
 
21
-	public int getScore() {
22
-		return score;
23
-	}
13
+    int getScore() {
14
+        return score;
15
+    }
24
 
16
 
25
-	public String getInput() {
26
-		return input;
27
-	}
17
+    String getInput() {
18
+        return input;
19
+    }
28
 
20
 
29
-	private List<Card> parseCards(String hand) {
30
-		ArrayList<Card> parsedCards = new ArrayList<Card>();
31
-		String[] parseString = hand.split(" ");
32
-		for (int i = 0; i < parseString.length; i++) {
33
-			parsedCards.add(new Card(parseString[i]));
34
-		}
35
-		return parsedCards;
36
-	}
21
+    private List<Card> parseCards(String hand) {
22
+        ArrayList<Card> parsedCards = new ArrayList<>();
23
+        String[] cardsToParse = hand.split(" ");
24
+        for (String cardToParse : cardsToParse) {
25
+            parsedCards.add(new Card(cardToParse));
26
+        }
27
+        return parsedCards;
28
+    }
37
 
29
 
38
-	private Map<Integer, Integer> getfrequencyMap(List<Card> cards) {
39
-		Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();
40
-		for (Card c : cards) {
41
-			if (frequencyMap.containsKey(c.getRank())) {
42
-				frequencyMap.put(c.getRank(), frequencyMap.get(c.getRank()) + 1);
43
-			} else {
44
-				frequencyMap.put(c.getRank(), 1);
45
-			}
46
-		}
47
-		return frequencyMap;
48
-	}
30
+    private Map<Integer, Integer> getFrequencyMap(List<Card> cards) {
31
+        Map<Integer, Integer> frequencyMap = new HashMap<>();
32
+        for (Card c : cards) {
33
+            if (frequencyMap.containsKey(c.getRank())) {
34
+                frequencyMap.put(c.getRank(), frequencyMap.get(c.getRank()) + 1);
35
+            } else {
36
+                frequencyMap.put(c.getRank(), 1);
37
+            }
38
+        }
39
+        return frequencyMap;
40
+    }
49
 
41
 
50
-	private int scoreHand(List<Card> cards) {
51
-		List<Card> cardsByRank = cards.stream().sorted(Comparator.comparing(Card::getRank)).unordered()
52
-				.collect(Collectors.toList());
42
+    private int scoreHand(List<Card> cards) {
43
+        List<Card> cardsByRank = cards
44
+                .stream()
45
+                .sorted(Comparator.comparing(Card::getRank))
46
+                .unordered()
47
+                .collect(Collectors.toList());
53
 
48
 
54
-		Map<Integer, Integer> frequencyMap = getfrequencyMap(cards);
55
-		List<Integer> ranks = frequencyMap.entrySet().stream().map(x -> x.getKey()).sorted(Comparator.reverseOrder())
56
-				.collect(Collectors.toList());
57
-		frequencyMap = frequencyMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
58
-				.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
59
-		List<Integer> rankCounts = frequencyMap.entrySet().stream().map(x -> x.getValue()).collect(Collectors.toList());
60
-		List<Integer> suits = cards.stream().map(s -> s.getSuit()).collect(Collectors.toList());
49
+        Map<Integer, Integer> frequencyMap = getFrequencyMap(cards);
50
+        List<Integer> ranks = frequencyMap
51
+                .entrySet()
52
+                .stream()
53
+                .map(Map.Entry::getKey)
54
+                .sorted(Comparator.reverseOrder())
55
+                .collect(Collectors.toList());
56
+        frequencyMap = frequencyMap
57
+                .entrySet()
58
+                .stream()
59
+                .sorted(Map.Entry.comparingByValue(Collections.reverseOrder()))
60
+                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
61
+        List<Integer> rankCounts = frequencyMap
62
+                .entrySet()
63
+                .stream()
64
+                .map(Map.Entry::getValue)
65
+                .collect(Collectors.toList());
66
+        List<Integer> suits = cards.stream().map(Card::getSuit).collect(Collectors.toList());
61
 
67
 
62
-		return calculatedScore(frequencyMap, cardsByRank, ranks, rankCounts, suits);
63
-	}
68
+        return calculatedScore(frequencyMap, cardsByRank, ranks, rankCounts, suits);
69
+    }
64
 
70
 
65
-	private int calculatedScore(Map<Integer, Integer> frequencyMap, List<Card> cardsByRank, List<Integer> ranks,
66
-			List<Integer> rankCounts, List<Integer> suits) {
67
-		if (ranks.equals(Arrays.asList(14, 5, 4, 3, 2))) {
68
-			ranks = Arrays.asList(5, 4, 3, 2, 1);
69
-		}
71
+    private int calculatedScore(Map<Integer, Integer> frequencyMap, List<Card> cardsByRank, List<Integer> ranks,
72
+                                List<Integer> rankCounts, List<Integer> suits) {
73
+        if (ranks.equals(Arrays.asList(14, 5, 4, 3, 2))) {
74
+            ranks = Arrays.asList(5, 4, 3, 2, 1);
75
+        }
70
 
76
 
71
-		boolean flush = suits.stream().distinct().count() == 1;
72
-		boolean straight = ranks.stream().distinct().count() == 5 && ranks.get(0) - ranks.get(4) == 4;
73
-		Iterator<Integer> iteratorOverFrequencies = frequencyMap.keySet().iterator();
74
-		int highestFrequency = iteratorOverFrequencies.next();
77
+        boolean flush = suits.stream().distinct().count() == 1;
78
+        boolean straight = ranks.stream().distinct().count() == 5 && ranks.get(0) - ranks.get(4) == 4;
79
+        Iterator<Integer> iteratorOverFrequencies = frequencyMap.keySet().iterator();
80
+        int highestFrequency = iteratorOverFrequencies.next();
75
 
81
 
76
-		if (straight && flush) {
77
-			return 800 + highestFrequency;
78
-		}
79
-		if (rankCounts.equals(Arrays.asList(4, 1))) {
80
-			return 700 + cardsByRank.get(0).getRank();
81
-		}
82
-		if (rankCounts.equals(Arrays.asList(3, 2))) {
83
-			return 600 + cardsByRank.get(0).getRank();
84
-		}
85
-		if (flush) {
86
-			return 500 + highestFrequency;
87
-		}
88
-		if (straight) {
89
-			return 400 + highestFrequency;
90
-		}
91
-		if (rankCounts.equals(Arrays.asList(3, 1, 1))) {
92
-			return 300 + cardsByRank.get(0).getRank();
93
-		}
94
-		if (rankCounts.equals(Arrays.asList(2, 2, 1))) {
95
-			return 200 + Math.max(highestFrequency, iteratorOverFrequencies.next());
96
-		}
97
-		if (rankCounts.equals(Arrays.asList(2, 1, 1, 1))) {
98
-			return 100 + highestFrequency;
99
-		}
100
-		Collections.sort(ranks, (a, b) -> b.compareTo(a));
101
-		Collections.reverse(ranks);
102
-		return ranks.get(0);
103
-	}
104
-}
82
+        if (straight && flush) {
83
+            return 800 + highestFrequency;
84
+        }
85
+        if (rankCounts.equals(Arrays.asList(4, 1))) {
86
+            return 700 + cardsByRank.get(0).getRank();
87
+        }
88
+        if (rankCounts.equals(Arrays.asList(3, 2))) {
89
+            return 600 + cardsByRank.get(0).getRank();
90
+        }
91
+        if (flush) {
92
+            return 500 + highestFrequency;
93
+        }
94
+        if (straight) {
95
+            return 400 + highestFrequency;
96
+        }
97
+        if (rankCounts.equals(Arrays.asList(3, 1, 1))) {
98
+            return 300 + cardsByRank.get(0).getRank();
99
+        }
100
+        if (rankCounts.equals(Arrays.asList(2, 2, 1))) {
101
+            return 200 + Math.max(highestFrequency, iteratorOverFrequencies.next());
102
+        }
103
+        if (rankCounts.equals(Arrays.asList(2, 1, 1, 1))) {
104
+            return 100 + highestFrequency;
105
+        }
106
+        ranks.sort(Comparator.naturalOrder());
107
+        return ranks.get(0);
108
+    }
109
+}

+ 27
- 20
exercises/poker/src/example/java/Poker.java Просмотреть файл

1
-import java.util.ArrayList;
2
-import java.util.Comparator;
3
-import java.util.List;
1
+import java.util.*;
4
 import java.util.stream.Collectors;
2
 import java.util.stream.Collectors;
5
 
3
 
6
-public class Poker {
7
-	private final List<String> bestHands;
4
+class Poker {
5
+    private final List<String> bestHands;
8
 
6
 
9
-	public Poker(final List<String> hands) {
10
-		bestHands = bestHands(hands);
11
-	}
7
+    Poker(final List<String> hands) {
8
+        bestHands = bestHands(hands);
9
+    }
12
 
10
 
13
-	public List<String> getBestHands() {
14
-		return bestHands;
15
-	}
11
+    List<String> getBestHands() {
12
+        return bestHands;
13
+    }
16
 
14
 
17
-	public List<String> bestHands(final List<String> hands) {
18
-		ArrayList<Hand> scoredHands = new ArrayList<Hand>();
15
+    private List<String> bestHands(final List<String> hands) {
16
+        ArrayList<Hand> scoredHands = new ArrayList<>();
19
 
17
 
20
-		for (String s : hands) {
21
-			scoredHands.add(new Hand(s));
22
-		}
23
-		int maxscore = scoredHands.stream().map(h -> h.getScore()).max(Comparator.naturalOrder()).get();
24
-		return scoredHands.stream().filter(h -> h.getScore() == maxscore).map(h -> h.getInput())
25
-				.collect(Collectors.toList());
26
-	}
18
+        for (String s : hands) {
19
+            scoredHands.add(new Hand(s));
20
+        }
21
+        Optional<Integer> maxScoreIfAny = scoredHands
22
+                .stream()
23
+                .map(Hand::getScore)
24
+                .max(Comparator.naturalOrder());
25
+        return maxScoreIfAny
26
+                .map(maxScore -> scoredHands
27
+                        .stream()
28
+                        .filter(h -> h.getScore() == maxScore)
29
+                        .map(Hand::getInput)
30
+                        .collect(Collectors.toList()))
31
+                .orElseGet(Collections::emptyList);
32
+
33
+    }
27
 }
34
 }

+ 0
- 0
exercises/poker/src/main/java/.keep Просмотреть файл


+ 0
- 2
exercises/poker/src/main/java/Poker.java Просмотреть файл

1
-public class Poker {
2
-}

+ 15
- 16
exercises/poker/src/test/java/PokerTest.java Просмотреть файл

1
-import static org.junit.Assert.assertEquals;
1
+import org.junit.Ignore;
2
+import org.junit.Test;
2
 
3
 
3
 import java.util.Arrays;
4
 import java.util.Arrays;
4
 
5
 
5
-import org.junit.Test;
6
-
7
-import org.junit.Ignore;
6
+import static org.junit.Assert.assertEquals;
8
 
7
 
9
 public class PokerTest {
8
 public class PokerTest {
10
     @Test
9
     @Test
11
     public void oneHand() {
10
     public void oneHand() {
12
         final String hand = "4S 5S 7H 8D JC";
11
         final String hand = "4S 5S 7H 8D JC";
13
-        assertEquals(Arrays.asList(hand),new Poker(Arrays.asList(hand)).getBestHands());
12
+        assertEquals(Arrays.asList(hand), new Poker(Arrays.asList(hand)).getBestHands());
14
     }
13
     }
15
 
14
 
16
     @Ignore("Remove to run test")
15
     @Ignore("Remove to run test")
18
     public void nothingVsOnePair() {
17
     public void nothingVsOnePair() {
19
         final String nothing = "4S 5H 6S 8D JH";
18
         final String nothing = "4S 5H 6S 8D JH";
20
         final String pairOf4 = "2S 4H 6S 4D JH";
19
         final String pairOf4 = "2S 4H 6S 4D JH";
21
-        assertEquals(Arrays.asList(pairOf4),new Poker(Arrays.asList(nothing, pairOf4)).getBestHands());
20
+        assertEquals(Arrays.asList(pairOf4), new Poker(Arrays.asList(nothing, pairOf4)).getBestHands());
22
     }
21
     }
23
 
22
 
24
     @Ignore("Remove to run test")
23
     @Ignore("Remove to run test")
26
     public void twoPairs() {
25
     public void twoPairs() {
27
         final String pairOf2 = "4S 2H 6S 2D JH";
26
         final String pairOf2 = "4S 2H 6S 2D JH";
28
         final String pairOf4 = "2S 4H 6S 4D JH";
27
         final String pairOf4 = "2S 4H 6S 4D JH";
29
-        assertEquals(Arrays.asList(pairOf4), new Poker(Arrays.asList(pairOf2,pairOf4)).getBestHands());
28
+        assertEquals(Arrays.asList(pairOf4), new Poker(Arrays.asList(pairOf2, pairOf4)).getBestHands());
30
     }
29
     }
31
 
30
 
32
     @Ignore("Remove to run test")
31
     @Ignore("Remove to run test")
34
     public void onePairVsDoublePair() {
33
     public void onePairVsDoublePair() {
35
         final String pairOf8 = "2S 8H 6S 8D JH";
34
         final String pairOf8 = "2S 8H 6S 8D JH";
36
         final String doublePair = "4S 5H 4S 8D 5H";
35
         final String doublePair = "4S 5H 4S 8D 5H";
37
-        assertEquals(Arrays.asList(doublePair),  new Poker(Arrays.asList(pairOf8, doublePair)).getBestHands());
36
+        assertEquals(Arrays.asList(doublePair), new Poker(Arrays.asList(pairOf8, doublePair)).getBestHands());
38
     }
37
     }
39
 
38
 
40
     @Ignore("Remove to run test")
39
     @Ignore("Remove to run test")
50
     public void doublePairVsThree() {
49
     public void doublePairVsThree() {
51
         final String doublePair2And8 = "2S 8H 2S 8D JH";
50
         final String doublePair2And8 = "2S 8H 2S 8D JH";
52
         final String threeOf4 = "4S 5H 4S 8D 4H";
51
         final String threeOf4 = "4S 5H 4S 8D 4H";
53
-        assertEquals(Arrays.asList(threeOf4 ), new Poker(Arrays.asList(doublePair2And8, threeOf4)).getBestHands());
52
+        assertEquals(Arrays.asList(threeOf4), new Poker(Arrays.asList(doublePair2And8, threeOf4)).getBestHands());
54
     }
53
     }
55
 
54
 
56
     @Ignore("Remove to run test")
55
     @Ignore("Remove to run test")
74
     public void twoStraights() {
73
     public void twoStraights() {
75
         final String straightTo8 = "4S 6H 7S 8D 5H";
74
         final String straightTo8 = "4S 6H 7S 8D 5H";
76
         final String straightTo9 = "5S 7H 8S 9D 6H";
75
         final String straightTo9 = "5S 7H 8S 9D 6H";
77
-        assertEquals(Arrays.asList(straightTo9 ), new Poker(Arrays.asList(straightTo8, straightTo9)).getBestHands());
76
+        assertEquals(Arrays.asList(straightTo9), new Poker(Arrays.asList(straightTo8, straightTo9)).getBestHands());
78
 
77
 
79
         final String straightTo1 = "AS QH KS TD JH";
78
         final String straightTo1 = "AS QH KS TD JH";
80
         final String straightTo5 = "4S AH 3S 2D 5H";
79
         final String straightTo5 = "4S AH 3S 2D 5H";
86
     public void straightVsFlush() {
85
     public void straightVsFlush() {
87
         final String straightTo8 = "4S 6H 7S 8D 5H";
86
         final String straightTo8 = "4S 6H 7S 8D 5H";
88
         final String flushTo7 = "2S 4S 5S 6S 7S";
87
         final String flushTo7 = "2S 4S 5S 6S 7S";
89
-        assertEquals(Arrays.asList(flushTo7 ), new Poker(Arrays.asList(straightTo8, flushTo7)).getBestHands());
88
+        assertEquals(Arrays.asList(flushTo7), new Poker(Arrays.asList(straightTo8, flushTo7)).getBestHands());
90
     }
89
     }
91
 
90
 
92
     @Ignore("Remove to run test")
91
     @Ignore("Remove to run test")
102
     public void flushVsFull() {
101
     public void flushVsFull() {
103
         final String flushTo8 = "3H 6H 7H 8H 5H";
102
         final String flushTo8 = "3H 6H 7H 8H 5H";
104
         final String full = "4S 5H 4S 5D 4H";
103
         final String full = "4S 5H 4S 5D 4H";
105
-        assertEquals(Arrays.asList(full ), new Poker(Arrays.asList(full, flushTo8)).getBestHands());
104
+        assertEquals(Arrays.asList(full), new Poker(Arrays.asList(full, flushTo8)).getBestHands());
106
     }
105
     }
107
 
106
 
108
     @Ignore("Remove to run test")
107
     @Ignore("Remove to run test")
110
     public void twoFulls() {
109
     public void twoFulls() {
111
         final String fullOf4By9 = "4H 4S 4D 9S 9D";
110
         final String fullOf4By9 = "4H 4S 4D 9S 9D";
112
         final String fullOf5By8 = "5H 5S 5D 8S 8D";
111
         final String fullOf5By8 = "5H 5S 5D 8S 8D";
113
-        assertEquals(Arrays.asList(fullOf5By8 ), new Poker(Arrays.asList(fullOf4By9, fullOf5By8)).getBestHands());
112
+        assertEquals(Arrays.asList(fullOf5By8), new Poker(Arrays.asList(fullOf4By9, fullOf5By8)).getBestHands());
114
     }
113
     }
115
 
114
 
116
     @Ignore("Remove to run test")
115
     @Ignore("Remove to run test")
118
     public void fullVsSquare() {
117
     public void fullVsSquare() {
119
         final String full = "4S 5H 4S 5D 4H";
118
         final String full = "4S 5H 4S 5D 4H";
120
         final String squareOf3 = "3S 3H 2S 3D 3H";
119
         final String squareOf3 = "3S 3H 2S 3D 3H";
121
-        assertEquals(Arrays.asList(squareOf3 ), new Poker(Arrays.asList(full, squareOf3)).getBestHands());
120
+        assertEquals(Arrays.asList(squareOf3), new Poker(Arrays.asList(full, squareOf3)).getBestHands());
122
     }
121
     }
123
 
122
 
124
     @Ignore("Remove to run test")
123
     @Ignore("Remove to run test")
134
     public void squareVsStraightFlush() {
133
     public void squareVsStraightFlush() {
135
         final String squareOf5 = "4S 5H 5S 5D 5H";
134
         final String squareOf5 = "4S 5H 5S 5D 5H";
136
         final String straightFlushTo9 = "5S 7S 8S 9S 6S";
135
         final String straightFlushTo9 = "5S 7S 8S 9S 6S";
137
-        assertEquals(Arrays.asList(straightFlushTo9 ), new Poker(Arrays.asList(squareOf5, straightFlushTo9)).getBestHands());
136
+        assertEquals(Arrays.asList(straightFlushTo9), new Poker(Arrays.asList(squareOf5, straightFlushTo9)).getBestHands());
138
     }
137
     }
139
 
138
 
140
     @Ignore("Remove to run test")
139
     @Ignore("Remove to run test")
142
     public void twoStraightFlushes() {
141
     public void twoStraightFlushes() {
143
         final String straightFlushTo8 = "4H 6H 7H 8H 5H";
142
         final String straightFlushTo8 = "4H 6H 7H 8H 5H";
144
         final String straightFlushTo9 = "5S 7S 8S 9S 6S";
143
         final String straightFlushTo9 = "5S 7S 8S 9S 6S";
145
-        assertEquals(Arrays.asList(straightFlushTo9 ), new Poker(Arrays.asList(straightFlushTo8, straightFlushTo9)).getBestHands());
144
+        assertEquals(Arrays.asList(straightFlushTo9), new Poker(Arrays.asList(straightFlushTo8, straightFlushTo9)).getBestHands());
146
     }
145
     }
147
 
146
 
148
     @Ignore("Remove to run test")
147
     @Ignore("Remove to run test")

+ 1
- 1
exercises/settings.gradle Просмотреть файл

47
 include 'perfect-numbers'
47
 include 'perfect-numbers'
48
 include 'phone-number'
48
 include 'phone-number'
49
 include 'pig-latin'
49
 include 'pig-latin'
50
+include 'poker'
50
 include 'prime-factors'
51
 include 'prime-factors'
51
 include 'pythagorean-triplet'
52
 include 'pythagorean-triplet'
52
 include 'queen-attack'
53
 include 'queen-attack'
77
 include 'word-count'
78
 include 'word-count'
78
 include 'word-search'
79
 include 'word-search'
79
 include 'wordy'
80
 include 'wordy'
80
-include 'poker'