It Purple Conf
16-03-2024
В субботу 16 марта на конференции IT Purple Conf, которую проводила Физтех-школа прикладной математики и информатики при МФТИ им. Баумана, мы с Марией Куликовой провели игру для участников, которую назвали Командные битвы.
Обычно на соревнованиях программисты воюют друг против друга, чего в реальной жизни не бывает. В реальной жизни мы работаем в командах, и сами команды совместно решают большие задачи.
Исходя из этих соображений, я и придумывал задание.
Вот что у меня получилось.
Механика игры
Участники разбиваются на команды (не меньше двух). Каждая команда выбирает язык программирования, на котором будет писать программу. У каждой команды есть ноутбук, подключенный к интернету.
Язык программирования может быть любым. Мы будем писать консольное приложение, которое читает из входного потока и печатает в выходной поток. На ноутбуке должна быть настроена среда разработки (IDE) для выбранного языка, чтобы не тратить драгоценное время на настройку.
В начале игры все команды делятся на два типа: красные и синие. Не обязательно, чтобы их было поровну, но стремиться к балансу всё-таки желательно. Все получают задания (см. ниже) и подключаются к Tg-чату, адрес которого выведен на проекторе. Tg-чат нужен для обмена результатами. В нём сидят организаторы и все команды.
Важно отметить, что красные и синие не соревнуются друг с другом, а решают две части одной задачи. Только если и те, и другие всё сделают правильно, задача будет решена.
Команды выполняют задание в режиме mob-programming, то есть всё обсуждают вместе, и при этом кто-то один пишет код. Человек, который пишет, может меняться. Чтобы все могли участвовать, важно, чтобы команды были не слишком большими. С другой стороны, в маленькой команде не удастся охватить все роли. Оптимально, если все команды состоят из 4-7 человек.
Можно начинать игру, когда своё задание завершает одна красная и одна синяя команда. Организаторы сбрасывают в чат ASCII-графику, красные отправляют её на вход своей программе, получают код, представляющий изображение и также копируют его в чат. Синие отправляют код на вход своей программе и копируют получившееся изображение в чат. Если всё сделано правильно, должна появиться такая же картинка, как и на входе.
Если в игре принимают участие несколько красных и синих команд, они играют попарно. Если возникают ошибки, команда может их исправить в пределах отведённого времени (30-40 минут).
После игры даём возможность участникам поделиться впечатлениями и просим выбрать 1 или 2 человек из каждой команды, кого хотелось бы отметить. Просим рассказать, как именно они помогали команде. В финале награждаем выбранные людей призами.
Технические требования
До проведения:
- Создать tg-чат
- Подготовить слайд с qr-кодом чата для вывода на экран
- Подготовить и распечатать задания
- Подготовить примеры картинок (ASCII-графику)
Площадка:
- Интернет на площадке
- Проектор/экран
Тайминг
- 0-10: рассказать про условия, про задачи, разбить на команды.
- 10-40: команды договариваются о языке, пишут код в режиме mob programming, то есть все за одним компьютером, всё обсуждают.
- 40-60: запускаем код, проверяем, что всё работает. Обсуждаем, какие были трудности, как преодолевали, у кого какие впечатления. Выбираем из каждой команды тех, кто помогал, награждаем.
Опыт подсказал, что 40 минут для решения задачи хватает впритык. Лучше заложить на всё мероприятие 1 час 20 минут и выделить на решение задачи 40-50 минут. В конце дайте больше времени, чтобы участники поделились открытиями и соображениями.
Ссылки
- ASCII Art — сайт с готовыми образцами ASCII-графики и онлайн-утилитой, которая поможет подготовить свои пример.
Задача для красных (кодирование)
Реализовать кодировщик 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#.