-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay05.kt
103 lines (94 loc) · 2.57 KB
/
Day05.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package Year2015
import expect
import readInput
import testInput
fun main() {
fun part1(input: List<String>): Any {
val vowels = "aeiou"
val disallowed = listOf("ab", "cd", "pq", "xy")
return input.count { str ->
var vowelsCount = 0
var hasPair = false
var hasDisallowed = false
var prev = str[0]
if (prev in vowels) {
vowelsCount++
}
for (i in 1..str.lastIndex) {
val curr = str[i]
if (curr in vowels) {
vowelsCount++
}
if (prev == curr) {
hasPair = true
}
if ("$prev$curr" in disallowed) {
hasDisallowed = true
}
prev = curr
}
vowelsCount >= 3 && hasPair && !hasDisallowed
}
}
fun part2(input: List<String>): Any {
return input.count { str ->
val pairs = mutableMapOf<String, Int>()
var hasPairs = false
var hasMiddle = false
var i = 0
while (i < str.length - 2) {
if (!hasPairs) {
for (j in i..i + 1) {
val cur = str.substring(j, j + 2)
val prev = pairs[cur]
if (prev != null && prev < j - 1) {
hasPairs = true
} else {
pairs[cur] = j
}
}
}
if (!hasMiddle) {
if (str[i] == str[i + 2]) {
hasMiddle = true
}
}
if (hasPairs && hasMiddle) {
return@count true
}
i++
}
false
}
}
val input = readInput("Year2015/Day05")
// part 1
expect(
part1(
testInput(
"""
ugknbfddgicrmopn
aaa
jchzalrnumimnmhp
haegwjzuvuyypxyu
dvszwmarrgswjxmb
""".trimIndent()
)
), 2
)
println(part1(input))
// part 2
expect(
part2(
testInput(
"""
qjhvhtzxzqqjkmpb
xxyxx
uurcxstgmygtbstg
ieodomkazucvgmuy
""".trimIndent()
)
), 2
)
println(part2(input))
}