Здравствуйте, извините за неканоническое использование шаблона "Спортивное программирование и...".
Недавно мне стало интересно, как много авторов задач для соревнований по программированию пишут задачи о языках программирования (кроме меня :-D). Я робко надеялась не оказаться одинокой в своей любви к этой тематике, но действительность превзошла все мои ожидания. Конечно, задачи о языках программирования встречаются реже, чем задачи о компьютерах, процессорах, платах, чипах, параллельных вычислениях, базах данных и прочих околокомпьютерных вещах, но все-таки гораздо чаще, чем, скажем, о драконах :-)
1. TopCoder
В свое время (то есть до 2006 года, к которому относится самая свежая из найденных мной задач) на TopCoder промелькнуло несколько задач о ЯП. В большинстве своем (7/9) они достаточно однотипны: дается исходный код программы на си- или паскалеподобном языке, требуется его проанализировать и доложить результаты.
Задача | Задание |
---|---|
QuiningTopCoder | Написать интерпретатор Unefunge |
ScriptLanguage | Для заданной программы на простом языке типа Visual Basic с условными переходами найти недостижимые строки и неинициализированные переменные |
VariableDeclaration | Определить все переменные, объявленные неправильно с точки зрения C# (т.е. с повторным объявлением переменной в блоке и в его под-блоке). Правда, входная программа задана как набор блоков и объявленных в них переменных, так что использование языка как такового сведено к минимуму |
Loopy | Найти цикл минимальной длины в императивной программе, сведенной к набору условных переходов |
DeadCode | Найти количество недостижимых команд в программе, сведенной к набору условных переходов |
CommentNest | Очистить заданную программу от вложенных комментариев /* ... */ |
Comment | Очистить программу на Java-подобном языке от комментариев // и /* ... */ , без вложенных комментариев, зато со строками и экранированием символов |
Execution | Подсчет количества выполненных базовых операций для программы с циклами |
TurtleGraphics | Черепашья графика в 3D |
Сложно сказать, в чем именно причина пересыхания ручейка задач о ЯП. Навскидку могу предложить несколько вариантов:
- смена алго-координатора (или его эстетического вкуса).
- отсутствие особого интереса к теме среди авторов. Придумать задачу о чем-то абстрактном гораздо проще, чем на какую-то определенную тему, тем более на такую.
- фокус на алгоритмической стороне задачи, а не на деталях длинной и неаппетитной реализации.
- ограниченность выразительных средств задачи: если, к примеру, требовать не анализировать заданные программы, а генерировать свои, то задача сразу становится сложнее, как минимум за счет того, что ответ должен определяться однозначно (система тестирования на TopCoder не позволяет как-то обрабатывать возвращаемое значение, например, интерпретировать программу и сравнить ее вывод с эталонным выводом, сравниваются обязательно сами возвращаемые значения). А это значит, что нужно накладывать искусственные ограничения на программу — минимальная возможная длина, лексикографическое первенство среди всех программ с такой длиной и т.д. Найти алгоритм, гарантирующий минимальную длину программы, и доказать его правильность — задача явно не одного СРМа :-)
- в постановке задачи "сгенерируйте программу, которая делает нечто", это "нечто" должно хорошо параметризоваться входными данными (то есть наборов входных данных должно быть много, и они должны отличаться нетривиальным образом); навскидку придумывается разве что "выводит заданное сообщение", да "вычисляет заданное арифметическое выражение" — не очень интересно.
2. Codeforces
На Codeforces с задачами на ЯП все обстоит довольно неплохо — кроме моего прошлогоднего раунда, нашлись задачи 93C - Аземблер (о генерации программы на языке типа Ассемблера) и 39A - Вычисления в C*++ (об операциях a++ и ++a). В целом это дело наживное — возможности системы позволяют делать задачи достаточно разнообразными, дело только за фантазией авторов.
P.S. И сразу же подкрепление этого тезиса — сегодняшняя задача 195C - Попробуй поймай об обработке исключений в языке Vasya Programming Language. Ну как тут не поверить в ноосферу? :-)
3. Challenge24
Я уже упоминала, что я очень люблю этот контест? Ну, значит, повторюсь: я очень его люблю, не в последнюю очередь за разнообразие тем и формата задач. Последнее время (если быть точной, последние четыре года) либо в финале, либо в отборочном раунде обязательно присутствует задача, в которой нужно либо писать программы на каком-нибудь странном языке, либо писать его интерпретатор. Ну то есть как "писать" программы — в 2011 году программы сдавались на "перфокартах", и команды языка кодировались жирными черными точками-"отверстиями" на них. В 2009 году в роли странного языка выступал Piet, и программы были изображениями, хоть и записанными в текстовом формате.
Задача | Задание |
---|---|
2012, EC, D. If | Оптимизировать размер кода программы на языке с произвольным доступом к переменным. Эта задача отличалась разнообразием возможных к ней подходов: самым простым было ручное удаление неиспользуемого кода и лишних по смыслу переходов и оптимизация арифметических действий (проще — только сдать исходные коды программ без изменений, что тоже приносило какие-то баллы). Продвинутые методы требовали написания интерпретатора либо транслятора кода и анализа того, что он, собственно, делает. |
2011, Finals, K. Punchcards | Написать программу, выполняющую заданные действия, на языке типа Ассемблера. Дополнительным усложнением был формат сдачи решений — код программы нужно было аккуратно перенести на "перфокарты", где команды записывались двоичными кодами, а единицы в кодах — черными кружочками в нужных графах. Заполненные перфокарты сдавались админам, и через некоторое время кто-то из них приносил ответ. Ужасно муторное занятие (даже самая короткая программа не помещалась на одну перфокарту), плюс представьте себе удовольствие это редактировать и отлаживать :-) |
2010, EC, G. Compiler | Написать транслятор описанного языка в Ассемблер. |
2009, Finals, 3 Cheap labor | Как было сказано, написать программу, выполняющую задание, на Piet (да, очень вдохновляющий язык :-)). Задания были не сложнее вычисления факториала, но это с лихвой искупалось запутанностью самого языка. Кстати, любопытно, не завалялось ли у кого-то из участников того финала на компьютере генератора программ на Piet (точнее, транслятора с псевдокода), который, по моим оценкам, должен был сильно помочь в решении этой задачи (я проверила — у меня на ноуте он завалялся. Эх, эту бы задачу да в мой год :-)) |
2003, Finals, Chapter 7 Automated testing | В тот год на финале было одно большое задание, состоящее из нескольких последовательных подзадач; одной из них и было написание интерпретатора для выдуманного скриптового языка AUCH |
Следует отметить, что для Ch24 такой формат задач подходит практически идеально. Во-первых, он сильно отличается от типичных задач соревнований, то есть у алго-красных на нем не такое огромное преимущество — хотя формат, в котором у них преимущества нет вообще, я пока не представляю :-) Во-вторых, он очень хорошо реализует сразу два принципа Ch24 — первые (небольшие) тесты можно решить вручную, для более сложных уже придется писать какую-то автоматизацию, и сабмиты участников можно сравнивать по "качеству" (длине сгенерированного кода), тем самым реализуя относительный скоринг. Наконец, длина и командность соревнования позволяет давать задачи, для решения которых нужно сначала написать интерпретатор языка, а только потом переходить к программам.
4. IPSC
Еще один контест, формат которого практически не ограничивает фантазию авторов: для каждой задачи нужно всего два теста, причем они могут значительно отличаться по смыслу (в отличие от Challenge24, в котором тесты к задаче отличаются в основном размерами и сложностью). В результате каждый год (кроме, увы, последнего) организаторы балуют участников какой-нибудь затейливой задачей о ЯП.
Задача | Задание |
---|---|
2011, H. HQ0-9+-INCOMPUTABLE?! | Написать на описанном эзотерическом языке программу, которая выводит заданную строку |
2010, practice, R. Round and round it goes | Подбором констант загнать заданную программу в бесконечный цикл |
2009, С. Cryptic punchcards | Расшифровать перфокарты; во второй подзадаче на перфокартах была записана программа на Fortran с неочевидным выводом (комментариями и командами, разбитыми на несколько строк) |
2009, I. Instructions | Написать программу на ассемблероподобном языке |
2008, C. Comparison Mysteries | Фокусы с типами данных в Java |
2007, practice, Q. QuackQuack | Написать программу на эзотерическом языке Quack, использующем очередь и регистры. Этот же язык фигурировал и в заданиях предыдущих лет, но в основном контесте — только в 2004 году |
2006. J. Jamcode 2006 | Для заданной неправильной программы на C++ подобрать тест, на котором она выводит правильный ответ |
2005, B. Bottom Coder | Изменить код заданной программы на 1 символ, чтобы она выполняла нужное задание |
2005, practice, Q. Quack Strikes Back | Написать программу на Quack |
2004, G. Gets and Puts | Дебют Quack :-) |
2003, B. begin 4 7 add | Выяснить, что делает программа на PostScript |
2002, A. Andrews's Exams III | Задана программа на C и Pascal, нужно найти входные данные, для которых она отрабатывает быстро, (легкая подзадача) или определить, что она выводит (сложная) |
2001. A. Andrews's Exams II | Определить, что выводит заданная программа на C и Pascal |
2000. A. Andrews's Exams | Найти количество звездочек, которые выведет заданная программа на C и Pascal |
5. Другие источники задач
Есть основания предполагать, что в разного рода ACM-контестах тоже встречаются задачи на ЯП, и если покопаться как следует в архивах, можно найти массу любопытного.
- Первый же взгляд на acm.timus.ru являет нам тэг "unusual problems" и задачу Introspective Program, требующую написать квайн на загадочном языке PIBAS.
- Взгляд чуть более внимательный находит Language Ocean с восточного четвертьфинала NEERC 2011, в которой необходимо реализовать вывод типов переменных и проверку корректности этих типов.
- И задачу Time Limit Exceeded, в которой приходится интерпретировать заданную программу и безжалостно ее прерывать после первых десяти миллионов команд.
- И задачу Brainfuck, требующую сгенерировать кратчайшую программу на варианте Brainfuck без циклов.
- Целая серия задач от УрГУ (Ural State University) знакомит участника с языком D++ (который не имеет ничего общего ни с Meta D++, ни с DigiSystems D++, ни с D++ для распределенных вычислений).
- Задача H. Рекурсия c восьмой интернет-олимпиады для школьников сезона 2007-08 предлагала участникам выяснить, можно ли вызвать какую-то из процедур заданной программы на языке Ж+- с такими параметрами, чтобы она ушла в бесконечную рекурсию.
А какие задачи о языках программирования знаете вы?
Рекурсия
Может не то, но в задаче HTML надо сделать подсветку синтаксиса на Pascal'е.
С acm.sgu.ru: 189. Perl-like Substr, 215. PL/Cool, 360. B++ Interpreter, 306. Balance.
С acm.mipt.ru: 300. Algorithm Complexity.
Простой Новогодний контест 2012. К сожалению, я не помню оригинального источника задачи "19. Translation" (Всесибирская олимпиада?). В ней просилось перевести программу, написанную на упрощенном паскалеподобном языке на Brainfuck.
Да. Всесиб.
Да, всесибирская: http://olimpic.nsu.ru/widesiberia/archive/wso12/2011/rus/wso12_problems.pdf (задача 11).
Ну почему, почему эта тема на главной? Nickolas, сколько это стоит?
Это стоит N часов труда на внимательное написание поста, подбор материала, ссылок, перевод всей этой красоты на английский. Это стоит годы опыта, десятки контестов, тысячи строк кода. Это стоит массу душевных сил, которые заставляют не лениться, а поделиться интересной идеей с сообществом. Так что зря спрашиваете, у вас столько нету ;)
что ты несешь?
Какие посты появляются на главной — решает администрация. На главной публикуются содержательные, позитивные, двуязычные посты, соответствующие тематике Codeforces. Необходимыми условиями являются грамотный текст и аккуратное оформление.
парсер паскаля
Меня всегда немного удивляло то, что люди следуют какому-то шаблону, совершенно не понимая его суть. Что это? То самое "здесь так принято" из известной шутки? Желание продемонстрировать "свой/чужой" вписыванием себя в кем-то установленные рамки? Заполнение шаблоном бреши из-за собственной шаблонности? Наверное, правильный ответ в каждом случае свой.
Как себя-то не похвалить
opencup.ru/files/oc6/gp2/problems-e.pdf
Задачи A и J.
http://codeforces.net/contest/39/problem/G
В рамках ICFPC было как минимум два конкурса на тему языков программирования: в 2000 и 2001
На ВКОШП-е 2007 года была задача об идентификаторах. Кажется H или I.