Skip to content
This repository was archived by the owner on Sep 6, 2018. It is now read-only.
58 changes: 50 additions & 8 deletions src/lesson1/task1/Simple.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ fun main(args: Array<String>) {
* Пользователь задает время в часах, минутах и секундах, например, 8:20:35.
* Рассчитать время в секундах, прошедшее с начала суток (30035 в данном случае).
*/
fun seconds(hours: Int, minutes: Int, seconds: Int): Int = TODO()
fun minutesToSeconds(minutes: Int): Int = minutes*60
fun hoursToMinutes(hours: Int): Int = hours*60
fun seconds(hours: Int, minutes: Int, seconds: Int): Int {
return minutesToSeconds(hoursToMinutes(hours))+ minutesToSeconds(minutes)+seconds
}

/**
* Тривиальная
Expand All @@ -60,31 +64,49 @@ fun seconds(hours: Int, minutes: Int, seconds: Int): Int = TODO()
* Определить длину того же отрезка в метрах (в данном случае 18.98).
* 1 сажень = 3 аршина = 48 вершков, 1 вершок = 4.445 см.
*/
fun lengthInMeters(sagenes: Int, arshins: Int, vershoks: Int): Double = TODO()
fun sagenesToArshins(sagenes: Int): Int = sagenes*3
fun arshinsToVershoks(arshins: Int): Int = arshins*16
fun vershoksToMeters(vershoks: Int): Double = vershoks*0.04445
fun lengthInMeters(sagenes: Int, arshins: Int, vershoks: Int): Double {
return vershoksToMeters(arshinsToVershoks(sagenesToArshins(sagenes)+arshins)+vershoks)
}

/**
* Тривиальная
*
* Пользователь задает угол в градусах, минутах и секундах (например, 36 градусов 14 минут 35 секунд).
* Вывести значение того же угла в радианах (например, 0.63256).
*/
fun angleInRadian(grad: Int, min: Int, sec: Int): Double = TODO()
fun angleInRadian(grad: Int, min: Int, sec: Int): Double {
return (grad*60*60+min*60+sec)*(PI/(180*60*60))
}

/**
* Тривиальная
*
* Найти длину отрезка, соединяющего точки на плоскости с координатами (x1, y1) и (x2, y2).
* Например, расстояние между (3, 0) и (0, 4) равно 5
*/
fun trackLength(x1: Double, y1: Double, x2: Double, y2: Double): Double = TODO()
fun trackLength(x1: Double, y1: Double, x2: Double, y2: Double): Double {
return sqrt(pow(x2-x1,2.0)+pow(y2-y1,2.0))
}

/**
* Простая
*
* Пользователь задает целое число, большее 100 (например, 3801).
* Определить третью цифру справа в этом числе (в данном случае 8).
*/
fun thirdDigit(number: Int): Int = TODO()
fun thirdDigit(number: Int): Int = takeDigit(number, 3)

fun takeDigit(number: Int, digit: Int = 1): Int {
if (digit < 1) return -1
else if (digit == 1) return number % 10
else {
val shift: Int = pow(10.0, (digit - 1).toDouble()).toInt()
return if (number >= shift) (number / shift) % 10 else 0
}
}

/**
* Простая
Expand All @@ -93,7 +115,9 @@ 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 {
return (hoursToMinutes(hoursArrive)+minutesArrive)-(hoursToMinutes(hoursDepart)+minutesDepart)
}

/**
* Простая
Expand All @@ -102,12 +126,30 @@ fun travelMinutes(hoursDepart: Int, minutesDepart: Int, hoursArrive: Int, minute
* Сколько денег будет на счету через 3 года (с учётом сложных процентов)?
* Например, 100 рублей под 10% годовых превратятся в 133.1 рубля
*/
fun accountInThreeYears(initial: Int, percent: Int): Double = TODO()
fun accountInThreeYears(initial: Int, percent: Int): Double {
var result: Double = initial.toDouble()
for(i in 1..3)
{
result*=(1+(percent.toDouble()/100))
}
return result
}

/**
* Простая
*
* Пользователь задает целое трехзначное число (например, 478).
*Необходимо вывести число, полученное из заданного перестановкой цифр в обратном порядке (например, 874).
*/
fun numberRevert(number: Int): Int = TODO()
fun numberRevert(number: Int): Int {
var result: Int = 0
if (number in -9..9) result = number
else {
var mutableNumber: Int = number
do {
result = result * 10 + mutableNumber % 10
mutableNumber /= 10
} while (mutableNumber != 0)
}
return result
}
85 changes: 74 additions & 11 deletions src/lesson2/task1/IfElse.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package lesson2.task1

import lesson1.task1.discriminant
import java.lang.Math.*

/**
* Пример
Expand All @@ -14,17 +15,17 @@ fun minBiRoot(a: Double, b: Double, c: Double): Double {
if (b == 0.0) return Double.NaN // ... и ничего больше не делать
val bc = -c / b
if (bc < 0.0) return Double.NaN // ... и ничего больше не делать
return -Math.sqrt(bc)
return -sqrt(bc)
// Дальше функция при a == 0.0 не идёт
}
val d = discriminant(a, b, c) // 2
if (d < 0.0) return Double.NaN // 3
// 4
val y1 = (-b + Math.sqrt(d)) / (2 * a)
val y2 = (-b - Math.sqrt(d)) / (2 * a)
val y3 = Math.max(y1, y2) // 5
val y1 = (-b + sqrt(d)) / (2 * a)
val y2 = (-b - sqrt(d)) / (2 * a)
val y3 = max(y1, y2) // 5
if (y3 < 0.0) return Double.NaN // 6
return -Math.sqrt(y3) // 7
return -sqrt(y3) // 7
}

/**
Expand All @@ -33,7 +34,15 @@ 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 {
return "$age " + when {
(age % 100 in 11..19) || (age % 10 == 0) || (age % 10 in 5..9) -> "лет"
age % 10 == 1 -> "год"
age % 10 in 2..4 -> "года"
else -> "incorrect data"
}
}


/**
* Простая
Expand All @@ -44,7 +53,12 @@ fun ageDescription(age: Int): String = TODO()
*/
fun timeForHalfWay(t1: Double, v1: Double,
t2: Double, v2: Double,
t3: Double, v3: Double): Double = TODO()
t3: Double, v3: Double): Double {
val s: Double = v1 * t1 + v2 * t2 + v3 * t3
if (v1 * t1 >= s / 2) return (s / 2) / (v1)
else if (v2 * t2 >= (s / 2) - v1 * t1) return ((s / 2) - v1 * t1) / v2 + t1
else return ((s / 2) - v1 * t1 - v2 * t2) / v3 + t1 + t2
}

/**
* Простая
Expand All @@ -54,9 +68,27 @@ fun timeForHalfWay(t1: Double, v1: Double,
* Вернуть 0, если угрозы нет, 1, если угроза только от первой ладьи, 2, если только от второй ладьи,
* и 3, если угроза от обеих ладей.
*/
fun rookIsAttack(rookX: Int, rookY: Int,
figureX: Int, figureY: Int): Boolean {
return (rookX == figureX) || (rookY == figureY)
}

fun whichRookThreatens(kingX: Int, kingY: Int,
rookX1: Int, rookY1: Int,
rookX2: Int, rookY2: Int): Int = TODO()
rookX2: Int, rookY2: Int): Int {
return when {
(!rookIsAttack(rookX1, rookY1, kingX, kingY)) &&
(!rookIsAttack(rookX2, rookY2, kingX, kingY)) -> 0
(rookIsAttack(rookX1, rookY1, kingX, kingY)) &&
(!rookIsAttack(rookX2, rookY2, kingX, kingY)) -> 1
(!rookIsAttack(rookX1, rookY1, kingX, kingY)) &&
(rookIsAttack(rookX2, rookY2, kingX, kingY)) -> 2
(rookIsAttack(rookX1, rookY1, kingX, kingY)) &&
(rookIsAttack(rookX2, rookY2, kingX, kingY)) -> 3
else -> -1
}

}

/**
* Простая
Expand All @@ -67,9 +99,22 @@ fun whichRookThreatens(kingX: Int, kingY: Int,
* Вернуть 0, если угрозы нет, 1, если угроза только от ладьи, 2, если только от слона,
* и 3, если угроза есть и от ладьи и от слона.
*/
fun bishopIsAttack(bishopX: Int, bishopY: Int,
figureX: Int, figureY: Int): Boolean {
return abs(figureX - bishopX) == abs(figureY - bishopY)
}

fun rookOrBishopThreatens(kingX: Int, kingY: Int,
rookX: Int, rookY: Int,
bishopX: Int, bishopY: Int): Int = TODO()
bishopX: Int, bishopY: Int): Int {
return if ((!rookIsAttack(rookX, rookY, kingX, kingY)) &&
(!bishopIsAttack(bishopX, bishopY, kingX, kingY))) 0
else if ((rookIsAttack(rookX, rookY, kingX, kingY)) &&
(!bishopIsAttack(bishopX, bishopY, kingX, kingY))) 1
else if ((!rookIsAttack(rookX, rookY, kingX, kingY)) &&
(bishopIsAttack(bishopX, bishopY, kingX, kingY))) 2
else 3
}

/**
* Простая
Expand All @@ -79,7 +124,15 @@ fun rookOrBishopThreatens(kingX: Int, kingY: Int,
* прямоугольным (вернуть 1) или тупоугольным (вернуть 2).
* Если такой треугольник не существует, вернуть -1.
*/
fun triangleKind(a: Double, b: Double, c: Double): Int = TODO()
fun triangleKind(a: Double, b: Double, c: Double): Int {
return when {
((a + b <= c) || (a + c <= b) || (b + c <= a)) -> -1
((a * a + b * b < c * c) || (a * a + c * c < b * b) || (b * b + c * c < a * a)) -> 2
((a * a + b * b == c * c) || (a * a + c * c == b * b) || (b * b + c * c == a * a)) -> 1
((a * a + b * b > c * c) || (a * a + c * c > b * b) || (b * b + c * c > a * a)) -> 0
else -> -1
}
}

/**
* Средняя
Expand All @@ -89,4 +142,14 @@ 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 {
val AB: Int = abs(a - b)
val AC: Int = abs(a - c)
val AD: Int = abs(a - d)
val BC: Int = abs(b - c)
val BD: Int = abs(b - d)
val CD: Int = abs(c - d)
val maxSegment: Int = max(max(max(AB, AC), max(AD, BC)), max(BD, CD))
val intersection = (AB + CD) - maxSegment
return if (intersection >= 0) intersection else -1
}
28 changes: 23 additions & 5 deletions src/lesson2/task2/Logical.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
package lesson2.task2

import lesson1.task1.sqr

import lesson1.task1.numberRevert
import lesson1.task1.trackLength
import lesson1.task1.takeDigit
import java.lang.Math.*
/**
* Пример
*
Expand All @@ -17,15 +20,25 @@ fun pointInsideCircle(x: Double, y: Double, x0: Double, y0: Double, r: Double) =
* Четырехзначное число назовем счастливым, если сумма первых двух ее цифр равна сумме двух последних.
* Определить, счастливое ли заданное число, вернуть true, если это так.
*/
fun isNumberHappy(number: Int): Boolean = TODO()
fun isNumberHappy(number: Int): Boolean {
val temp: Int = takeDigit(number,3) * 100 + takeDigit(number)
return ((number - temp) / 10 + temp) % 101 == 0
}

/**
* Простая
*
* На шахматной доске стоят два ферзя (ферзь бьет по вертикали, горизонтали и диагоналям).
* Определить, угрожают ли они друг другу. Вернуть true, если угрожают.
*/
fun queenThreatens(x1: Int, y1: Int, x2: Int, y2: Int): Boolean = TODO()
fun queenThreatens(x1: Int, y1: Int, x2: Int, y2: Int): Boolean {
return when {
x1 == x2 -> true
y1 == y2 -> true
abs(x2 - x1) == abs(y2 - y1) -> true
else -> false
}
}

/**
* Средняя
Expand All @@ -35,7 +48,9 @@ fun queenThreatens(x1: Int, y1: Int, x2: Int, y2: Int): Boolean = TODO()
* Вернуть true, если утверждение верно
*/
fun circleInside(x1: Double, y1: Double, r1: Double,
x2: Double, y2: Double, r2: Double): Boolean = TODO()
x2: Double, y2: Double, r2: Double): Boolean {
return r2 >= r1 + trackLength(x1, y1, x2, y2)
}

/**
* Средняя
Expand All @@ -46,4 +61,7 @@ fun circleInside(x1: Double, y1: Double, r1: Double,
* кирпич 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 {
return min(min(a, b), min(max(a, b), c)) <= min(r, s) &&
max(min(a, b), min(max(a, b), c)) <= max(r, s)
}
Loading