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


// ---------- Extension-функции для String ----------
// Проверяет, есть ли в строке '@' и '.' после '@'
fun String.isValidEmail(): Boolean {
    val at = indexOf('@') // позиция символа '@', если нет – вернёт -1
    if (at < 0) return false // если '@' нет – сразу false
    val dot = indexOf('.', at) // ищем '.' начиная с позиции at
    // Проверяем, что точка есть, она после '@' и не последняя
    if (dot <= at || dot >= length - 1) return false
    return true
}

// Маскирует пароль: оставляет первый и последний символы, остальные заменяет на '*'
fun String.maskPassword(): String {
    if (length <= 2) { // если длина 1 или 2, то просто звёздочки
        var stars = ""
        for (i in 1..length) stars += "*"
        return stars
    }
    val first = get(0) // первый символ
    val last = get(length - 1) // последний
    var middle = ""
    for (i in 1..length - 2) middle += "*" // добавляем нужное количество звёзд
    return "$first$middle$last" // собираем строку
}

// Считает количество слов в строке (разбивает по пробелам и отбрасывает пустые)
fun String.wordCount(): Int {
    val parts = split(" ") // разбиваем строку по пробелам
    var count = 0
    for (part in parts) {
        if (part.isNotEmpty()) count++ // если часть не пустая – это слово
    }
    return count
}

// ---------- Extension-функции для Int ----------
// Проверяет, чётное ли число
fun Int.isEven(): Boolean = this % 2 == 0

// Переводит часы в минуты (умножает на 60)
fun Int.hoursToMinutes(): Int = this * 60

// infix-функция: выполняет переданное действие указанное количество раз
infix fun Int.timesRepeat(action: () -> Unit) {
    var i = 1
    while (i <= this) {
        action() // выполняем действие
        i++
    }
}

// ---------- Extension-функции для List<T> ----------
// Возвращает второй элемент списка, или null, если его нет
fun <T> List<T>.secondOrNull(): T? {
    if (size >= 2) return this[1]
    else return null
}

// Возвращает третий элемент, или null
fun <T> List<T>.thirdOrNull(): T? {
    if (size >= 3) return this[2]
    else return null
}

fun main() {
    // Тестируем String-расширения
    println("test@mail.ru -> " + "test@mail.ru".isValidEmail()) // true
    println("testmail.ru -> " + "testmail.ru".isValidEmail())   // false
    println("secret123 -> " + "secret123".maskPassword())       // s*******3
    println("ab -> " + "ab".maskPassword())                     // **
    println("Hello world Kotlin слов: " + "Hello world Kotlin".wordCount()) // 3

    // Тестируем Int-расширения
    println("4 чётное? " + 4.isEven())   // true
    println("7 чётное? " + 7.isEven())   // false
    println("2 часа в минутах: " + 2.hoursToMinutes()) // 120
    println("5 часов в минутах: " + 5.hoursToMinutes()) // 300

    // infix-функция: "3 timesRepeat { ... }" означает выполнить блок 3 раза
    3 timesRepeat { println("Привет!") }

    // Тестируем List-расширения
    val list = listOf(10, 20, 30, 40)
    println("Второй элемент: " + list.secondOrNull()) // 20
    println("Третий элемент: " + list.thirdOrNull())   // 30
    val empty = listOf<Int>()
    println("Второй у пустого: " + empty.secondOrNull()) // null
}