Day 5: Added timings and compared to a naive "String.substring" implementation
This commit is contained in:
@@ -6,9 +6,12 @@ import kotlin.system.measureTimeMillis
|
||||
fun main() {
|
||||
|
||||
val day = Day5()
|
||||
println("Puzzle 1 time: " + measureTimeMillis { day.puzzle1() } + " ms")
|
||||
println("Puzzle 2 time: " + measureTimeMillis { day.puzzle2() } + " ms")
|
||||
println("Puzzle 1 linked list time: " + measureTimeMillis { day.puzzle1() } + " ms")
|
||||
println("Puzzle 2 linked list time: " + measureTimeMillis { day.puzzle2() } + " ms")
|
||||
|
||||
val dayNaive = Day5Substring()
|
||||
println("Puzzle 1 substring time: " + measureTimeMillis { dayNaive.puzzle1() } + " ms")
|
||||
println("Puzzle 2 substring time: " + measureTimeMillis { dayNaive.puzzle2() } + " ms")
|
||||
}
|
||||
|
||||
class Day5 {
|
||||
@@ -123,4 +126,38 @@ class Day5 {
|
||||
return "" + char
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Day5Substring {
|
||||
fun puzzle1() {
|
||||
println(react(lines("/day/5/input.txt").findFirst().get()).length)
|
||||
}
|
||||
|
||||
fun puzzle2() {
|
||||
val fullPolymerString = lines("/day/5/input.txt").findFirst().get()
|
||||
println(fullPolymerString.chars()
|
||||
.distinct().boxed()
|
||||
.map { it.toChar() }.map { it.toString() }
|
||||
.map { it.toUpperCase() }
|
||||
.distinct()
|
||||
.mapToInt { react(fullPolymerString.replace(it.toString(), "", true)).length }
|
||||
.min()!!)
|
||||
}
|
||||
|
||||
fun react(polymer: String): String {
|
||||
|
||||
var curPolymer = polymer
|
||||
|
||||
var i = 0
|
||||
while(i < curPolymer.length - 1) {
|
||||
if (reactsWith(curPolymer[i], curPolymer[i + 1])) {
|
||||
curPolymer = curPolymer.substring(0, i) + curPolymer.substring(i + 2)
|
||||
i = if (i == 0) -1 else i - 2
|
||||
}
|
||||
i++
|
||||
}
|
||||
return curPolymer
|
||||
}
|
||||
|
||||
fun reactsWith(char1: Char, char2: Char): Boolean = abs(char1.minus(char2)) == 32
|
||||
}
|
||||
Reference in New Issue
Block a user