Разработчик Go
Чтобы принять участие в стажировке вам нужно заполнить анкету откликнувшись по ссылке https://forms.gle/7KztcG8Sczc7Qfvr7
Последняя часть вопросов в анкете отведена для ответов на задачи, которые описаны ниже на этой странице. Чаще всего в поле ответа нужно указать ссылку на gist с текстом ответа, либо ссылку на репозиторий, обращайте внимание на то, что нужно оставить в анкете в качестве результата. Если вместо требуемой ссылки вы приведете что-то другое, например текст ответа, ваш ответ с высокой вероятностью не будет засчитан.
Обязанности
- Разработка сервисов для web-приложений на Go (Go, PostgreSQL).
- Разработка Telegram-ботов (Go, telebot).
Требования
- Знания Go: базовый синтаксис, понимание гороутин, каналов, контекстов.
- Готовность к изучению множества технологий разработки одновременно в свое личное время.
- Приветствуется владение чем-нибудь из перечисленного: JavaScript (также любые фреймворки), HTML, CSS (также lesscss, sass), Linux CLI, Docker, git, Goland, VS Code (или другие IDE/редакторы).
- Приветствуется базовая грамотность в Computer Science, включая базы данных, сетевые технологии, технологические стеки построения веб-приложений, устройства операционных систем (в первую очередь семейства Linux). Ориентиры: https://yollection.ru/road/backend, https://yollection.ru/road/frontend.
Задание 1. Разработать функцию определения счета в игре
Задача
В примере кода ниже генерируется список фиксаций состояния счета игры в течение матча.
Разработайте функцию getScore(gameStamps, offset), которая вернет счет на момент offset в списке gameStamps.
Нужно суметь понять суть написанного кода, заметить нюансы, разработать функцию вписывающуюся стилем в существующий код, желательно адекватной алгоритмической сложности.
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
const TIMESTAMPS_COUNT = 50000
const PROBABILITY_SCORE_CHANGED = 0.0001
const PROBABILITY_HOME_SCORE = 0.45
const OFFSET_MAX_STEP = 3
type Score struct {
Home int
Away int
}
type ScoreStamp struct {
Offset int
Score Score
}
func main() {
var stamps = fillScores()
for _, stamp := range *stamps {
fmt.Printf("%v: %v -- %v\n", stamp.Offset, stamp.Score.Home, stamp.Score.Away)
}
}
func generateStamp(previousValue ScoreStamp) ScoreStamp {
random := rand.New(rand.NewSource(time.Now().UnixNano()))
scoreChanged := random.Float32() > 1-PROBABILITY_SCORE_CHANGED
homeScoreChange := 0
if scoreChanged && random.Float32() > 1-PROBABILITY_HOME_SCORE {
homeScoreChange = 1
}
awayScoreChange := 0
if scoreChanged && homeScoreChange == 0 {
awayScoreChange = 1
}
offsetChange := int(math.Floor(random.Float64()*OFFSET_MAX_STEP)) + 1
return ScoreStamp{
Offset: previousValue.Offset + offsetChange,
Score: Score{
Home: previousValue.Score.Home + homeScoreChange,
Away: previousValue.Score.Away + awayScoreChange,
},
}
}
func fillScores() *[]ScoreStamp {
scores := make([]ScoreStamp, TIMESTAMPS_COUNT)
prevScore := ScoreStamp{
Offset: 0,
Score: Score{Home: 0, Away: 0},
}
scores[0] = prevScore
for i := 1; i < TIMESTAMPS_COUNT; i++ {
scores[i] = generateStamp(prevScore)
prevScore = scores[i]
}
return &scores
}
/*
Takes list of game's stamps and time offset for which returns the scores for the home and away teams.
Please pay attention to that for some offsets the game_stamps list may not contain scores.
*/
func getScore(gameStamps []ScoreStamp, offset int) Score {
// continue the function's implementation
}
Результат
- Ссылка на gist с исходным кодом функции.
Задание 2. Разработать тесты для функции определения счета в игре
Задача
Для разработанной в предыдущем задании функции getScore(gameStamps, offset) разработайте unit-тесты на базе стандартной библиотеки testing.
Тесты должны учитывать все возможные случаи использования функции, концентрироваться на проверке одного случая, не повторяться, название тестов должно отражать суть выполняемой проверки.
Результат
- Ссылка на gist с исходным кодом тестов.
Задание 3. Разработать консольное приложение для поиска простых чисел в заданных диапазонах
Задача
Требуется разработать консольную утилиту, которая принимает несколько диапазонов чисел, имя файла для вывода, таймаут ограничивающий исполнение команды по времени. Утилита находит в заданных диапазонах все простые числа и выводит их в файл.
Например для диапазона 11:20 простые числа это 11, 13, 17, 19
Пример команды:
find_primes --file testfile.txt --timeout 10 --range 1:10 --range 200000:3000000 --range 400:500
- file имя файла для вывода найденных простых чисел
- timeout значение в секундах, по истечении которого программа должна прекратить свое исполнение
- range диапазон чисел, в пределах которого программа должна найти простые числа
Замечания к реализации
Результатом должен быть текст программы на Go в одном файле main.go, для простоты проверки.
При разработке предусмотреть, чтобы каждый диапазон обрабатывался в отдельной гороутине, вывод в файл тоже производился в отдельной гороутине. Общение между гороутинами предусмотреть каналом/каналами. Для прерывания по таймауту использовать контексты, что вам будет удобнее: select или ctx.Err() или все сразу.
Задача на правильное использование инструментов Go, в первую очередь гороутин, каналов, контекстов. Оптимизации алгоритма поиска простых чисел можно не уделять серьезного внимания.
Результат
- Ссылка на gist с исходным кодом утилиты.