Задача:

В художественной академии проходит конкурс, в котором ученики проверяют свое умение правильно определять цвета. Илья Владимирович, преподаватель-организатор, подошел к конкурсу креативно и решил, что показывать цвета нужно на КиберМишке. И чтобы было проще менять цвет, не меняя программу на мишке, преподаватель создал «Цветной пульт». Заданный на нём цвет передаётся в КиберМишку по инфракрасному каналу в формате RGBK.

К сожалению, протестировать изобретение у Ильи Владимировича времени не хватило, и оказалось, что байт, обозначающий черный цвет, внезапно вместо инфракрасного передается по акустическому каналу, так ещё и в случайный момент времени. После недолгих размышлений решено, что мишку поправить будет быстрее, чем пульт.

Создайте диаграмму для КиберМишки, которая работает по новому протоколу, а именно получает четыре байта, обозначающие цвет, и зажигает оба глаза именно этим цветом.

Байт R (красный), G (зеленый), B (синий), приходят последовательно по инфракрасному каналу, а байт K (черный) может прийти в любой момент времени (то есть, может быть передан до, после и даже между других байтов) по акустическому каналу.

Ответ:

Ключевые моменты решения:

  • Использование иерархии для обработки сигналов сразу с "ушей" и "носа"
  • Подсчет пришедших байтов

Иерархия работает следующим образом, мы ждем последовательно красный, зеленый, синий. И где-то между ними может втиснуться черный, то есть прийти, например, "красный, черный, зеленый, синий". Важно то, что черный приходит по "ушам", из-за чего мы можем просто вынести его обработку в родительское состояние.

Так как перед тем, как показать цвет, нам должно прийти четыре байта, мы завели для этого отдельный счетчик, который увеличиваем, когда нам приходит байт. А проверять этот счетчик мы будем в двух случаях, когда нам приходит черный (чтобы обработать случай, когда он приходит в конце), и когда приходит синий (потому что если черный приходит не последним, то синий - всегда последний). Проверку мы вызываем с помощью своего события.

Для каждого цвета мы завели свой счетчик, чтобы передавать их значения в качестве цвета в глаза.

В авторском решении после того, как был показан цвет на глазах, программа ожидает новый цвет, но это не обязательно для решения задачи, при тестировании решения отправляется только один цвет.

Last modified: Monday, 15 December 2025, 2:36 PM