code.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "log"
  6. "os"
  7. )
  8. const (
  9. NumberOfCards = 5
  10. NumberOfRanks = 13
  11. )
  12. type Hand struct {
  13. cards string
  14. bid int
  15. ranks [NumberOfCards]int
  16. score int
  17. }
  18. func (h *Hand) analyzeHand() {
  19. five := false
  20. four := false
  21. three := false
  22. pairs := 0
  23. var numberInRank [NumberOfRanks]int
  24. for i := range h.cards {
  25. numberInRank[ranks[h.cards[i]]]++
  26. h.ranks[i] = ranks[h.cards[i]]
  27. }
  28. for rank := 0; rank < NumberOfRanks; rank++ {
  29. switch numberInRank[rank] {
  30. case 5:
  31. five = true
  32. case 4:
  33. four = true
  34. case 3:
  35. three = true
  36. case 2:
  37. pairs++
  38. }
  39. }
  40. if five {
  41. h.score = FiveKind
  42. } else if four {
  43. h.score = FourKind
  44. } else if three && pairs == 1 {
  45. h.score = FullHouse
  46. } else if three {
  47. h.score = ThreeKind
  48. } else if pairs == 2 {
  49. h.score = TwoPair
  50. } else if pairs == 1 {
  51. h.score = OnePair
  52. } else {
  53. h.score = HighCard
  54. }
  55. }
  56. func readInput(file *os.File) []Hand {
  57. scanner := bufio.NewScanner(file)
  58. var hands []Hand
  59. for scanner.Scan() {
  60. line := scanner.Text()
  61. if line == "" {
  62. break
  63. }
  64. var hand Hand
  65. n, err := fmt.Sscanf(line, "%s %d", &hand.cards, &hand.bid)
  66. if n != 2 || err != nil {
  67. log.Fatalf("Failed to read hand: %s\n%s", line, err)
  68. }
  69. hand.analyzeHand()
  70. hands = append(hands, hand)
  71. }
  72. return hands
  73. }
  74. var ranks map[byte]int
  75. func init() {
  76. ranks = make(map[byte]int)
  77. ranks['2'] = 0
  78. ranks['3'] = 1
  79. ranks['4'] = 2
  80. ranks['5'] = 3
  81. ranks['6'] = 4
  82. ranks['7'] = 5
  83. ranks['8'] = 6
  84. ranks['9'] = 7
  85. ranks['T'] = 8
  86. ranks['J'] = 9
  87. ranks['Q'] = 10
  88. ranks['K'] = 11
  89. ranks['A'] = 12
  90. }
  91. const (
  92. HighCard = iota + 1
  93. OnePair
  94. TwoPair
  95. ThreeKind
  96. FullHouse
  97. FourKind
  98. FiveKind
  99. )
  100. func main() {
  101. if len(os.Args) < 2 {
  102. log.Fatal("You need to specify a file!")
  103. }
  104. filePath := os.Args[1]
  105. file, err := os.Open(filePath)
  106. if err != nil {
  107. log.Fatalf("Failed to open %s!\n", filePath)
  108. }
  109. hands := readInput(file)
  110. fmt.Println(hands)
  111. }