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


// Task1.kt
fun rectangleArea(width: Double, height: Double = width): Double = width * height
fun circleArea(radius: Double, pi: Double = Math.PI): Double = pi * radius * radius
fun triangleArea(a: Double, b: Double, c: Double): Double {
    val p = (a + b + c) / 2.0
    return Math.sqrt(p * (p - a) * (p - b) * (p - c))
}
fun totalPerimeter(vararg sides: Double): Double = sides.sum()

fun main() {
    println(rectangleArea(5.0, 10.0))
    println(rectangleArea(width = 4.0))
    println(circleArea(3.0))
    println(circleArea(radius = 3.0, pi = 3.14))
    println(triangleArea(3.0, 4.0, 5.0))
    println(triangleArea(a = 3.0, b = 4.0, c = 5.0))
    println(totalPerimeter(2.0, 3.0, 4.0))
    println(totalPerimeter(sides = doubleArrayOf(5.0, 5.0, 10.0, 10.0)))
}



// Task2.kt
typealias Operation = (Double, Double) -> Double

fun calculate(a: Double, b: Double, operation: Operation): Double = operation(a, b)

fun main() {
    val operations: Map<String, Operation> = mapOf(
        "+" to { a, b -> a + b },
        "-" to { a, b -> a - b },
        "*" to { a, b -> a * b },
        "/" to { a, b -> if (b == 0.0) Double.NaN else a / b },
        "%" to { a, b -> a % b },
        "^" to { a, b -> Math.pow(a, b) },
        "max" to { a, b -> maxOf(a, b) }
    )

    val a = readln().toDouble()
    val opSymbol = readln()
    val b = readln().toDouble()

    val selectedOperation = operations[opSymbol]
    if (selectedOperation != null) {
        println(calculate(a, b, selectedOperation))
    } else {
        println("Ошибка")
    }
}

// Task3.kt
fun String.isEmailValid(): Boolean = this.contains('@') && this.indexOf('.') > this.indexOf('@')

fun String.maskPassword(): String {
    if (this.length <= 2) return "*".repeat(this.length)
    return "${this.first()}${"*".repeat(this.length - 2)}${this.last()}"
}

fun String.wordCount(): Int = if (this.isBlank()) 0 else this.trim().split("\\s+".toRegex()).size

fun Int.isEven(): Boolean = this % 2 == 0
fun Int.hoursToMinutes(): Int = this * 60

infix fun Int.timesRepeat(action: () -> Unit) {
    for (i in 0 until this) action()
}

fun <T> List<T>.secondOrNull(): T? = if (this.size >= 2) this[1] else null
fun <T> List<T>.thirdOrNull(): T? = if (this.size >= 3) this[2] else null

fun main() {
    println("test@mail.ru".isEmailValid())
    println("secret123".maskPassword())
    println("Kotlin is awesome".wordCount())
    println(4.isEven())
    println(2.hoursToMinutes())
    3 timesRepeat { println("Привет!") }
    val list = listOf("Apple", "Banana", "Cherry")
    println(list.secondOrNull())
    println(list.thirdOrNull())
}


// Task4.kt
data class User(val name: String, var email: String?, var age: Int, var isActive: Boolean = false)
data class Config(var host: String, var port: Int, var timeout: Int = 30)

fun main() {
    val user = User(name = "Александр", email = null, age = 17)
    user.email?.let { println(it) }
    user.apply { email = "user@mail.ru"; isActive = true }
    println(user)

    val config = Config("localhost", 8080).apply { port = 3000; timeout = 60 }.also { println(it) }
    println(config)

    val processed = "  Kotlin is Awesome  ".run { trim().uppercase() }.let { "Результат: $it, длина: ${it.length}" }
    println(processed)

    val numbers = listOf(10, 20, 30)
    val (sum, average, max) = with(numbers) { Triple(this.sum(), this.average(), this.maxOrNull() ?: 0) }
    println("$sum, $average, $max")

    val nullableList: List<Int>? = listOf(1, 2, 3)
    nullableList?.let { println(it.sum()) }
}


// Task5.kt
data class Task(val id: Int, val title: String, val priority: String = "medium", var isDone: Boolean = false)

fun Task.format(): String {
    val status = if (isDone) "✓" else " "
    return "[$status] #$id $title ($priority)"
}

fun List<Task>.completedCount(): Int = this.count { it.isDone }
fun List<Task>.pendingCount(): Int = this.count { !it.isDone }

class TodoListManager {
    private val tasks = mutableListOf<Task>()
    private var nextId = 1

    fun addTask(title: String, priority: String = "medium") {
        tasks.add(Task(id = nextId++, title = title, priority = priority))
    }

    fun markDone(id: Int) {
        tasks.find { it.id == id }?.apply { isDone = true }
    }

    fun removeTask(id: Int) {
        tasks.removeIf { it.id == id }
    }

    fun filterTasks(predicate: (Task) -> Boolean): List<Task> = tasks.filter(predicate)
    fun printTasks(list: List<Task>) { list.forEach { println(it.format()) } }
}

fun main() {
    val manager = TodoListManager()
    manager.addTask("Купить молоко", "low")
    manager.addTask("Сделать ДЗ", "high")
    manager.addTask("Помыть машину", "medium")
    manager.addTask("Сдать курсовую", "high")
    manager.addTask("Купить продукты", "medium")

    manager.printTasks(manager.filterTasks { true })
    manager.markDone(2)
    manager.markDone(4)
    manager.removeTask(1)

    manager.printTasks(manager.filterTasks { it.priority == "high" })
    val all = manager.filterTasks { true }
    println("Всего: ${all.size}, Выполнено: ${all.completedCount()}, В процессе: ${all.pendingCount()}")
}


// Bonus.kt
data class ServerConfig(var host: String = "localhost", var port: Int = 8080, var ssl: Boolean = false, var retries: Int = 3)

fun serverConfig(block: ServerConfig.() -> Unit): ServerConfig {
    return ServerConfig().apply(block).also {
        println("Сервер настроен: host=${it.host}, port=${it.port}")
    }
}

fun main() {
    val config = serverConfig {
        host = "api.example.com"
        port = 443
        ssl = true
        retries = 5
    }
    println(config)
}