История
Версия для печати

Архив форума

Dmitry Kovalioff 24.07.2005 19:19
Поскольку эта задача была на втором туре ЧУ-2005, не знаком ли кто с её автором? На тимусе её пока мало кто решил, поэтому хочу побеседовать с ним лично...
Александр Клепинин 25.07.2005 01:57
Думаю, что с автором многие знакомы. ;) В том числе, и Вы, Дмитрий.
Я Вас слушаю. О чем Вы хотели со мной лично побеседовать? :)
Гость 25.07.2005 12:20
А, так вот кто придумал эту задачу :) Вас можно поздравить - редкая задача способна сопротивляться мне в течение 3 дней. Я в шоке...

1. У очень многих, в том числе и у меня, возникли проблемы с java-модулем, прилагающимся к задаче. У меня Firefox - так он вообще не поддерживает Java. Internet Explorer 6.0 SP2 приложение запускал, но на любой ввод оно возвращало что-то вроде Array.List. Скачать JRE было делом не из лёгких, поскольку прямая ссылка на файл почему-то отсутствует - вместо этого предлагается самостоятельно совершить экскурсию по сайту sun. Кстати, я так и не нашёл там JRE - только JDK весом в столько мегабайт, что качать по dial-up сразу расхотелось. Странный выбор языка написания модуля - не проще ли было использовать php-скрипт или просто выложить прекомпиленые exe-шники для нескольких платформ? А так Вы добились того, что большинство желающих порешать эту задачу просто не в состоянии этого сделать.

2. Входные данные очень плохо специфицированы. Я, конечно, понимаю, что задача в том, чтобы разобраться в логике, но мне кажется, что следовало хотя бы указать формальную грамматику входного языка или дать возможность построить её самостоятельно. Проблема в том, что модуль на любой вход, даже заведомо некорректный (например, неравное количество '(' и ')') всё равно что-то выдаёт. Поэтому вопрос - в какой степени корректными являются входные данные, и если они всё-таки некорректны, то как на это реагировать?

3. Не могу понять странную логику работы модуля. Несколько примеров:

1;2;3 > 123
1;2;3; > 1231 (???)

1;0;1 > 101
1;00;1 > 101 (???)
1(00)1 > 11 (???)
1;(00);1 > 101 (???)

+;; > 3 (???)

К слову сказать, на листах с разбора задач про это ни слова не сказано...

В чём, собственно, отличие конкатенации через скобки от конкатенации через точку с запятой? Что делать с несколькими идущими подряд нулями и точками с запятой? Я даже не уверен, что эти данные корректны в том смысле, что реакция на них проверяется в ходе тестирования решения...

4. В ходе небольшой проверки выяснилось, что 4-ая строка 2-ого теста выглядит примерно так:

<digit1>;<digit2>;<digit3>;

Соответственно, ответ будет не

<digit1><digit2><digit3>

а почему-то

<digit1><digit2><digit3>1

Я встроил в своё решение fake, решающий эту проблему, и сейчас у меня WA(7). В этом тесте всего 3 выражения длиной не более 50 символов, поэтому за несколько десятков сабмитов я легко отловлю ошибку. Но всё-таки хотелось бы знать, что думаете по этому поводу Вы...
Dmitry Kovalioff 25.07.2005 12:22
Забыл залогиниться :oops:
Александр Клепинин 25.07.2005 15:24
Спасибо за комплимент! :)
На самом деле задачка действительно необычная. И, что характерно, она из жизни. Собственно, мне пришлось проделать в точности то же самое, что и участникам, только в рамках реального программистского проекта. Ну и сама логика там была посложнее.
Так что резюме такое: задача вполне решаема. Но голову поломать приходится. Это факт. :)

Теперь выскажусь по поводу замечаний.

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 символов. :) И конечно же путем нескольких сабмитов можно узнать, что там за выражения.

Но я еще раз обращаю внимание на то, что грамматика достаточно простая и естественная. Поэтому стоит просто аккуратно продумать, какие принципиально разные комбинации/сочетания операций/операндов существуют, проверить их работу на имеющемся "калькуляторе" и повторить логику.
Dmitry Kovalioff 26.07.2005 13:11
Спасибо за оперативный ответ. Конечно, в ближайшее время я решу эту задачу - поскольку она осталась последней нерешённой...