В данном задании вам необходимо реализовать следующий интерфейс:
var (
// ErrFactorizationCancelled is returned when the factorization process is cancelled.
ErrFactorizationCancelled = errors.New("cancelled")
// ErrWriterInteraction is returned if an error occurs while interacting with the writer
// triggering early termination.
ErrWriterInteraction = errors.New("writer interaction")
)
// Factorizer interface represents a concurrent prime factorization task with configurable workers.
// Thread safety and error handling are implemented as follows:
// - The provided writer must be thread-safe to handle concurrent writes from multiple workers.
// - Output uses '\n' for newlines.
// - Factorization has a time complexity of O(sqrt(n)) per number.
// - If an error occurs while writing to the writer, early termination is triggered across all workers.
type Factorizer interface {
// Factorize performs factorization on a list of integers, writing the results to an io.Writer.
// - numbers: the list of integers to factorize.
// - writer: the io.Writer where factorization results are output.
// Returns an error if the process is cancelled or if a writer error occurs.
Factorize(ctx context.Context, numbers []int, writer io.Writer) error
}
type factorizerImpl struct {}
func New(opts ...FactorizeOption) (*factorizerImpl, error) {
// ...
}
type FactorizeOption func(*factorizerImpl)
// WithFactorizationWorkers
// Defines the configuration for factorization workers.
func WithFactorizationWorkers(workers int) FactorizeOption {
// ...
}
// WithWriteWorkers
// Defines the configuration for write workers.
func WithWriteWorkers(workers int) FactorizeOption {
// ...
}Количество воркеров передаётся в конструкторе с помощью паттерна functional options. При этом отдельно задаётся
количество воркеров как для факторизации WithFactorizationWorkers, так и для записи WithWriteWorkers.
В рамках задания рекомендуется использовать этот алгоритм факторизации.
[100, -17, 25, 38], 3
100 = 2 * 2 * 5 * 5
-17 = -1 * 17
38 = 2 * 19
25 = 5 * 5
- Решение необходимо реализовать в файле fact.go
- Открыть pull request из ветки
hwв веткуmainвашего репозитория - В описании PR заполнить количество часов, которые вы потратили на это задание
- Отправить заявку на ревью в соответствующей форме
- Изменять файлы в директории .github запрещено
- Время для дедлайна фиксируется отправкой формы
- Запрещено отправлять форму до того, как CI успешно завершится
- Множители записываются от меньшего к большему
- Если число меньше нуля, добавляется множитель -1
- Используйте тесты, чтобы заполнить недосказанности
- Обратите внимание на пакеты, которые разрешено использовать
- В этом задании ожидается решение с использованием каналов
- В учебных целях запрещено использовать буферизированные каналы
- В учебных целях запрещено использовать мьютексы
Для запуска скриптов на курсе необходимо установить go-task
go install github.com/go-task/task/v3/cmd/task@latest
Перед выполнением задания не забудьте выполнить:
task updateЗапустить линтер:
task lintЗапустить тесты:
task testОбновить файлы задания
task updateПринудительно обновить файлы задания
task force-updateСкрипты работают на Windows, однако при разработке на этой операционной системе рекомендуется использовать WSL