Go · 59 строк
Каждые 2 секунды Assign получает пачку новых заказов и назначает каждому ближайшего свободного курьера. Координаты курьеров приходят из приложений раз в 5 секунд через UpdatePosition, параллельно с Assign.
В Москве в час пик — 30 000 курьеров онлайн и до 2 000 заказов в пачке. Отметьте строки с ошибками.
В работе: Ядро диспетчеризации доставки: от него зависит, через сколько минут приедет еда.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
Источник: на задачах Яндекса: диспетчеризация курьеров Доставки. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
package dispatchimport ("math""sort""sync""time")type Courier struct {ID stringLat float64Lon float64Busy boolUpdated time.Time}type Order struct {ID stringLat float64Lon float64}type Dispatcher struct {mu sync.Mutexcouriers map[string]*Courier}func (d *Dispatcher) UpdatePosition(id string, lat, lon float64) {c := d.couriers[id]c.Lat, c.Lon, c.Updated = lat, lon, time.Now()}func dist(lat1, lon1, lat2, lon2 float64) float64 {dx := lat1 - lat2dy := lon1 - lon2return math.Sqrt(dx*dx + dy*dy)}// Assign подбирает каждому заказу ближайшего свободного курьера.func (d *Dispatcher) Assign(orders []Order) map[string]string {d.mu.Lock()defer d.mu.Unlock()result := map[string]string{}for _, o := range orders {var free []*Courierfor _, c := range d.couriers {if !c.Busy {free = append(free, c)}}sort.Slice(free, func(i, j int) bool {return dist(o.Lat, o.Lon, free[i].Lat, free[i].Lon) < dist(o.Lat, o.Lon, free[j].Lat, free[j].Lon)})best := free[0]result[o.ID] = best.ID}return result}