Обязанности

  • Разработка мобильных Android приложений на Kotlin.

Требования

  • Базовые знания Kotlin. Желательно знание Java.
  • Готовность к изучению множества технологий разработки одновременно в свое личное время.
  • Приветствуется владение чем-нибудь из перечисленного: JavaScript (также любые фреймворки), HTML, CSS (также lesscss, sass), Linux CLI, Docker, git, Vagrant, Idea, VS Code (или другие IDE/редакторы).
  • Приветствуется базовая грамотность в Computer Science, включая базы данных, сетевые технологии, технологические стеки построения веб-приложений, устройства операционных систем (в первую очередь семейства Linux). Ориентиры: https://yollection.ru/road/backend, https://yollection.ru/road/frontend.
  • Режим работы удаленный с регулярными митингами онлайн, необходимо иметь возможность участия в онлайн-конференциях со звуком и видео.

Задание 1. Разработать функцию определения счета в игре

Задача

В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча.
Разработайте функцию getScore(gameStamps, offset), которая вернет счет на момент offset в списке gameStamps.
Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности.

// Game.kt
import kotlin.math.floor
import kotlin.random.Random

const val TIMESTAMPS_COUNT = 50000
const val PROBABILITY_SCORE_CHANGED = 0.0001
const val PROBABILITY_HOME_SCORE = 0.45
const val OFFSET_MAX_STEP = 3

data class Score(val home: Int, val away: Int)
data class Stamp(val offset: Int, val score: Score)

fun generateGame(): Array<Stamp> {
val stamps = Array<Stamp>(TIMESTAMPS_COUNT) { _ -> Stamp(0, Score(0, 0)) }
var currentStamp = stamps[0]
for (i in 1 until TIMESTAMPS_COUNT) {
currentStamp = generateStamp(currentStamp)
stamps[i] = currentStamp
}
return stamps
}

fun generateStamp(previousValue: Stamp): Stamp {
val scoreChanged = Random.nextFloat() > 1 - PROBABILITY_SCORE_CHANGED
val homeScoreChange = if (scoreChanged && Random.nextFloat() > 1 - PROBABILITY_HOME_SCORE) 1 else 0
val awayScoreChange = if (scoreChanged && homeScoreChange == 0) 1 else 0
val offsetChange = (floor(Random.nextFloat() * OFFSET_MAX_STEP) + 1).toInt()

return Stamp(
previousValue.offset + offsetChange,
Score(
previousValue.score.home + homeScoreChange,
previousValue.score.away + awayScoreChange
)
)
}

fun getScore(gameStamps: Array<Stamp>, offset: Int): Score {
// continue the function's implementation
}


// Main.kt
fun main() {
val gameStamps = generateGame()
for (stamp in gameStamps) {
println("${stamp.offset}: ${stamp.score.home} - ${stamp.score.away}")
}
}

Результат

  1. Ссылка на gist с исходным кодом функции.

Задание 2. Разработать тесты для функции определения счета в игре

Задача

Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на фреймворке JUnit 5.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.

Результат

  1. Ссылка на gist с исходным кодом тестов.

Задание 3. Разработать приложение определения контура лица

Задача

Разработать мобильное приложение Android, которое будет захватывать видеопоток с камеры смартфона, определять лица на нем, и отрисовывать контуры обнаруженных лиц.

Можно использовать Google ML Kit.

У нас внутри разошлись мнения о сложности этого задания, поэтому если считаете себя способным сделать больше, попробуйте вместо отрисовки контура лица отобразить в нужных позициях лица какие-то детали, например очки или усы.

Результат

  1. Ссылка на APK файл с собранным приложением.
  2. Ссылка на github-репозиторий с публичным доступом с исходными кодами решения.