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. Зелёные
///////////////////////////////конец файла//////////////////////////////////////////////////////////////////////////////
*
*
* Соответствующий выходной файл:
///////////////////////////////начало файла/////////////////////////////////////////////////////////////////////////////
-
-
-
- -
- Утка по-пекински
-
-
- -
- Салат Оливье
-
- - Мясо
-
-
- - Майонез
- - Картофель
- - Что-то там ещё
-
-
- - Помидоры
- - Фрукты
-
- - Бананы
- - Яблоки
-
- - Красные
- - Зелёные
-
-
-
-
-
-
-
+
+
+
+-
+Утка по-пекински
+
+
+-
+Салат Оливье
+
+- Мясо
+
+
+- Майонез
+- Картофель
+- Что-то там ещё
+
+
+- Помидоры
+- Фрукты
+
+- Бананы
+- Яблоки
+
+- Красные
+- Зелёные
+
+
+
+
+
+
+
///////////////////////////////конец файла//////////////////////////////////////////////////////////////////////////////
* (Отступы и переносы строк в примере добавлены для наглядности, при решении задачи их реализовывать не обязательно)
@@ -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"))