fun process(input:String, part2: Boolean = false):Sequence = buildSequence { var skip = false var garbage = false var level = 0 var discarded = 0 input.forEach { when { skip -> skip = false it == '!' && garbage -> skip = true it == '>' && garbage -> garbage = false it == '<' && !garbage -> garbage = true it == '{' && !garbage -> { level++ ; yield (level)} it == '}' && !garbage -> if (level > 0) level-- garbage -> discarded ++ } } if (part2) yield (discarded) // Last element in the list is the number of discarded characters }