Решение
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
data class Interval(val warehouse: Int, val start: String, val end: String, val type: String)
fun main(args: Array<String>) {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
// Считываем все строки входного CSV
val lines = mutableListOf<String>()
var line = reader.readLine()
while (line != null) {
lines.add(line)
line = reader.readLine()
}
// Парсим входные данные
val intervals = mutableListOf<Interval>()
for (l in lines) {
val parts = l.split(",")
val warehouse = parts[0].toInt()
val (start, end) = parts[1].split(" ")
val type = parts[2]
if (type == "NULL") {
// Для NULL добавляем три записи
intervals.add(Interval(warehouse, start, end, "KGT"))
intervals.add(Interval(warehouse, start, end, "COLD"))
intervals.add(Interval(warehouse, start, end, "OTHER"))
} else {
intervals.add(Interval(warehouse, start, end, type))
}
}
// Группируем по складу и типу товара
val grouped = intervals.groupBy { it.warehouse to it.type }
// Результат после объединения интервалов
val result = mutableListOf<Interval>()
for ((key, group) in grouped) {
val (warehouse, type) = key
// Сортируем интервалы по началу
val sorted = group.sortedBy { it.start }
val merged = mutableListOf<Interval>()
var current = sorted[0]
// Объединяем пересекающиеся интервалы
for (i in 1 until sorted.size) {
val next = sorted[i]
if (current.end >= next.start) {
// Пересекаются, объединяем
current = Interval(warehouse, current.start, maxOf(current.end, next.end), type)
} else {
merged.add(current)
current = next
}
}
merged.add(current)
result.addAll(merged)
}
// Сортируем результат по требованиям
val sortedResult = result.sortedWith(compareBy(
{ it.warehouse },
{ when (it.type) { "KGT" -> 1; "COLD" -> 2; "OTHER" -> 3; else -> 4 } },
{ it.start }
))
// Выводим результат
for (interval in sortedResult) {
writer.write("${interval.warehouse},${interval.start} ${interval.end},${interval.type}")
writer.newLine()
}
reader.close()
writer.close()
}