Обязанности

  • Разработка сервисов для 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
}

Результат

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

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

Задача

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

Результат

  1. Ссылка на 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, в первую очередь гороутин, каналов, контекстов. Оптимизации алгоритма поиска простых чисел можно не уделять серьезного внимания.

Результат

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