Загрузка данных


data class WordStats(
    val word: String,
    val count: Int,
    val length: Int
)

fun main() {
    val text = "Kotlin — прекрасный язык программирования. Разработка мобильных приложений на Kotlin приносит удовольствие. Программирования становится меньше, а Kotlin помогает писать чистый и прекрасный код."

    val stats = analyzeText(text)

    println("=== СТАТИСТИКА ТЕКСТА ===")
    println("Общее количество слов: ${stats["totalWords"]}")
    println("Уникальных слов: ${stats["uniqueWords"]}")
    println("Средняя длина слова: ${String.format("%.2f", stats["averageWordLength"])}")
    println("Самое длинное слово: ${stats["longestWord"]}")

    println("\nТоп-5 самых частых слов:")
    @Suppress("UNCHECKED_CAST")
    (stats["top5Words"] as List<WordStats>).forEach {
        println("   '${it.word}' — встретилось ${it.count} раз(а) (длина: ${it.length})")
    }
}

fun analyzeText(text: String): Map<String, Any> {
    val words = text.replace(Regex("[^a-zA-Zа-яА-ЯёЁ\\s]"), " ")
        .lowercase()
        .split(Regex("\\s+"))
        .filter { it.length >= 3 }

    val totalWords = words.size
    val uniqueWords = words.distinct().size
    val averageWordLength = if (words.isNotEmpty()) words.map { it.length }.average() else 0.0
    val longestWord = words.maxByOrNull { it.length } ?: ""

    val wordFrequency = words.groupBy { it }
        .mapValues { it.value.size }

    val top5Words = wordFrequency.entries
        .sortedByDescending { it.value }
        .take(5)
        .map { (word, count) -> WordStats(word, count, word.length) }

    return mapOf(
        "totalWords" to totalWords,
        "uniqueWords" to uniqueWords,
        "averageWordLength" to averageWordLength,
        "longestWord" to longestWord,
        "wordFrequency" to wordFrequency,
        "top5Words" to top5Words
    )
}