290 tokens in Kotlin for part 2 by Valentin Slawicek
Download solution
dataclassCard(valcardNumber:Int,valwinningNumbers:Set<Int>,valnumbersYouHave:Set<Int>)
funmain(){
valcards=generateSequence(::readLine)
.map{line->
valcardNumber=line.substringBefore(":").substringAfterLast(" ").toInt()
valwinningNumbers=line
.substringAfter(":")
.substringBefore("|")
.split(" ")
.mapNotNull{number->number.trim().takeIf{it.isNotEmpty()}?.toInt()}
valnumbersYouHave=line
.substringAfter("|")
.split(" ")
.mapNotNull{number->number.trim().takeIf{it.isNotEmpty()}?.toInt()}
Card(cardNumber,winningNumbers.toSet(),numbersYouHave.toSet())
}
valcardsToMatches:Map<Card,Int>=cards.associateWith{it.winningNumbers.intersect(it.numbersYouHave).count()}
valcardCount:MutableMap<Int,Int>=cardsToMatches.keys.map{it.cardNumber}.associateWith{1}.toMutableMap()
cardsToMatches.forEach{(card,matches)->
(card.cardNumber+1..card.cardNumber+matches).forEach{nextCardNumber->
cardCount[nextCardNumber]=cardCount[nextCardNumber]!!+cardCount[card.cardNumber]!!
}
}
println(cardCount.values.sum())
}