Skip to content

Commit 88eadc6

Browse files
authored
Merge pull request #87 from tlarsen0/feature/day07.1-2024-10-10
Adding configuration and solution to Advent of Code 2023, Day 6 Part 2.
2 parents 84cb97e + 0256b89 commit 88eadc6

File tree

11 files changed

+1193
-0
lines changed

11 files changed

+1193
-0
lines changed

2023/day07_1/.idea/.gitignore

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/inspectionProfiles/Project_Default.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/kotlinc.xml

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/libraries/KotlinJavaRuntime.xml

Lines changed: 17 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/misc.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/modules.xml

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/.idea/vcs.xml

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

2023/day07_1/day07_1.iml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<module type="JAVA_MODULE" version="4">
3+
<component name="NewModuleRootManager" inherit-compiler-output="true">
4+
<exclude-output />
5+
<content url="file://$MODULE_DIR$">
6+
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
7+
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
8+
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
9+
<sourceFolder url="file://$MODULE_DIR$/testResources" type="java-test-resource" />
10+
</content>
11+
<orderEntry type="inheritedJdk" />
12+
<orderEntry type="sourceFolder" forTests="false" />
13+
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
14+
</component>
15+
</module>

2023/day07_1/src/Main.kt

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
import java.io.File
2+
3+
fun main(args: Array<String>) {
4+
println("AOC 2023, Day 7, Part 1 starting!!!!")
5+
6+
val hands = ArrayList<CamelCardHand>()
7+
File(args[0]).forEachLine {
8+
val split = it.split(' ')
9+
hands.add(CamelCardHand(split[0], split[1].toInt()))
10+
}
11+
12+
val sortedHands = hands.stream().sorted { o1, o2 -> o1.compareTo(o2) }
13+
14+
var answer = 0L
15+
var rank = 1L
16+
sortedHands.forEach {
17+
answer += it.bid * rank
18+
rank++
19+
}
20+
21+
println("Total Winnings: $answer")
22+
23+
println("AOC 2023, Day 7, Part 1 completed!!!")
24+
}
25+
26+
class CamelCardHand (private val hand:String, val bid:Int) {
27+
fun compareTo(otherHand:CamelCardHand):Int {
28+
val leftType = calculateType()
29+
val rightType = otherHand.calculateType()
30+
if(leftType == rightType) {
31+
// if there are both the same type, check hand rank
32+
return compareByRank(otherHand)
33+
}
34+
if(leftType > rightType) return 1
35+
return -1
36+
}
37+
38+
private fun compareByRank(otherHand:CamelCardHand):Int {
39+
for(i in 0..5) {
40+
val leftChar = hand.toCharArray()[i]
41+
val rightChar = otherHand.hand.toCharArray()[i]
42+
if(leftChar.compareTo(rightChar) == 0) {
43+
continue
44+
}
45+
if(cardValue(leftChar) > cardValue(rightChar)) {
46+
return 1
47+
}
48+
return -1
49+
}
50+
// shouldn't get here but for completeness
51+
return 0
52+
}
53+
54+
private fun calculateType():HandType {
55+
val matches = HashMap<Char, Int>()
56+
for(c in hand.toCharArray()) {
57+
matches[c] = matches.getOrDefault(c,0) + 1
58+
}
59+
60+
if(matches.values.stream().filter { it == 5 }.count() == 1L) {
61+
return HandType.FIVE_KIND
62+
}
63+
if(matches.values.stream().filter { it == 4 }.count() == 1L) {
64+
return HandType.FOUR_KIND
65+
}
66+
if((matches.values.stream().filter { it == 3 }.count() == 1L) && (matches.values.stream().filter { it == 2 }.count() == 1L)) {
67+
return HandType.FULL_HOUSE
68+
}
69+
if(matches.values.stream().filter { it == 3 }.count() == 1L) {
70+
return HandType.THREE_KIND
71+
}
72+
if(matches.values.stream().filter { it == 2 }.count() == 2L) {
73+
return HandType.TWO_PAIR
74+
}
75+
if (matches.values.stream().filter { it == 2}.count() == 1L) {
76+
return HandType.ONE_PAIR
77+
}
78+
if (matches.values.stream().filter { it == 1 }.count() == 5L) {
79+
return HandType.HIGH_CARD
80+
}
81+
82+
return HandType.HIGH_CARD
83+
}
84+
85+
private fun cardValue(card:Char):Int {
86+
return when(card) {
87+
'2' -> 2
88+
'3' -> 3
89+
'4' -> 4
90+
'5' -> 5
91+
'6' -> 6
92+
'7' -> 7
93+
'8' -> 8
94+
'9' -> 9
95+
'T' -> 10
96+
'J' -> 11
97+
'Q' -> 12
98+
'K' -> 13
99+
'A' -> 14
100+
else -> 0
101+
}
102+
}
103+
104+
enum class HandType {
105+
HIGH_CARD,
106+
ONE_PAIR,
107+
TWO_PAIR,
108+
THREE_KIND,
109+
FULL_HOUSE,
110+
FOUR_KIND,
111+
FIVE_KIND
112+
}
113+
114+
override fun toString():String {
115+
return "hand: $hand, bid $bid"
116+
}
117+
}

0 commit comments

Comments
 (0)