Спасибо за комплимент! :)
На самом деле задачка действительно необычная. И, что характерно, она из жизни. Собственно, мне пришлось проделать в точности то же самое, что и участникам, только в рамках реального программистского проекта. Ну и сама логика там была посложнее.
Так что резюме такое: задача вполне решаема. Но голову поломать приходится. Это факт. :)
Теперь выскажусь по поводу замечаний.
1. Почему Java? Чтобы не зависеть от платформы (Windows/Unix). Чтобы на соревнованиях ЧУ и на Тимусе был один и тот же модуль. Да и тот факт, что изначально код этого "калькулятора" был написан на Java - немаловажный аргумент в сторону этого языка (переписывать на других языках мне было просто объективно некогда).
Firefox, насколько понимаю, не виноват, что на машине не оказалось достаточно свежего JRE. Современные браузеры (в частности только что поставленный Firefox 1.0.4) нормально справляются с апплетами.
Какая, кстати, операционка?
Ну а как найти JRE... Мне казалось, что это проще, чем решать олимпиадные задачки. ;)
Например, вот здесь есть ссылка на JRE 1.4.2:
http://java.sun.com/j2se/1.4.2/download.html
А вообще, в данном случае давать прямую ссылку - неблагодарное занятие, поскольку во-первых, выходят новые версии JRE. Во-вторых, время от времени меняется дизайн сайта и прямые ссылки становятся нерабочими.
2. Спецификация входных данных сознательно дана в неполной форме, поскольку иначе задача теряет всякий смысл (при наличии грамматики там решать просто нечего, ну разве лишь поупражняться в создании синтаксического разбора конкретной, и, кстати, довольно простой грамматики). Вся соль задачи именно в том, чтобы разобраться с тем, как работает чужой модуль. Типичная, кстати, задача для программиста.
Входные данные корректны. В том смысле, что если сделать ряд разумных предположений о конструкции исходной грамматики, то данные будут укладываться в эти предположения. Например, в тестах скобки сбалансированы. Но поскольку модуль предлагался участникам на изучение его реакции на любой вход (в том числе и ошибочный), то даже ошибочные выражения (или подвыражения) как-то трактуются. Как реагировать на такую ситуацию? В точности так же, как и имеющийся модуль. :)
Еще раз подчеркну, что не было такой цели, сделать задачу нерешаемой. Ведь по большому счету, никто не мешал сделать так, что результат выражения очень сильно зависит, скажем, от 13 и 25 позиций выражения. Но в том то и дело, что грамматика вполне естественная. Хотя и содержит пару хитростей.
3. Ну, собственно, пара выводов напрашиваются сами собой:
- все выражения обрабатываются как числа, а не как строки
- пустое выражение трактуется как единица
Над остальным предлагаю еще подумать. :)
4. Все верно. Поскольку, как только что было отмечено, пустое выражение трактуется как 1. А концевой знак ';' (он, как можно заметить, служит разделителем операндов) говорит о том, что после него есть выражение (иначе он был бы не нужен).
В седьмом тесте выражения не длиннее 15 символов. :) И конечно же путем нескольких сабмитов можно узнать, что там за выражения.
Но я еще раз обращаю внимание на то, что грамматика достаточно простая и естественная. Поэтому стоит просто аккуратно продумать, какие принципиально разные комбинации/сочетания операций/операндов существуют, проверить их работу на имеющемся "калькуляторе" и повторить логику.