576 tokens in Kotlin for part 1 by Valentin Slawicek
Download solution
sealedclassCharacter(valx:Int,valy:Int)
classSymbol(x:Int,y:Int,valchar:Char,valattachedPartNumbers:MutableList<Int>=mutableListOf()):
Character(x,y)
classEmpty(x:Int,y:Int):Character(x,y)
classDigit(x:Int,y:Int,valdigit:Int,varattachedSymbol:Symbol=null):Character(x,y)
funmain(){
valschematic:List<List<Character>>=generateSequence(::readLine)
.toList()
.mapIndexed{x,line->
line.mapIndexed{y,char->
when{
char=='.'->Empty(x,y)
char.isDigit()->Digit(x,y,char.digitToInt())
else->Symbol(x,y,char)
}
}
}
fungetAdjacentCharacters(x:Int,y:Int):List<Character>{
returnlistOfNotNull(
schematic.getOrNull(x-1)?.getOrNull(y-1),
schematic.getOrNull(x-1)?.getOrNull(y),
schematic.getOrNull(x-1)?.getOrNull(y+1),
schematic.getOrNull(x)?.getOrNull(y-1),
schematic.getOrNull(x)?.getOrNull(y+1),
schematic.getOrNull(x+1)?.getOrNull(y-1),
schematic.getOrNull(x+1)?.getOrNull(y),
schematic.getOrNull(x+1)?.getOrNull(y+1),
)
}
funflagDigits(character:Character,symbol:Symbol){
getAdjacentCharacters(character.x,character.y)
.filterIsInstance<Digit>()
.filter{it.attachedSymbol==null}
.forEach{digit->
digit.attachedSymbol=symbol
flagDigits(digit,symbol)
}
}
schematic.forEachIndexed{x,charactersLine->
charactersLine.forEachIndexed{y,character->
if(characterisSymbol){
flagDigits(character,character)
}
}
}
vardigitSumWithAttachedSymbol=0
schematic.forEachIndexed{x,charactersLine->
valcurrentDigits=mutableListOf<Digit>()
charactersLine.forEachIndexed{y,character->
if(characterisDigit&&character.attachedSymbol!=null){
currentDigits+=character
}else{
if(currentDigits.isNotEmpty()){
valpartNumber=currentDigits.joinToString(""){it.digit.toString()}.toInt()
currentDigits.first().attachedSymbol!!.attachedPartNumbers+=partNumber
digitSumWithAttachedSymbol+=partNumber
currentDigits.clear()
}
}
}
if(currentDigits.isNotEmpty()){
valpartNumber=currentDigits.joinToString(""){it.digit.toString()}.toInt()
currentDigits.first().attachedSymbol!!.attachedPartNumbers+=partNumber
digitSumWithAttachedSymbol+=partNumber
currentDigits.clear()
}
}
println(digitSumWithAttachedSymbol)
}