Контест Senior Паттерны конкурентности обновлено

MapReduce подсчёта слов на горутинах и каналах

Условие

Реализуйте MapReduce: M горутин-мапперов делят между собой строки ввода (строка i достаётся мапперу i mod M) и для каждого слова отправляют пару в канал редьюсера с номером fnv1a32(слово) mod R (hash/fnv.New32a по байтам UTF-8). R горутин-редьюсеров считают частоты своих слов. Каналы редьюсеров закрываются, когда все мапперы закончили.

Ввод: M R (1 ≤ M, R ≤ 16), n (1 ≤ n ≤ 500), затем n строк (могут быть пустыми), слова разделены пробелами.

Вывод: для каждого редьюсера по порядку строку reducer r: K words, T total, где K число различных слов, T сумма частот; затем все слова по возрастанию (побайтово) в формате слово частота.

Решение должно быть конкурентным (горутины), а вывод не должен зависеть от порядка их выполнения.

Пример

2 2
3
go chan go
select go
chan
reducer 0: 0 words, 0 total
reducer 1: 3 words, 6 total
chan 2
go 3
select 1

Как подойти

M мапперов → R каналов по fnv-хешу → R редьюсеров со своими мапами; закрытие каналов после ожидания мапперов.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.