https://coderun.yandex.ru/problem/ivan-and-opensource/description | Средняя |
---|
В ходе решения рабочей задачи программист Иван написал библиотеку, которая показалась ему полезной и для сообщества. Обсудив детали с руководителем и получив согласие, он решил выложить её в opensource. Но рабочий репозиторий содержит файлы, описывающие внутреннюю кухню, а их, как известно, нельзя выкладывать за пределы монорепозитория компании.
Иван убедился, что на работу библиотеки эти файлы никак не влияют. Поэтому Иван решил автоматически удалить их из библиотеки. У него есть список файлов, относящихся к библиотеке, а также чёрный список, содержащий пути ко внутренним файлам репозитория. Далее Иван собирается удалить все файлы библиотеки, которые находятся в директориях из чёрного списка.
Вам же необходимо написать программу, которая соберёт статистику по удалённым файлам из директорий.
Ввод:
2 /project/internal/ /project/docs/ 5 /project/docs/internal.md /project/lib/header.cpp /project/lib/header.h /project/bin/main.cpp /project/internal/secret.h 3 / /project/internal/ /project/lib/Вывод:
2 .md: 1 .h: 1 1 .h: 1 0
Ввод:
2 /lib/folder_1/ /lib/folder_2/folder_3/ 7 /lib/a.cpp /lib/folder_2/b.cpp /lib/folder_1/c.cpp /lib/folder_2/folder_4/d.cpp /lib/folder_1/folder_5/e.cpp /lib/folder_2/folder_3/folder_6/f.py /lib/folder_2/folder_3/g.cpp 3 /lib/ /lib/folder_1/ /lib/folder_2/Вывод:
2 .cpp: 3 .py: 1 1 .cpp: 2 2 .py: 1 .cpp: 1
import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.BufferedWriter
import java.io.OutputStreamWriter
fun main() {
val reader = BufferedReader(InputStreamReader(System.`in`))
val writer = BufferedWriter(OutputStreamWriter(System.out))
// Читаем чёрный список
val n = reader.readLine().toInt()
val blacklist = Array(n) { reader.readLine() }
// Читаем файлы библиотеки
val m = reader.readLine().toInt()
val files = Array(m) { reader.readLine() }
// Читаем запросы
val q = reader.readLine().toInt()
val queries = Array(q) { reader.readLine() }
// Определяем удалённые файлы
val deletedFiles = mutableListOf<Pair<String, String>>() // Путь и расширение
for (file in files) {
for (blackDir in blacklist) {
if (file.startsWith(blackDir)) {
val ext = file.substring(file.lastIndexOf("."))
deletedFiles.add(Pair(file, ext))
break
}
}
}
// Обрабатываем запросы
for (queryDir in queries) {
val extCount = mutableMapOf<String, Int>()
for ((file, ext) in deletedFiles) {
if (file.startsWith(queryDir)) {
extCount[ext] = extCount.getOrDefault(ext, 0) + 1
}
}
// Выводим результат
writer.write("${extCount.size}\\n")
for ((ext, count) in extCount) {
writer.write("$ext: $count\\n")
}
}
reader.close()
writer.close()
}