|
1 | 1 | import java.util.ArrayList; |
2 | | -import java.util.Arrays; |
3 | | -import java.util.Collections; |
4 | 2 | import java.util.Comparator; |
5 | | -import java.util.HashMap; |
6 | | -import java.util.Iterator; |
7 | | -import java.util.LinkedHashMap; |
8 | 3 | import java.util.List; |
9 | | -import java.util.Map; |
10 | 4 | import java.util.stream.Collectors; |
11 | 5 |
|
12 | 6 | public class Poker { |
13 | | - private static class Card { |
14 | | - private int rank; |
15 | | - private int suit; |
16 | | - |
17 | | - public Card(String card) { |
18 | | - rank = parseRank(card); |
19 | | - suit = parseSuit(card); |
20 | | - } |
21 | | - |
22 | | - private int getRank() { |
23 | | - return rank; |
24 | | - } |
25 | | - |
26 | | - private int getSuit() { |
27 | | - return suit; |
28 | | - } |
29 | | - |
30 | | - private static int parseRank(String card) { |
31 | | - return "..23456789TJQKA".indexOf(card.charAt(0)); |
32 | | - } |
33 | | - |
34 | | - private static int parseSuit(String card) { |
35 | | - return ".HSDC".indexOf(card.charAt(1)); |
36 | | - } |
37 | | - } |
38 | | - |
39 | | - private static class Hand { |
40 | | - private String input; |
41 | | - private int score; |
42 | | - |
43 | | - private Hand(String hand) { |
44 | | - this.input = hand; |
45 | | - this.score = scoreHand(parseCards(hand)); |
46 | | - } |
47 | | - |
48 | | - private int getScore() { |
49 | | - return score; |
50 | | - } |
51 | | - |
52 | | - private String getInput() { |
53 | | - return input; |
54 | | - } |
55 | | - |
56 | | - private static List<Card> parseCards(String hand) { |
57 | | - ArrayList<Card> parseCards = new ArrayList<Card>(); |
58 | | - String[] parseString = hand.split(" "); |
59 | | - for (int i = 0; i < parseString.length; i++) { |
60 | | - parseCards.add(new Poker.Card(parseString[i])); |
61 | | - } |
62 | | - return parseCards; |
63 | | - } |
64 | | - |
65 | | - private static int scoreHand(List<Card> cards) { |
66 | | - |
67 | | - List<Card> cardsByrank = new ArrayList<Card>(); |
68 | | - |
69 | | - cardsByrank = cards.stream().sorted(Comparator.comparing(Card::getRank)).unordered() |
70 | | - .collect(Collectors.toList()); |
71 | | - |
72 | | - Map<Integer, Integer> frequencymap = new HashMap<Integer, Integer>(); |
73 | | - for (Card c : cards) { |
74 | | - if (frequencymap.containsKey(c.rank)) { |
75 | | - frequencymap.put(c.getRank(), frequencymap.get(c.getRank()) + 1); |
76 | | - } else { |
77 | | - frequencymap.put(c.getRank(), 1); |
78 | | - } |
79 | | - } |
80 | | - |
81 | | - List<Integer> ranks = frequencymap.entrySet().stream().map(x -> x.getKey()) |
82 | | - .sorted(Comparator.reverseOrder()).collect(Collectors.toList()); |
83 | | - |
84 | | - frequencymap = frequencymap.entrySet().stream() |
85 | | - .sorted(Map.Entry.comparingByValue(Collections.reverseOrder())).collect(Collectors |
86 | | - .toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); |
87 | | - |
88 | | - List<Integer> rankCounts = frequencymap.entrySet().stream().map(x -> x.getValue()) |
89 | | - .collect(Collectors.toList()); |
90 | | - |
91 | | - List<Integer> suits = cards.stream().map(s -> s.getSuit()).collect(Collectors.toList()); |
92 | | - |
93 | | - if (ranks.equals(Arrays.asList(14, 5, 4, 3, 2))) { |
94 | | - ranks = Arrays.asList(5, 4, 3, 2, 1); |
95 | | - } |
96 | | - |
97 | | - boolean flush = suits.stream().distinct().count() == 1; |
98 | | - boolean straight = ranks.stream().distinct().count() == 5 && ranks.get(0) - ranks.get(4) == 4; |
99 | | - Iterator<Integer> itr = frequencymap.keySet().iterator(); |
100 | | - int pairA = itr.next(); |
101 | | - |
102 | | - if (straight && flush) { |
103 | | - return 800 + frequencymap.keySet().iterator().next(); |
104 | | - } |
105 | | - if (rankCounts.equals(Arrays.asList(4, 1))) { |
106 | | - return (700 + (cardsByrank.get(0)).getRank()); |
107 | | - } |
108 | | - if (rankCounts.equals(Arrays.asList(3, 2))) { |
109 | | - return 600 + cardsByrank.get(0).getRank(); |
110 | | - } |
111 | | - if (flush) { |
112 | | - return 500 + frequencymap.keySet().iterator().next(); |
113 | | - } |
114 | | - if (straight) { |
115 | | - return 400 + frequencymap.keySet().iterator().next(); |
116 | | - } |
117 | | - if (rankCounts.equals(Arrays.asList(3, 1, 1))) { |
118 | | - return 300 + cardsByrank.get(0).getRank(); |
119 | | - } |
120 | | - if (rankCounts.equals(Arrays.asList(2, 2, 1))) { |
121 | | - return 200 + Math.max(pairA, itr.next()); |
122 | | - } |
123 | | - if (rankCounts.equals(Arrays.asList(2, 1, 1, 1))) { |
124 | | - return 100 + pairA; |
125 | | - } |
126 | | - Collections.sort(ranks, (a, b) -> b.compareTo(a)); |
127 | | - Collections.reverse(ranks); |
128 | | - return ranks.get(0); |
129 | | - } |
130 | | - } |
131 | 7 | public static List<String> bestHands(List<String> hands) { |
132 | 8 | ArrayList<Hand> scoredHands = new ArrayList<Hand>(); |
133 | 9 |
|
134 | | - for (String s : hands) { |
| 10 | + for (String s : hands) |
135 | 11 | scoredHands.add(new Hand(s)); |
136 | | - } |
137 | 12 |
|
138 | 13 | int maxscore = scoredHands.stream().map(h -> h.getScore()).max(Comparator.naturalOrder()).get(); |
139 | 14 | return scoredHands.stream().filter(h -> h.getScore() == maxscore).map(h -> h.getInput()) |
|
0 commit comments