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

Poker.java 4.0KB

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