lots of exercises in java... from https://github.com/exercism/java

Hand.java 3.8KB

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