7 "adventofcode2023/utils"
74 func Part1(input string) int {
76 hands := parseInput(1, input)
77 sort.Slice(hands, func(i, j int) bool {
78 if hands[i].handType == hands[j].handType {
80 if hands[i].cards[k] == hands[j].cards[k] {
83 return hands[i].cards[k] < hands[j].cards[k]
86 return hands[i].handType < hands[j].handType
88 for i,hand := range hands {
89 total += (i+1) * hand.bid
94 func Part2(input string) int {
96 hands := parseInput(2, input)
97 sort.Slice(hands, func(i, j int) bool {
98 if hands[i].handType == hands[j].handType {
100 if hands[i].cards[k] == hands[j].cards[k] {
103 if hands[i].cards[k] == Jack {return true}
104 if hands[j].cards[k] == Jack {return false}
105 return hands[i].cards[k] < hands[j].cards[k]
108 return hands[i].handType < hands[j].handType
110 for i,hand := range hands {
111 total += (i+1) * hand.bid
116 func parseInput(part int, input string) ([]Hand) {
119 lines := strings.Split(input, "\n")
120 for _, line := range lines {
121 tokens := strings.Fields(line)
122 hand.bid = utils.MustAtoi(tokens[1])
123 for i, j := range tokens[0] {
124 hand.cards[i] = toCard(j)
126 hand.handType = toHandType(part, hand.cards)
127 hands = append(hands, hand)
132 func toCard(j rune) Card {
164 func toHandType(part int, cards [5]Card) HandType {
167 cardMap := make(map[Card]int)
168 for _, card := range cards {
169 if part == 2 && card == Jack {
172 if _, ok := cardMap[card]; ok {
179 cardSorted := ToSortedSlice(cardMap)
180 if part == 2 && jokers == 5 { return FiveKind}
181 if part == 2 && jokers > 0 {
182 cardSorted[0].Value = cardSorted[0].Value + jokers
184 if cardSorted[0].Value == 5 { handType = FiveKind}
185 if cardSorted[0].Value == 4 { handType = FourKind}
186 if cardSorted[0].Value == 3 {
187 if cardSorted[1].Value == 2 {handType = FullHouse}
188 if cardSorted[1].Value == 1 {handType = ThreeKind}
190 if cardSorted[0].Value == 2 {
191 if cardSorted[1].Value == 2 {handType = TwoPair}
192 if cardSorted[1].Value == 1 {handType = OnePair}
197 //func toHandType(part int, cards [5]Card) HandType {
198 // cardMap := make(map[Card]int)
199 // for _, card := range cards {
200 // if _, ok := cardMap[card]; ok {
207 // switch cardMap[Jack] {
213 // if len(cardMap) == 2 {return FiveKind}
216 // switch len(cardMap) {
226 // switch len(cardMap) {
230 // max := utils.MapFindMax(cardMap)
231 // if max == 3 {return FourKind}
232 // if max == 2 {return FullHouse}
241 // switch len(cardMap) {
247 // for _, count := range cardMap {
254 // for _, count := range cardMap {
266 // KeyValue is a struct to hold key-value pairs
267 type KeyValue struct {
272 func ToSortedSlice(myMap map[Card]int) []KeyValue {
274 var keyValuePairs []KeyValue
275 for key, value := range myMap {
276 keyValuePairs = append(keyValuePairs, KeyValue{key, value})
279 // Sort the slice by values
280 sort.Slice(keyValuePairs, func(i, j int) bool {
281 if keyValuePairs[i].Value == keyValuePairs[j].Value { return keyValuePairs[i].Key > keyValuePairs[j].Key }
282 return keyValuePairs[i].Value > keyValuePairs[j].Value
285 // Create a new map with sorted key-value pairs
286 //sortedMap := make(map[Card]int)
287 //for _, kv := range keyValuePairs {
288 // sortedMap[kv.Key] = kv.Value