Разработчик Kotlin (Android)
Чтобы принять участие в стажировке вам нужно заполнить анкету откликнувшись по ссылке https://forms.gle/CuPKWFMpL6jh23P77
Последняя часть вопросов в анкете отведена для ответов на задачи, которые описаны ниже на этой странице. Чаще всего в поле ответа нужно указать ссылку на gist с текстом ответа, либо ссылку на репозиторий, обращайте внимание на то, что нужно оставить в анкете в качестве результата. Если вместо требуемой ссылки вы приведете что-то другое, например текст ответа, ваш ответ с высокой вероятностью не будет засчитан.
Обязанности
- Разработка мобильных 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}")
}
}
Результат
- Ссылка на gist с исходным кодом функции.
Задание 2. Разработать тесты для функции определения счета в игре
Задача
Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на фреймворке JUnit 5.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.
Результат
- Ссылка на gist с исходным кодом тестов.
Задание 3. Разработать приложение определения контура лица
Задача
Разработать мобильное приложение Android, которое будет захватывать видеопоток с камеры смартфона, определять лица на нем, и отрисовывать контуры обнаруженных лиц.
Можно использовать Google ML Kit.
У нас внутри разошлись мнения о сложности этого задания, поэтому если считаете себя способным сделать больше, попробуйте вместо отрисовки контура лица отобразить в нужных позициях лица какие-то детали, например очки или усы.
Результат
- Ссылка на APK файл с собранным приложением.
- Ссылка на github-репозиторий с публичным доступом с исходными кодами решения.