-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day11CorporatePolicy.kt
39 lines (31 loc) · 1.26 KB
/
Day11CorporatePolicy.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
package adventofcode.year2015
import adventofcode.Puzzle
import adventofcode.PuzzleInput
class Day11CorporatePolicy(customInput: PuzzleInput? = null) : Puzzle(customInput) {
override fun partOne() = input.nextPassword()
override fun partTwo() = input.nextPassword().nextPassword()
companion object {
private fun String.nextPassword() = generateSequence(this) { it.increment() }
.drop(1)
.filter { password -> ('a'..'x').any { password.contains("$it${it + 1}${it + 2}") } }
.filter { password -> listOf('i', 'o', 'l').none { password.contains(it) } }
.filter { password ->
val pairs = ('a'..'z').map { "$it$it" }
val firstPair = pairs.firstOrNull { password.contains(it) }
firstPair != null && pairs.minus(firstPair).any { password.contains(it) }
}
.first()
private fun String.increment(): String {
val chars = toMutableList()
for (i in chars.size - 1 downTo 0) {
if (chars[i] == 'z') {
chars[i] = 'a'
} else {
chars[i]++
break
}
}
return chars.joinToString("")
}
}
}