[c02 Конкурс "Parser"], Правила и условия |
Этот раздел предназначен исключительно для проведения конкурсов. Создание новых тем пользователями тут запрещено. Ответы в разрешенные темы только по теме соответствующего конкурса и в согласии с его правилами.
[c02 Конкурс "Parser"], Правила и условия |
volvo |
7.04.2009 9:55
Сообщение
#1
|
Гость |
Тема конкурса:
Разбор и вычисление значения арифметического выражения, полученного программой в run-time в виде строки Часто на форумах задают один и тот же вопрос: "Как построить график функции, причем функцию задать не перед компиляцией программы, а уже во время ее выполнения?" Вот именно этому и будет посвящено данное соревнование: реализации модуля, который разбирает введенное пользователем выражение, а потом (по запросу из основной программы) вычисляет значение этого выражения. Выражение представляет собой функцию многих аргументов (ограничим количество аргументов в данном соревновании: 26, по числу заглавных букв латинского алфавита). Обрабатываемая грамматика: Expr ::= Frac | '(' Expr ')' Frac ::= Mul '+' Frac | Mul '-' Frac Mul ::= Term '*' Powr | Term '/' Powr Powr ::= Term '^' Powr Term ::= 'Number' | '-' Term | '(' Expr ')' | 'ID' '(' Expr ')' где Number - вещественное число, записанное в НЕэкспоненциальной форме (1.2345; 2.434; 23656.9876). ID - один из идентификаторов функций, которые разрешены в выражениях: функции без аргументов: pi - значение числа Пи функции одного аргумента: sin, cos, tan, ctg (тригонометрические функции, параметр - в радианах), arcsin, arccos, arctan, arcctg (обратные тригонометрические функции, результат - в радианах), sinh, cosh (гиперболический синус и косинус), exp (ex), ln (натуральный логарифм), lg (десятичный логарифм), sqrt (квадратный корень) функции двух аргументов: log(base, x) - вычисление логарифма от X по основанию base; min(x, y) и max(x, y) - возвращают соответственно минимальный или максимальный из аргументов. (Уточнение: заглавные латинские буквы используются только для определения аргументов выражения, идентификаторы функций записываются строчными латинскими буквами) Задачей участника является написание модуля, содержащего следующие типы и функции:
А теперь - о том, чего использовать нельзя:
Участником Конкурса может стать любой человек, зарегистрированный на Форуме "Все о Паскале" не менее, чем за месяц до объявления Конкурса, и имеющий как минимум 15 профильных сообщений (то есть не в разделе Свободное Общение) на нем. Решения просьба высылать мне до 01.05.2009 (1 мая 2009) в PM в виде архива (с указанием "Конкурс Parser" в заголовке сообщения). Архив должен содержать только исходные тексты в файле с соответствующими расширениями (*.CPP и *.HPP для С++, и *.PAS для Дельфи и FPC). Если хотите - можете указать, каким компилятором предпочтительно проверять программу. Бинарники рассматриваться не будут ни в коем случае, только исходники. Внимание: если модуль, заявленный на участие в Конкурсе не проходит компиляцию ни одним из вышеназванных компиляторов, ее автор получает уведомление об этом в PM, и у него есть время исправить программу до окончания срока приема заявок. Тестовая программа оценивает скорость вычисления выражений модулем, участвующим в конкурсе. Не рассчитывайте на небольшое количество вызовов setFunction/resetFunction и setVarFunction/calcFunction. Они будут вызываться очень много раз (программа будет тестироваться на 18-ти функциях (плюс бонус), для построения графика каждой из которых понадобится как минимум 3 переменных типа TFunction, и как минимум 360 тысяч вызовов setVarFunction и calcFunction для каждой из этих переменных. Самый сложный тест подразумевает 5 переменных и более 2 миллионов итераций по каждой из них). Реализация TFunction, выполнившая данные тесты за минимальное время, и имеющая минимум штрафных баллов, считается победителем конкурса. (Возможно - если участников будет достаточно много - победитель будет определяться для каждого языка программирования) К этому сообщению присоединены три упрощенных тестовых программы - две на Object Pascal-е и на С++ (файлы в кодировке Unicode !!! test_pp.zip содержит программу для FPC; test_dpr.zip - для Дельфи 2009; программа из test_cpp.zip компилируется как в Builder 2009, так и в GCC /с минимальными изменениями - необходимо заменить реализацию rdtsc/), в которых можно посмотреть, каким образом осуществляется инициализация выражения, вычисление его значения и его удаление. Для того, чтобы увидеть ожидаемые результаты работы программы, ее надо запустить без изменений. Для тестирования своего модуля нужно добавить его к программе и изменить define NOCONTEST на define CONTEST Сопровождение Конкурса. К этому Конкурсу относятся также все темы этого раздела, в заголовке которых присутствует запись [c02 Конкурс "Parser"]:
Прикрепленные файлы test_pp.zip ( 4.6 килобайт ) Кол-во скачиваний: 3732 test_dpr.zip ( 4.66 килобайт ) Кол-во скачиваний: 3720 test_cpp.zip ( 6.52 килобайт ) Кол-во скачиваний: 3816 |
Текстовая версия | 15.11.2024 2:30 |