На главную

It Purple Conf

16-03-2024

В субботу 16 марта на конференции IT Purple Conf, которую проводила Физтех-школа прикладной математики и информатики при МФТИ им. Баумана, мы с Марией Куликовой провели игру для участников, которую назвали Командные битвы.

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

Исходя из этих соображений, я и придумывал задание.

Вот что у меня получилось.

Механика игры

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

Язык программирования может быть любым. Мы будем писать консольное приложение, которое читает из входного потока и печатает в выходной поток. На ноутбуке должна быть настроена среда разработки (IDE) для выбранного языка, чтобы не тратить драгоценное время на настройку.

В начале игры все команды делятся на два типа: красные и синие. Не обязательно, чтобы их было поровну, но стремиться к балансу всё-таки желательно. Все получают задания (см. ниже) и подключаются к Tg-чату, адрес которого выведен на проекторе. Tg-чат нужен для обмена результатами. В нём сидят организаторы и все команды.

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

Команды выполняют задание в режиме mob-programming, то есть всё обсуждают вместе, и при этом кто-то один пишет код. Человек, который пишет, может меняться. Чтобы все могли участвовать, важно, чтобы команды были не слишком большими. С другой стороны, в маленькой команде не удастся охватить все роли. Оптимально, если все команды состоят из 4-7 человек.

Можно начинать игру, когда своё задание завершает одна красная и одна синяя команда. Организаторы сбрасывают в чат ASCII-графику, красные отправляют её на вход своей программе, получают код, представляющий изображение и также копируют его в чат. Синие отправляют код на вход своей программе и копируют получившееся изображение в чат. Если всё сделано правильно, должна появиться такая же картинка, как и на входе.

Если в игре принимают участие несколько красных и синих команд, они играют попарно. Если возникают ошибки, команда может их исправить в пределах отведённого времени (30-40 минут).

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

Технические требования

До проведения:

Площадка:

Тайминг

Опыт подсказал, что 40 минут для решения задачи хватает впритык. Лучше заложить на всё мероприятие 1 час 20 минут и выделить на решение задачи 40-50 минут. В конце дайте больше времени, чтобы участники поделились открытиями и соображениями.

Ссылки

Задача для красных (кодирование)

Реализовать кодировщик ASCII-изображений.

Для кодирования используем вымышленный автомат, состоящий из экрана и пера, которое умеет выполнять команды. Команда перемещения пера состоит из буквы U, R, D или L, сразу за которой может следовать одна или больше цифр, например, U, R5, D12, L203 — команды перемещения. Команда U означает перемещение пера на одну клетку вверх, R — вправо, D — вниз и L — влево. Число показывает, сколько раз надо повторить команду, R5 означает перемещение пера на пять клеток вправо.

Команда печати состоит из буквы P, сразу за которой следует ровно один печатный ASCII-символ. Например, P1, P!, P@ — команды печати.

Экран — это прямоугольная область, состоящая из клеток, в каждой из которых может быть напечатан ASCII-символ. В начале работы программы все клетки экрана пустые (содержат пробел), а перо находится в левом верхнем углу. Программа должна по готовому изображению построить набор команд для автомата. Программа получает на вход ASCII-изображение, содержащие печатные ASCII-символы. Каждая строка изображения соответствует одной входной строке. Правый край не обязательно будет ровным, то есть ширина строк может различаться. Некоторые строки могут быть пустыми.

Пример входа программы:


   ***
   * *
   ***

В примере на экране нарисован квадрат размером 3✕3. На вход подаются пять строк, первая и пятая пустые.

Программа должна определить размеры экрана (в данном случае высота и ширина равны 5✕6), и закодировать изображение с помощью команд. Программа-кодировщик печатает в отдельных строках высоту и ширину экрана, и затем — в третьей строке — код. Код состоит из команд, которые записаны друг за другом без разделителей.

Пример вывода программы:

5
6
DR3P*RP*RP*DP*DP*LP*LP*UP*

Задача для синих (декодирование)

Реализовать декодировщик ASCII-изображений.

Для декодирования используем вымышленный автомат, состоящий из экрана и пера, которое умеет выполнять команды. Команда перемещения пера состоит из буквы U, R, D или L, сразу за которой может следовать одна или больше цифр, например, U, R5, D12, L203 — команды перемещения. Команда U означает перемещение пера на одну клетку вверх, R — вправо, D — вниз и L — влево. Число показывает, сколько раз надо повторить команду, R5 означает перемещение пера на пять клеток вправо.

Команда печати состоит из буквы P, сразу за которой следует ровно один печатный ASCII-символ. Например, P1, P!, P@ — команды печати.

Экран — это прямоугольная область, состоящая из клеток, в каждой из которых может быть напечатан ASCII-символ. В начале работы программы все клетки экрана пустые (содержат пробел), а перо находится в левом верхнем углу. Программа должна по набору команд построить изображение. Программа получает на вход три строки. В первой строке находится высота экрана, во второй ширина, а в третьей — код. Код состоит из команд, которые записаны друг за другом без разделителей.

Пример входа программы:

5
6
DR3P*RP*RP*DP*DP*LP*LP*UP*

Программа должна нарисовать изображение и напечатать его. В данном случае должно получиться 5 строк. Пробелы справа в правой части строки можно обрезать.

Пример вывода программы:


   ***
   * *
   ***

Примеры

Логотип конференции

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@%%#***####%%%%%@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@#=:::::::--------===========+++++*@@@@
@@@@@@@@@#:...:::-=#@@@@@@@@@@@@@@@@%%%%####+*@@@@
@@@@@@@#-:.::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@+*@@@@
@@@@@@=...:::=@@@@@@@%%%%%%%%%%%%%%%%@@@@@@@+*@@@@
@@@@@- ..:::+@@@@@#----=============+++++++++*@@@@
@@@@+...::-=@@@@%:---=+#%%%%%%%%%%%%%%%%%%%%#%@@@@
@@@%: .:---%@@@%---=#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@*...:--+@@@@+-==#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@+...---*@@@@:===%@@@@-====++++++++++++++++*@@@@
@@@+...---#@@@@:===%@@@@===+++++++++*********#@@@@
@@@#...-==*@@@@+===#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@%-.:-==+@@@@%===+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@*:::===#@@@@%====+*%%%###*****************@@@@
@@@@@*======#@@@@@#+==++++++++++++++++++****+*@@@@
@@@@@@#=-====*@@@@@@@@%%%%%@@@@@@@@@@@@@@@@@**@@@@
@@@@@@@@+-=====#@@@@@@@@@@@@@@@@@@@@@@@@@@@@**@@@@
@@@@@@@@@@*-==+++*#@@@@@@@@@@@%%#####*******+*@@@@
@@@@@@@@@@@@@%*++++++++++++++++++++++********#@@@@
@@@@@@@@@@@@@@@@@%%#####%%%@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Альберт Эйнштейн

Автор картинки — Joan Stark (jgs).

      -''--.
       _`>   `\.-'<
    _.'     _     '._
  .'   _.='   '=._   '.
  >_   / /_\ /_\ \   _<
    / (  \o/\\o/  ) \
    >._\ .-,_)-. /_.<
jgs     /__/ \__\ 
          '---'     E=mc^2

Решение

Чтобы убедиться, что задачи можно решить быстро, решил обе задачи на языке F#.