diff --git a/src/lesson1/task1/Simple.kt b/src/lesson1/task1/Simple.kt index 57d2a0f46..9731905d2 100644 --- a/src/lesson1/task1/Simple.kt +++ b/src/lesson1/task1/Simple.kt @@ -65,7 +65,7 @@ fun main() { * Пользователь задает время в часах, минутах и секундах, например, 8:20:35. * Рассчитать время в секундах, прошедшее с начала суток (30035 в данном случае). */ -fun seconds(hours: Int, minutes: Int, seconds: Int): Int = TODO() +fun seconds(hours: Int, minutes: Int, seconds: Int): Int = (hours * 60 * 60) + (minutes * 60) + seconds /** * Тривиальная (1 балл) @@ -76,6 +76,7 @@ fun seconds(hours: Int, minutes: Int, seconds: Int): Int = TODO() */ fun lengthInMeters(sagenes: Int, arshins: Int, vershoks: Int): Double = TODO() + /** * Тривиальная (1 балл) * @@ -92,13 +93,15 @@ fun angleInRadian(deg: Int, min: Int, sec: Int): Double = TODO() */ fun trackLength(x1: Double, y1: Double, x2: Double, y2: Double): Double = TODO() + /** * Простая (2 балла) * * Пользователь задает целое число, большее 100 (например, 3801). * Определить третью цифру справа в этом числе (в данном случае 8). */ -fun thirdDigit(number: Int): Int = TODO() +fun thirdDigit(number: Int): Int = (number / 100) % 10 + /** * Простая (2 балла) @@ -107,7 +110,8 @@ fun thirdDigit(number: Int): Int = TODO() * прибыл на станцию назначения в h2 часов m2 минут того же дня (например в 13:01). * Определите время поезда в пути в минутах (в данном случае 216). */ -fun travelMinutes(hoursDepart: Int, minutesDepart: Int, hoursArrive: Int, minutesArrive: Int): Int = TODO() +fun travelMinutes(hoursDepart: Int, minutesDepart: Int, hoursArrive: Int, minutesArrive: Int): Int = + (hoursArrive * 60 + minutesArrive) - (hoursDepart * 60 + minutesDepart) /** * Простая (2 балла) @@ -124,4 +128,4 @@ fun accountInThreeYears(initial: Int, percent: Int): Double = TODO() * Пользователь задает целое трехзначное число (например, 478). * Необходимо вывести число, полученное из заданного перестановкой цифр в обратном порядке (например, 874). */ -fun numberRevert(number: Int): Int = TODO() +fun numberRevert(number: Int): Int = ((number % 10) * 100) + ((number / 10) % 10) * 10 + number / 100 \ No newline at end of file diff --git a/src/lesson12/task1/PhoneBook.kt b/src/lesson12/task1/PhoneBook.kt index 66b05322e..47d7ba796 100644 --- a/src/lesson12/task1/PhoneBook.kt +++ b/src/lesson12/task1/PhoneBook.kt @@ -18,13 +18,26 @@ package lesson12.task1 * Класс должен иметь конструктор по умолчанию (без параметров). */ class PhoneBook { + var bookList: MutableList = mutableListOf() /** * Добавить человека. * Возвращает true, если человек был успешно добавлен, * и false, если человек с таким именем уже был в телефонной книге * (во втором случае телефонная книга не должна меняться). */ - fun addHuman(name: String): Boolean = TODO() + fun addHuman(name: String): Boolean { + var check: Boolean? = null + for (i in bookList){ + if (i.getName() == name) + check = false + } + return if (check == false) + check + else{ + bookList.plusAssign(Person(name, setOf())) + true + } + } /** * Убрать человека. @@ -32,7 +45,21 @@ class PhoneBook { * и false, если человек с таким именем отсутствовал в телефонной книге * (во втором случае телефонная книга не должна меняться). */ - fun removeHuman(name: String): Boolean = TODO() + fun removeHuman(name: String): Boolean { + var check: Boolean? = false + var del = Person(null.toString(), emptySet()) + for(i in bookList){ + if(i.getName() == name) { + del = i + check = true + } + } + return if(check == true) { + bookList.minusAssign(del) + true + } + else false + } /** * Добавить номер телефона. @@ -41,7 +68,23 @@ class PhoneBook { * либо у него уже был такой номер телефона, * либо такой номер телефона зарегистрирован за другим человеком. */ - fun addPhone(name: String, phone: String): Boolean = TODO() + fun addPhone(name: String, phone: String): Boolean { + var bookListBackUp = bookList + var numb = -1 + var check: Boolean = false + for(i in bookList){ + numb += 1 + if(i.getNumberList().contains(phone)) return false + else { + if (i.getName() == name && !i.getNumberList().contains(phone)) { + check = true + bookList[numb] = i.addNumber(phone) + } + } + + } + return check + } /** * Убрать номер телефона. @@ -49,24 +92,94 @@ class PhoneBook { * и false, если человек с таким именем отсутствовал в телефонной книге * либо у него не было такого номера телефона. */ - fun removePhone(name: String, phone: String): Boolean = TODO() + fun removePhone(name: String, phone: String): Boolean { + var check: Boolean = false + var numb = -1 + for(i in bookList){ + numb += 1 + if(i.getName() == name && i.getNumberList().contains(phone)) { + bookList[numb] = i.removeNumber(phone) + check = true + } + } + return check + } /** * Вернуть все номера телефона заданного человека. * Если этого человека нет в книге, вернуть пустой список */ - fun phones(name: String): Set = TODO() + fun phones(name: String): Set { + var result: Set = setOf() + var check: Boolean = false + for (i in bookList){ + if (i.getName() == name) + result = i.getNumberList() + } + return result + } /** * Вернуть имя человека по заданному номеру телефона. * Если такого номера нет в книге, вернуть null. */ - fun humanByPhone(phone: String): String? = TODO() + fun humanByPhone(phone: String): String? { + var result: String? = null + for(i in bookList){ + if(i.getNumberList().contains(phone)) result = i.getName() + } + return result + } + + /** * Две телефонные книги равны, если в них хранится одинаковый набор людей, * и каждому человеку соответствует одинаковый набор телефонов. * Порядок людей / порядок телефонов в книге не должен иметь значения. */ - override fun equals(other: Any?): Boolean = TODO() -} \ No newline at end of file + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as PhoneBook + + if (bookList == other.bookList) return false + + return true + } + + override fun hashCode(): Int { + return bookList.hashCode() + } + +} + + +data class Person(val person_name: String, var phone_numbers: Set){ + private var personname: String = person_name + private var numberList:Set = phone_numbers + + + // Получить имя + fun getName(): String { + return personname + } + + // Получить номер + fun getNumberList(): Set { + return numberList + } + + // Добавить номер + fun addNumber(number:String): Person { + var result = Person(person_name = person_name, phone_numbers = phone_numbers + setOf(number)) + return result + } + + // Удалить номер + fun removeNumber(number: String): Person { + var result = Person(person_name = person_name, phone_numbers = phone_numbers - setOf(number)) + return result + } +} diff --git a/src/lesson2/task1/IfElse.kt b/src/lesson2/task1/IfElse.kt index 777689ac9..6dd4a2e81 100644 --- a/src/lesson2/task1/IfElse.kt +++ b/src/lesson2/task1/IfElse.kt @@ -3,6 +3,7 @@ package lesson2.task1 import lesson1.task1.discriminant +import java.lang.Math.min import kotlin.math.max import kotlin.math.sqrt @@ -68,7 +69,17 @@ fun minBiRoot(a: Double, b: Double, c: Double): Double { * Мой возраст. Для заданного 0 < n < 200, рассматриваемого как возраст человека, * вернуть строку вида: «21 год», «32 года», «12 лет». */ -fun ageDescription(age: Int): String = TODO() +fun ageDescription(age: Int): String { + if ((age % 100 > 4) and (age % 100 < 21)) { + return "$age лет" + } + return when (age % 10) { + 1 -> "$age год" + in 2..4 -> "$age года" + in 5..9, 0 -> "$age лет" + else -> " " + } +} /** * Простая (2 балла) @@ -132,4 +143,8 @@ fun triangleKind(a: Double, b: Double, c: Double): Int = TODO() * Найти длину пересечения отрезков AB и CD. * Если пересечения нет, вернуть -1. */ -fun segmentLength(a: Int, b: Int, c: Int, d: Int): Int = TODO() +fun segmentLength(a: Int, b: Int, c: Int, d: Int): Int { + if (d < a || c > b) return -1 + return min(b, d) - max(a, c) +} + diff --git a/src/lesson2/task2/Logical.kt b/src/lesson2/task2/Logical.kt index 1e1c862b2..a83680c54 100644 --- a/src/lesson2/task2/Logical.kt +++ b/src/lesson2/task2/Logical.kt @@ -3,6 +3,7 @@ package lesson2.task2 import lesson1.task1.sqr +import ru.spbstu.kotlin.generate.combinators.shrinkIterable /** * Пример @@ -36,7 +37,12 @@ fun queenThreatens(x1: Int, y1: Int, x2: Int, y2: Int): Boolean = TODO() * Дан номер месяца (от 1 до 12 включительно) и год (положительный). * Вернуть число дней в этом месяце этого года по григорианскому календарю. */ -fun daysInMonth(month: Int, year: Int): Int = TODO() +fun daysInMonth(month: Int, year: Int): Int = + when (month) { + 2 -> if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 29 else 28 + 1, 3, 5, 7, 8, 10, 12 -> 31 + else -> 30 + } /** * Простая (2 балла) @@ -59,4 +65,45 @@ fun circleInside( * кирпич 4 х 4 х 4 пройдёт через отверстие 4 х 4. * Вернуть true, если кирпич пройдёт */ -fun brickPasses(a: Int, b: Int, c: Int, r: Int, s: Int): Boolean = TODO() +fun brickPasses(a: Int, b: Int, c: Int, r: Int, s: Int): Boolean { + var x1 = 0 + var x2 = 0 + var t1 = 0 + var t2 = 0 + if (a <= b) { + if (a <= c) { + if (b <= c) { + x1 = a + x2 = b + } else { + x1 = a + x2 = c + } + } else { + x1 = c + x2 = a + } + + } else { + if (b <= c) { + if (c <= a) { + x1 = b + x2 = c + } else { + x1 = b + x2 = a + } + } else { + x1 = c + x2 = b + } + } + if (r >= s) { + t1 = s + t2 = r + } else { + t1 = r + t2 = s + } + return ((x1 <= t1) && (x2 <= t2)) +} \ No newline at end of file diff --git a/src/lesson3/task1/Loop.kt b/src/lesson3/task1/Loop.kt index 99beabae0..65fa6e4c2 100644 --- a/src/lesson3/task1/Loop.kt +++ b/src/lesson3/task1/Loop.kt @@ -2,6 +2,9 @@ package lesson3.task1 + +import kotlin.math.abs +import kotlin.math.pow import kotlin.math.sqrt // Урок 3: циклы @@ -72,7 +75,12 @@ fun digitCountInNumber(n: Int, m: Int): Int = * * Использовать операции со строками в этой задаче запрещается. */ -fun digitNumber(n: Int): Int = TODO() +fun digitNumber(n: Int): Int { + var a = 1 + while (10.0.pow(a) <= abs(n)) + a++ + return a +} /** * Простая (2 балла) @@ -80,14 +88,29 @@ fun digitNumber(n: Int): Int = TODO() * Найти число Фибоначчи из ряда 1, 1, 2, 3, 5, 8, 13, 21, ... с номером n. * Ряд Фибоначчи определён следующим образом: fib(1) = 1, fib(2) = 1, fib(n+2) = fib(n) + fib(n+1) */ -fun fib(n: Int): Int = TODO() +fun fib(n: Int): Int { + var fib = 1 + var l = 1 + var m = 0 + for (i in 1 until n) { + fib = l + m + m = l + l = fib + } + return fib +} /** * Простая (2 балла) * * Для заданного числа n > 1 найти минимальный делитель, превышающий 1 */ -fun minDivisor(n: Int): Int = TODO() +fun minDivisor(n: Int): Int { + for (i in 2..sqrt(n.toDouble()).toInt()) { + if (n % i == 0) return i + } + return n +} /** * Простая (2 балла) @@ -112,7 +135,16 @@ fun maxDivisor(n: Int): Int = TODO() * Написать функцию, которая находит, сколько шагов требуется для * этого для какого-либо начального X > 0. */ -fun collatzSteps(x: Int): Int = TODO() +fun collatzSteps(x: Int): Int { + var s = 0 + var number = x + while (number != 1) { + if (number % 2 == 0) number /= 2 + else number = 3 * number + 1 + s += 1 + } + return s +} /** * Средняя (3 балла) @@ -188,7 +220,7 @@ fun sin(x: Double, eps: Double): Double = TODO() * cos(x) = 1 - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... * Нужную точность считать достигнутой, если очередной член ряда меньше eps по модулю * Подумайте, как добиться более быстрой сходимости ряда при больших значениях x. - * Использовать kotlin.math.cos и другие стандартные реализации функции косинуса в этой задаче запрещается. + * Использовать kotlin.math.cos и д ругие стандартные реализации функции косинуса в этой задаче запрещается. */ fun cos(x: Double, eps: Double): Double = TODO() @@ -196,12 +228,12 @@ fun cos(x: Double, eps: Double): Double = TODO() * Сложная (4 балла) * * Найти n-ю цифру последовательности из квадратов целых чисел: - * 149162536496481100121144... + * 149163256496481100121144... * Например, 2-я цифра равна 4, 7-я 5, 12-я 6. * * Использовать операции со строками в этой задаче запрещается. */ -fun squareSequenceDigit(n: Int): Int = TODO() +fun squareSequenceDigit(n: Int): Int = digit(n) { it * it } /** * Сложная (5 баллов) @@ -212,4 +244,19 @@ fun squareSequenceDigit(n: Int): Int = TODO() * * Использовать операции со строками в этой задаче запрещается. */ -fun fibSequenceDigit(n: Int): Int = TODO() +fun fibSequenceDigit(n: Int): Int = digit(n) { fib(it) } + +fun digit(n: Int, f: (Int) -> Int): Int { + var i = 0 + var number = 0 + var amountNumbers = 0 + while (number < n) { + i += 1 + amountNumbers = f(i) + while (amountNumbers != 0) { + number += 1 + amountNumbers /= 10 + } + } + return (f(i) / 10.0.pow(number - n) % 10).toInt() +} diff --git a/src/lesson4/task1/List.kt b/src/lesson4/task1/List.kt index ba2154c41..a1a204b3f 100644 --- a/src/lesson4/task1/List.kt +++ b/src/lesson4/task1/List.kt @@ -3,6 +3,7 @@ package lesson4.task1 import lesson1.task1.discriminant +import kotlin.math.pow import kotlin.math.sqrt // Урок 4: списки @@ -137,7 +138,20 @@ fun mean(list: List): Double = TODO() * * Обратите внимание, что данная функция должна изменять содержание списка list, а не его копии. */ -fun center(list: MutableList): MutableList = TODO() +fun center(list: MutableList): MutableList { + var i = 0 + var sum = 0.0 + var n = 0.0 + for (i in 0 until list.size) { + sum = (sum + list[i]) + n++ + } + for (i in 0 until list.size) { + val elements = list[i] + list[i] = elements - sum / n + } + return list +} /** * Средняя (3 балла) @@ -197,6 +211,7 @@ fun factorizeToString(n: Int): String = TODO() */ fun convert(n: Int, base: Int): List = TODO() + /** * Сложная (4 балла) * @@ -210,6 +225,7 @@ fun convert(n: Int, base: Int): List = TODO() */ fun convertToString(n: Int, base: Int): String = TODO() + /** * Средняя (3 балла) * @@ -217,7 +233,14 @@ fun convertToString(n: Int, base: Int): String = TODO() * из системы счисления с основанием base в десятичную. * Например: digits = (1, 3, 12), base = 14 -> 250 */ -fun decimal(digits: List, base: Int): Int = TODO() +fun decimal(digits: List, base: Int): Int { + var result = 0.0 + for (i in digits.size - 1 downTo 0) { + result += digits[i] * base.toDouble().pow(digits.size - i - 1) + } + return result.toInt() + +} /** * Сложная (4 балла) @@ -231,7 +254,16 @@ fun decimal(digits: List, base: Int): Int = TODO() * Использовать функции стандартной библиотеки, напрямую и полностью решающие данную задачу * (например, str.toInt(base)), запрещается. */ -fun decimalFromString(str: String, base: Int): Int = TODO() +fun decimalFromString(str: String, base: Int): Int { + val result = mutableListOf() + for (i in str) { + result += if (i < 'a') + i - '0' + else + i - 'a' + 10 + } + return decimal(result, base) +} /** * Сложная (5 баллов) @@ -250,4 +282,65 @@ fun roman(n: Int): String = TODO() * Например, 375 = "триста семьдесят пять", * 23964 = "двадцать три тысячи девятьсот шестьдесят четыре" */ -fun russian(n: Int): String = TODO() \ No newline at end of file +fun russian(n: Int): String = buildString { + var quantity = 1 + while (10.0.pow(quantity) <= n) + quantity += 1 + if (quantity > 3) { + val space = + if (((quantity > 4)) or ((quantity == 4) && ((n / 1000) % 10 > 2))) " " + else "" + append( + when { + (n / 10000) % 10 != 1 -> + when ((n / 1000) % 10) { + 1 -> russian((n / 10000) * 10) + space + "одна тысяча" + 2 -> russian((n / 10000) * 10) + space + "две тысячи" + in 3..4 -> russian(n / 1000) + space + "тысячи" + else -> russian(n / 1000) + space + "тысяч" + } + else -> russian(n / 1000) + space + "тысяч" + } + ) + if (n % 1000 != 0) append(" ") + } + for (i in 3 downTo 1) { + val k = (n / 10.0.pow(i - 1) % 10).toInt() + when { + (i == 3) && (k != 0) -> { + val space = if ((n % 100) != 0) " " + else "" + append( + when (k) { + 1 -> "сто$space" + 2 -> "двести$space" + in 3..4 -> russian(k) + "ста$space" + else -> russian(k) + "сот$space" + } + ) + } + (i == 2) && (k > 1) -> { + val space = if ((n % 10) != 0) " " + else "" + append( + when (k) { + in 2..3 -> russian(k) + "дцать$space" + 4 -> "сорок$space" + 9 -> "девяносто$space" + else -> russian(k) + "десят$space" + } + ) + } + (i == 2) && (k == 1) -> append(digits2[n % 10]) + (i == 1) && (k != 0) && ((n / 10) % 10 != 1) -> append(digits1[k - 1]) + } + } +} +val digits1 = listOf( + "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять" +) +val digits2 = listOf( + "десять", "одиннадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", + "семнадцать", "восемнадцать", "девятнадцать" +) + diff --git a/src/lesson5/task1/Map.kt b/src/lesson5/task1/Map.kt index 51ab7411f..c7f8fbd0c 100644 --- a/src/lesson5/task1/Map.kt +++ b/src/lesson5/task1/Map.kt @@ -2,6 +2,8 @@ package lesson5.task1 +import lesson1.task1.seconds + // Урок 5: ассоциативные массивы и множества // Максимальное количество баллов = 14 // Рекомендуемое количество баллов = 9 @@ -96,7 +98,15 @@ fun buildWordSet(text: List): MutableSet { * buildGrades(mapOf("Марат" to 3, "Семён" to 5, "Михаил" to 5)) * -> mapOf(5 to listOf("Семён", "Михаил"), 3 to listOf("Марат")) */ -fun buildGrades(grades: Map): Map> = TODO() +fun buildGrades(grades: Map): Map> { + val gradesMap = mutableMapOf>() + for ((_, grade) in grades) gradesMap[grade] = mutableListOf() + for ((name, grade) in grades) { + + gradesMap[grade]?.plusAssign(name) + } + return gradesMap +} /** * Простая (2 балла) @@ -108,7 +118,14 @@ fun buildGrades(grades: Map): Map> = TODO() * containsIn(mapOf("a" to "z"), mapOf("a" to "z", "b" to "sweet")) -> true * containsIn(mapOf("a" to "z"), mapOf("a" to "zee", "b" to "sweet")) -> false */ -fun containsIn(a: Map, b: Map): Boolean = TODO() +fun containsIn(a: Map, b: Map): Boolean { + for ((i) in a) { + if (a[i] != b[i]) { + return false + } + } + return true +} /** * Простая (2 балла) @@ -183,7 +200,24 @@ fun averageStockPrice(stockPrices: List>): Map "Мария" */ -fun findCheapestStuff(stuff: Map>, kind: String): String? = TODO() +fun findCheapestStuff(stuff: Map>, kind: String): String? { + var productName: String? = null + var minCost: Double? = null + for ((key, value) in stuff) { + if (value.first == kind) { + if (minCost == null) { + productName = key + minCost = value.second + } else { + if (value.second <= minCost) { + minCost = value.second + productName = key + } + } + } + } + return productName +} /** * Средняя (3 балла) @@ -277,7 +311,22 @@ fun propagateHandshakes(friends: Map>): Map Pair(0, 2) * findSumOfTwo(listOf(1, 2, 3), 6) -> Pair(-1, -1) */ -fun findSumOfTwo(list: List, number: Int): Pair = TODO() +fun findSumOfTwo(list: List, number: Int): Pair { + var res1: Int = -1 + var res2: Int = -1 + val check = mutableMapOf() + for ((i, j) in list.withIndex()) { + val a = check[number - j] + if (a != null) { + res1 = a + res2 = i + } + check[j] = i + } + return if (res1 != -1) { + res1 to res2 + } else -1 to -1 +} /** * Очень сложная (8 баллов) diff --git a/src/lesson6/task1/Parse.kt b/src/lesson6/task1/Parse.kt index ae6226d24..9c6c57ccb 100644 --- a/src/lesson6/task1/Parse.kt +++ b/src/lesson6/task1/Parse.kt @@ -2,6 +2,8 @@ package lesson6.task1 +import java.lang.StringBuilder + // Урок 6: разбор строк, исключения // Максимальное количество баллов = 13 // Рекомендуемое количество баллов = 11 @@ -74,7 +76,47 @@ fun main() { * Обратите внимание: некорректная с точки зрения календаря дата (например, 30.02.2009) считается неверными * входными данными. */ -fun dateStrToDigit(str: String): String = TODO() + +val date = mapOf( + "января" to 31, + "февраля" to 28, + "марта" to 31, + "апреля" to 30, + "мая" to 31, + "июня" to 30, + "июля" to 31, + "августа" to 31, + "сентября" to 30, + "октября" to 31, + "ноября" to 30, + "декабря" to 31 +) + +fun dateStrToDigit(str: String): String { + val parts = str.split(" ") + if (parts.size != 3) return "" + var check = false + var numberMonth = 1 + val day = parts[0].toIntOrNull() ?: return "" + var dayAnswer = "" + var month = parts[1] + val year = parts[2].toIntOrNull() ?: return "" + for ((m, d) in date) { + if (month == m && ((day <= d) || (((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) && m == "февраля" && day == 29))) { + check = true + month = if (numberMonth < 10) ("0$numberMonth") + else numberMonth.toString() + } + numberMonth++ + } + dayAnswer = if (day < 10) "0$day" + else "$day" + return if (check) { + "$dayAnswer.$month.$year" + } else "" +} + + /** * Средняя (4 балла) @@ -149,7 +191,16 @@ fun plusMinus(expression: String): Int = TODO() * Вернуть индекс начала первого повторяющегося слова, или -1, если повторов нет. * Пример: "Он пошёл в в школу" => результат 9 (индекс первого 'в') */ -fun firstDuplicateIndex(str: String): Int = TODO() +fun firstDuplicateIndex(str: String): Int { + var k = 0 + val words = str.toLowerCase().split(" ") + for (i in 0 until words.size - 1) { + if (words[i] == words[i + 1]) return k + k += words[i].length + 1 + } + k = -1 + return k +} /** * Сложная (6 баллов) @@ -162,7 +213,20 @@ fun firstDuplicateIndex(str: String): Int = TODO() * или пустую строку при нарушении формата строки. * Все цены должны быть больше нуля либо равны нулю. */ -fun mostExpensive(description: String): String = TODO() +fun mostExpensive(description: String): String { + val parts = """([\S&&[^;]]+)\s(\d+(\.\d+)?)""".toRegex().findAll(description) + var cost = -1.0 + var answer = "" + for (i in parts) { + if (i.groupValues[2].toDouble() > cost) { + cost = i.groupValues[2].toDouble() + answer = i.groupValues[1] + } + } + return answer + +} + /** * Сложная (6 баллов) diff --git a/src/lesson7/task1/Files.kt b/src/lesson7/task1/Files.kt index 3a75dffbc..a39870e0a 100644 --- a/src/lesson7/task1/Files.kt +++ b/src/lesson7/task1/Files.kt @@ -63,7 +63,13 @@ fun alignFile(inputName: String, lineLength: Int, outputName: String) { * Подчёркивание в середине и/или в конце строк значения не имеет. */ fun deleteMarked(inputName: String, outputName: String) { - TODO() + val writer = File(outputName).bufferedWriter() + File(inputName).forEachLine { + if (!it.startsWith('_')) { + writer.appendLine(it) + } + } + writer.close() } /** @@ -75,7 +81,24 @@ fun deleteMarked(inputName: String, outputName: String) { * Регистр букв игнорировать, то есть буквы е и Е считать одинаковыми. * */ -fun countSubstrings(inputName: String, substrings: List): Map = TODO() +fun countSubstrings(inputName: String, substrings: List): Map { + val result = mutableMapOf() + for (i in substrings) + result[i] = 0 + val lines = File(inputName).readLines().map { it.toLowerCase() } + for (l in lines) { + for (i in result.keys) { + val string = i.toLowerCase() + var index = l.indexOf(string) + while (index != -1) { + result[i] = result[i]!! + 1 + index = l.indexOf(string, index + 1) + } + } + } + return result + +} /** @@ -113,7 +136,18 @@ fun sibilants(inputName: String, outputName: String) { * */ fun centerFile(inputName: String, outputName: String) { - TODO() + val result = File(outputName).bufferedWriter() + val size = File(inputName).bufferedReader().readLines().maxOfOrNull { it.trim().length } ?: 0 + val lines = File(inputName).readLines() + File(outputName).bufferedWriter().use { + for (line in lines) { + val correctLine = StringBuilder(line.trim()) + repeat((size - correctLine.length) / 2) { correctLine.insert(0, " ") } + result.write(correctLine.toString()) + result.newLine() + } + } + result.close() } /** @@ -268,15 +302,15 @@ Suspendisse ~~et elit in enim tempus iaculis~~. * * Соответствующий выходной файл: - -

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. - Vestibulum lobortis. Est vehicula rutrum suscipit, ipsum libero placerat tortor. -

-

- Suspendisse et elit in enim tempus iaculis. -

- + +

+Lorem ipsum dolor sit amet, consectetur adipiscing elit. +Vestibulum lobortis. Est vehicula rutrum suscipit, ipsum libero placerat tortor. +

+

+Suspendisse et elit in enim tempus iaculis. +

+ * * (Отступы и переносы строк в примере добавлены для наглядности, при решении задачи их реализовывать не обязательно) @@ -319,65 +353,65 @@ fun markdownToHtmlSimple(inputName: String, outputName: String) { * * Пример входного файла: ///////////////////////////////начало файла///////////////////////////////////////////////////////////////////////////// -* Утка по-пекински - * Утка - * Соус -* Салат Оливье - 1. Мясо - * Или колбаса - 2. Майонез - 3. Картофель - 4. Что-то там ещё -* Помидоры -* Фрукты - 1. Бананы - 23. Яблоки - 1. Красные - 2. Зелёные + * Утка по-пекински + * Утка + * Соус + * Салат Оливье +1. Мясо + * Или колбаса +2. Майонез +3. Картофель +4. Что-то там ещё + * Помидоры + * Фрукты +1. Бананы +23. Яблоки +1. Красные +2. Зелёные ///////////////////////////////конец файла////////////////////////////////////////////////////////////////////////////// * * * Соответствующий выходной файл: ///////////////////////////////начало файла///////////////////////////////////////////////////////////////////////////// - -

-

    -
  • - Утка по-пекински -
      -
    • Утка
    • -
    • Соус
    • -
    -
  • -
  • - Салат Оливье -
      -
    1. Мясо -
        -
      • Или колбаса
      • -
      -
    2. -
    3. Майонез
    4. -
    5. Картофель
    6. -
    7. Что-то там ещё
    8. -
    -
  • -
  • Помидоры
  • -
  • Фрукты -
      -
    1. Бананы
    2. -
    3. Яблоки -
        -
      1. Красные
      2. -
      3. Зелёные
      4. -
      -
    4. -
    -
  • -
-

- + +

+

    +
  • +Утка по-пекински +
      +
    • Утка
    • +
    • Соус
    • +
    +
  • +
  • +Салат Оливье +
      +
    1. Мясо +
        +
      • Или колбаса
      • +
      +
    2. +
    3. Майонез
    4. +
    5. Картофель
    6. +
    7. Что-то там ещё
    8. +
    +
  • +
  • Помидоры
  • +
  • Фрукты +
      +
    1. Бананы
    2. +
    3. Яблоки +
        +
      1. Красные
      2. +
      3. Зелёные
      4. +
      +
    4. +
    +
  • +
+

+ ///////////////////////////////конец файла////////////////////////////////////////////////////////////////////////////// * (Отступы и переносы строк в примере добавлены для наглядности, при решении задачи их реализовывать не обязательно) @@ -404,23 +438,23 @@ fun markdownToHtml(inputName: String, outputName: String) { * Вывести в выходной файл процесс умножения столбиком числа lhv (> 0) на число rhv (> 0). * * Пример (для lhv == 19935, rhv == 111): - 19935 -* 111 +19935 + * 111 -------- - 19935 +19935 + 19935 +19935 -------- - 2212785 +2212785 * Используемые пробелы, отступы и дефисы должны в точности соответствовать примеру. * Нули в множителе обрабатывать так же, как и остальные цифры: - 235 -* 10 +235 + * 10 ----- - 0 +0 +235 ----- - 2350 +2350 * */ fun printMultiplicationProcess(lhv: Int, rhv: Int, outputName: String) { @@ -434,16 +468,16 @@ fun printMultiplicationProcess(lhv: Int, rhv: Int, outputName: String) { * Вывести в выходной файл процесс деления столбиком числа lhv (> 0) на число rhv (> 0). * * Пример (для lhv == 19935, rhv == 22): - 19935 | 22 - -198 906 - ---- - 13 - -0 - -- - 135 - -132 - ---- - 3 +19935 | 22 +-198 906 +---- +13 +-0 +-- +135 +-132 +---- +3 * Используемые пробелы, отступы и дефисы должны в точности соответствовать примеру. * diff --git a/src/lesson8/task1/Geometry.kt b/src/lesson8/task1/Geometry.kt index 85bfc8146..57b302746 100644 --- a/src/lesson8/task1/Geometry.kt +++ b/src/lesson8/task1/Geometry.kt @@ -3,10 +3,7 @@ package lesson8.task1 import lesson1.task1.sqr -import kotlin.math.PI -import kotlin.math.cos -import kotlin.math.sin -import kotlin.math.sqrt +import kotlin.math.* // Урок 8: простые классы // Максимальное количество баллов = 40 (без очень трудных задач = 11) @@ -82,7 +79,13 @@ data class Circle(val center: Point, val radius: Double) { * расстояние между их центрами минус сумма их радиусов. * Расстояние между пересекающимися окружностями считать равным 0.0. */ - fun distance(other: Circle): Double = TODO() + fun distance(other: Circle): Double { + val distanceCircle = + other.center.distance(center) - other.radius - radius + return if (distanceCircle > 0.0) { + distanceCircle + } else 0.0 + } /** * Тривиальная (1 балл) @@ -163,14 +166,19 @@ fun lineBySegment(s: Segment): Line = TODO() * * Построить прямую по двум точкам */ -fun lineByPoints(a: Point, b: Point): Line = TODO() +fun lineByPoints(a: Point, b: Point): Line { + return if (atan((b.y - a.y) / (b.x - a.x)) > 0) Line(a, atan((b.y - a.y) / (b.x - a.x)) % PI) + else Line(a, (PI + (atan((b.y - a.y) / (b.x - a.x)))) % PI) +} /** * Сложная (5 баллов) * * Построить серединный перпендикуляр по отрезку или по двум точкам */ -fun bisectorByPoints(a: Point, b: Point): Line = TODO() +fun bisectorByPoints(a: Point, b: Point): Line = + Line(Point((a.x + b.x) / 2, (a.y + b.y) / 2), ((lineByPoints(a, b).angle) + PI / 2) % PI) + /** * Средняя (3 балла) @@ -184,7 +192,20 @@ fun bisectorByPoints(a: Point, b: Point): Line = TODO() * * Если в списке менее двух окружностей, бросить IllegalArgumentException */ -fun findNearestCirclePair(vararg circles: Circle): Pair = TODO() +fun findNearestCirclePair(vararg circles: Circle): Pair { + if (circles.size < 2) throw IllegalArgumentException() + var result = Pair(Circle(Point(0.0, 0.0), 0.0), Circle(Point(0.0, 0.0), 0.0)) + var minDistance = 2 * (Double.MAX_VALUE) + for (i in circles.indices) { + for (j in (i + 1) until circles.size) { + if (circles[i].distance(circles[j]) < minDistance) { + result = Pair(circles[i], circles[j]) + minDistance = circles[i].distance(circles[j]) + } + } + } + return (result) +} /** * Сложная (5 баллов) diff --git a/test/lesson2/task1/Tests.kt b/test/lesson2/task1/Tests.kt index 52870a8a5..30dc0a891 100644 --- a/test/lesson2/task1/Tests.kt +++ b/test/lesson2/task1/Tests.kt @@ -87,5 +87,6 @@ class Tests { assertEquals(2, segmentLength(2, 5, 3, 9)) assertEquals(1, segmentLength(3, 6, 1, 4)) assertEquals(4, segmentLength(1, 15, 10, 14)) + } } \ No newline at end of file diff --git a/test/lesson2/task2/Tests.kt b/test/lesson2/task2/Tests.kt index 717dfa2c7..438bd647f 100644 --- a/test/lesson2/task2/Tests.kt +++ b/test/lesson2/task2/Tests.kt @@ -61,8 +61,8 @@ class Tests { @Tag("3") fun brickPasses() { assertTrue(brickPasses(2, 10, 5, 6, 3)) - assertTrue(brickPasses(4, 4, 4, 4, 4)) - assertFalse(brickPasses(6, 5, 4, 3, 6)) + assertTrue(brickPasses(1, 1, 2, 1, 1)) + assertFalse(brickPasses(2, 1, 2, 1, 1)) assertTrue(brickPasses(3, 2, 1, 1, 2)) } } \ No newline at end of file diff --git a/test/lesson6/task1/Tests.kt b/test/lesson6/task1/Tests.kt index c0af8c7e4..f8a97a19a 100644 --- a/test/lesson6/task1/Tests.kt +++ b/test/lesson6/task1/Tests.kt @@ -34,8 +34,8 @@ class Tests { @Test @Tag("4") fun dateStrToDigit() { - assertEquals("15.07.2016", dateStrToDigit("15 июля 2016")) - assertEquals("", dateStrToDigit("3 мартобря 1918")) + assertEquals("01.07.1", dateStrToDigit("01 июля 1")) + assertEquals("29.02.4", dateStrToDigit("29 февраля 4")) assertEquals("18.11.2018", dateStrToDigit("18 ноября 2018")) assertEquals("", dateStrToDigit("23")) assertEquals("03.04.2011", dateStrToDigit("3 апреля 2011"))