408 tokens in Kotlin for part 1 by Valentin Slawicek
Download solution
dataclassMapEntry(
valsource:String,
valdestination:String,
valsourceStart:Long,
valdestinationStart:Long,
valrangeLength:Long
){
valsourceRange=LongRange(sourceStart,sourceStart+rangeLength-1)
}
funmain(){
valmapEntries=mutableListOf<MapEntry>()
varseeds:List<Long>=emptyList()
varcurrentMap=""to""
generateSequence(::readLine)
.forEach{line->
when{
line.startsWith("seeds: ")->{
seeds=line.substringAfter("seeds: ").split(" ").map{it.toLong()}
}
line.endsWith(" map:")->{
currentMap=line.substringBefore("-")toline.substringAfter("-to-").substringBefore(" ")
}
line.isEmpty()->Unit
else->{
valmapEntryString=line.split(" ").map{it.toLong()}
mapEntries+=MapEntry(
source=currentMap.first,
destination=currentMap.second,
destinationStart=mapEntryString[0],
sourceStart=mapEntryString[1],
rangeLength=mapEntryString[2]
)
}
}
}
fungetMapEntry(source:String,number:Long):MapEntry{
returnmapEntries.singleOrNull{it.source==source&&it.sourceStart<=number&&it.sourceStart+it.rangeLength>number}
?:mapEntries.first{it.source==source}.copy(sourceStart=number,destinationStart=number,rangeLength=1)
}
funresolve(source:String,number:Long):Long{
valmapEntry=getMapEntry(source,number)
valdestinationNumber=mapEntry.destinationStart+number-mapEntry.sourceStart
returnif(mapEntry.destination=="location"){
destinationNumber
}else{
resolve(mapEntry.destination,destinationNumber)
}
}
println(seeds.minOf{resolve("seed",it)})
}