Как грамотно реализовывать каналы в Go?

Добрый вечер. Очень прошу помощи, несколько дней не могу реализовать программу, условие которой вот :
  • На американских горках есть N тележек, которые вмещают по P человек.
  • Люди приходят на аттракцион через случайный интервал времени и ждут в очереди. Если на станции есть свободная телега, она подается на посадку, когда в очереди набирается не менее Р человек. Люди садятся в порядке очереди. После посадки телега отправляется, а на ее место может стать другая телега.
  • Когда телега возвращается, из нее по очереди выходят люди, после чего она либо становится на посадку, либо ожидает в очереди других тележек. На выгрузке тоже может формироваться очередь из тележек.
  • На пути одновременно может быть несколько тележек, но они не могут обгонять друг друга.
  • Тележки едут по маршруту время Т.
  • N, P и Т задаются пользователем.


Буду очень благодарен за любую помощь, будь то советы или куски кода. Спасибо.
  • Вопрос задан
  • 3190 просмотров
Решения вопроса 1
Tyranron
@Tyranron
Как вариант: вот.
Постарался реализовать все условия задания. К сожалению, в задании ни слова о размере очереди. Я сделал её 2*N*P.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
type Тележка chan Человек
тележки := make(chan Тележка,N)
for i:=0;i<N; i++ {
тележки <- make(chan Человек,P)
}
//очередь так сказать с запасом, всё равно больше чем P*N человек на аттракцион не влезет
людиВходящие := make(chan Человек,P*N)
людиВыходящие := make(chan Тележка,P*N)
go func() {
//ждем телегу, рассовываем по ней людей
//не стоять же им в очереди, пусть сразу в телегу садятся, если место есть =)
свободнаяТелега := <-тележки
for len(свободнаяТелега)!=cap(свободнаяТелега) {
свободнаяТелега <- <- людиВходящие
}
time.Sleep(T) //WHEEEE
for довольныйЧеловек := range свободнаяТелега {
людиВыходящие <- довольныйЧеловек
}
тележки <- свободнаяТелега
}()

Довольно близко к тому, что просят в задании.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы