Serguey Zefirov ([info]thesz) wrote,
@ 2006-06-23 18:45:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:cpp, задача, сложное

Интересная задачка на проектирование C++

Маленький Эксель
----------------

Необходимо реализовать простую электронную таблицу в виде программы, выполняющейся
из командной строки. Она должна уметь обрабатывать ячейки таблицы как и более
продвинутые аналоги, только с упрощенным синтаксисом выражений. Каждая ячейка
может содержать:
 - Ничего
 - Неотрицательное целое число
 - Текстовые строки, которые начинаются с символа '
 - Строки-выражения, которые начинаются с символа '=' и могут содержать
   неотрицательные целые числа, ссылки на ячейки и простые арифметические
   выражения. Скобки запрещены, у всех операций одинаковый приоритет.
   Ссылки на ячейки состоят из одной латинской буквы и следующей за ней
   цифры.

   Эти ограничения введены для упрощения разбора выражений, поскольку разбор
   выражений не является основной частью проблемы. Вы можете спокойно
   положиться на эти ограничения. Вот грамматика содержимого ячейки:

      expression ::= '=' term {operation term}*
      term ::= cell_reference | nonnegative_number
      cell_reference ::= [A-Za-z][0-9] -- 
      operation ::= '+' | '-' | '*' | '/'
      text ::= '\'' {printable_character}

Процесс обработки:
 - Все выражения должны быть заменены на вычисленный результат.
 - Все вычисления выполняются с помощью целочисленной арифметики со знаком.
 - Ячейки с текстом должны быть вычислены как соответствующий текст без
   префикса '.
 - Операции над строками текста запрещены.
 - В случае любой ошибки вычисления формулы, вычисляемая ячейка должна содержать
   слово-сообщение об ошибке, начинающееся с символа '#'. Используйте короткие,
   ясные сообщения. Не надо предоставлять подробности об ошибках в выводе.

Программа должна использовать только стандартные библиотеки и классы и не должна
вызывать сторонние программы, библиотеки или системные компоненты.


Ввод и вывод
------------

Программа получает описание таблицы с формулами из стандартного ввода,
вычисляет ее и печатает полученный результат в стандартный вывод. Входные
данные представлены таблицей, элементы строк которой разделены табуляциями.
Первая строка содержит пару чисел, разделенных табуляцией - высоту и
ширину таблицы, соответственно. Затем идут строки с ячейками таблицы,
в грамматике, приведенной выше.


Выход должен содержать только ожидаемую информацию, включая сообщения об
ошибках, и никакой другой информации в выводе не должно быть, включая и
welcome text. Выход должен быть отформатирован в соответствии с приведенным
ниже примером.

Пример данных:
3            4
12          =C2       3       'Sample
=A1+B1*C1/5 =A2*B1    =B3-C3  'Spread
'Test       =4-3      5       'Sheet

Ожидаемый вывод:
12      -4      3       Sample
4       -16     -4      Spread
Test    1       5       Sheet


Указания по решению
-------------------
Необходимо промышленное качество кода. Более короткое и читаемое решение
предпочтительней. Решение должно содержать тестовые примеры и код, использованные
в процессе создания решения. Не забудьте откомментировать код в ключевых
местах. Код должен быть устойчив к ошибкам.

Представьте, что это требования к первой фазе проекта. Необходимо реализовать
только то, что нужно на этой фазе. Однако, известно, что планируется вторая
фаза, в которой требования будут расширены следующими:
 - Расширить формулы операциями над строками,
 - Оптимизировать производительность для громадных таблиц.

Вам необходимо будет указать, какие изменения необходимо сделать для
реализации второй фазы проекта.


Вот. С этой задачей в одной конторе не справился ни один из тех, кому ее давали. Точнее, не справился в полном объеме. После более или менее успешного ее решения проводилось интервью. Задача использовалась для выявления потенциальных архитекторов.

Для полноценного проектирования решения этой задачи в иерархию классов C++ необходимо вывести кое-какие условия, о которых умолчано в задании, затем тщательно проанализировать все условия вместе и принять пять ключевых решений по выбору того или иного пути реализации.



(Post a new comment)


[info]swizard
2006-06-23 03:20 pm UTC (link)
Очень хорошая задачка, сделаю, ради интереса, на выходных. А ограничения на объем оперативки есть?

(Reply to this) (Thread)


[info]thesz
2006-06-23 03:26 pm UTC (link)
В задании про это сказано. ;)

Надо ориентироваться на то, что таблицы будут большими. ;)

(Reply to this) (Parent)(Thread)


[info]swizard
2006-06-23 03:34 pm UTC (link)
Ну я так и понял :)

(Reply to this) (Parent)


[info]nealar
2006-06-23 03:55 pm UTC (link)
>промышленное качество кода
Это как?

(Reply to this) (Thread)


[info]thesz
2006-06-23 04:33 pm UTC (link)
В основном - определенный стиль. Не более.

(Reply to this) (Parent)(Thread)


[info]nealar
2006-06-23 04:57 pm UTC (link)
Хорошо, что я не знаю STL совсем! А то сел бы решать, облажался (не факт, но весьма вероятно) - оказался б неархитектором - пришлось бы работу менять :))

(Reply to this) (Parent)(Thread)


[info]thesz
2006-06-23 05:52 pm UTC (link)
STL там нужен постольку-поскольку. Типа, есть vector, а есть map. И все. ;)

Основное, как всегда, в логике. ;)

(Reply to this) (Parent)


[info]lomeo
2006-06-23 05:10 pm UTC (link)
А сколько времени давали интервьюируемым для решения задачи?

(Reply to this) (Thread)


[info]thesz
2006-06-23 05:53 pm UTC (link)
Долго. Сейчас поправлю, поскольку это давалось перед самим интервью.

(Reply to this) (Parent)


[info]some41
2006-07-05 01:34 pm UTC (link)
как-то так. качество, конечно, не промышленное - старался сделать как можно короче:
http://eltoder.pisem.net/temp/tbl.cc.html

(Reply to this) (Thread)


[info]ded_flint
2007-11-06 11:55 am UTC (link)
жаль, Сергей не ответил ничего... :(

(Reply to this) (Parent)(Thread)


[info]thesz
2007-11-06 04:02 pm UTC (link)
Да это как-то мимо меня прошло. Пропустил.

Но, вроде, нормально.

(Reply to this) (Parent)

Вот тут ты подсказку даешь.
[info]gaperton
2007-10-29 11:32 am UTC (link)
Никакие другие файлы не нужно читать или писать, включая стандартный ошибочный вывод (stderr).

По-моему, этого в оригинале не было. Это подсказка - к этому выводу читатель должен прийти сам. Потому, что задача проверяет навыки работы с ТЗ, и примерно половина решающих по нашей статистике в этом пункте ошибаются. Потому, тчо не умеют читать. Прикольно, правда? А ведь так же они будут трактовать и реальное ТЗ, между прочим.

Достаточно вот этого:
Программа получает описание таблицы с формулами из стандартного ввода,
вычисляет ее и печатает полученный результат в стандартный вывод.

(Reply to this) (Thread)

Re: Вот тут ты подсказку даешь.
[info]thesz
2007-10-29 12:09 pm UTC (link)
Да, по-моему, это именно мое добавление.

(Reply to this) (Parent)

Re: Вот тут ты подсказку даешь.
[info]binarin
2007-11-07 05:19 pm UTC (link)
Про stderr и проверку на умение читать ТЗ - на мой взгляд, чушь полнейшая. Например, оптимизация под огромные таблицы может включать вывод прогресса как раз в этот stderr, для особо нервных пользователей. Да и функции в стандартной библиотеки, навроде того же perror(2) неспроста существуют.

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]gaperton
2007-11-07 06:09 pm UTC (link)
"...умение читать ТЗ - на мой взгляд, чушь полнейшая." Заметно.
1) Вывод прогресса не является оптимизацией ни при каком раскладе. Это дополнительная фича, о которой вас никто не просил, и на которую вы тратите свое время зря, вместо того, чтобы потратить его, например, на дополнительное тестирование.
2) Существование или несуществование каких-либо функций в стандартной библиотеке никак не влияет на интерпретацию ТЗ.
3) В ТЗ сказано - писать в стандартный вывод. В ТЗ сказанно - предпочтение отдается более краткому решению. Вывод пытливый ум делает какой? Писанина в stderr помимо стандартного вывода, о которой вас к тому же никто не просил, зазря удлинняет ваше решение, и будет трактоваться как минус. Писанина в sеderr в каких-то ситуациях _вместо_ стандартного вывода уже не минус, а грубая ошибка. Ваш код просто не пройдет тест, и дазвиданья.

Способ, которым вы понимаете условия данной задачи, отражает ваш способ работы с реальным ТЗ. Фантазировать не надо, надо решать поставленную задачу, а не выдумывать свою собственную.

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]binarin
2007-11-08 12:58 pm UTC (link)
По 1) - я видел слишком много нетерпеливых пользователей, чтобы не показывать им индикатор прогресса. Лучше дать им один раз дотерпеть до конца, чем выполнить 10 полузапусков. Хотя это наверное тоже додумывание, ведь в ТЗ даже не написано, в пакетном или интерактивном режиме всё это будет использоваться. А если в пакетном, то нужно ли что-нибудь с кодами возврата делать.

Не, в действительности для этой задачи я и сам бы наверное не стал бы писать stderr, т.к. придумать не могу, для чего это может понадобиться. Но считать ошибкой то, что что-то записывается в stderr(при наличии такого ТЗ) - снобизм.

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]gaperton
2007-11-08 01:37 pm UTC (link)
> Хотя это наверное тоже додумывание, ведь в ТЗ даже не написано, в пакетном или интерактивном режиме всё это будет использоваться. А если в пакетном, то нужно ли что-нибудь с кодами возврата делать.

Вот. О правильной вещи думаете. В ТЗ это явно не сказано. Однако из него однозначно _следует_, что тулза должна работать в пакетном режиме. Такое "додумывание" - это и есть анализ ТЗ. В реальной жизни ТЗ часто неполны и противоречивы, и вы должны их проанализировать, и вывести логически надосказанные вещи, определить противоречия, найти варианты решения противоречий, и разрешить последние с помощью заказчика. Данное задание составлено непротиворечиво, нет там противоречий, но оно местами не полно (то есть не все разжевано и в рот положено - некоторые вещи надо вывести самому - например, возможность наличия зацикленных формул и что в том случае выводить).

Единствнные ошибки, которые вы можете выводить не в стандартный вывод, не противореча ТЗ - это ошибки формата таблицы, когда вы из-за них таблицу целиком считать не можете. Скажем, если у табуляций в строке будет меньше, чем нужно. За такую запись в stderr ничего не будет.

Код возврата не покрыт ТЗ, и дополнительной фичей не является - следовательно вы можете поступать с ним любым образом, каким сочтете нужным - все варианты удовлетворят ТЗ.

Насчет трактования записи в stderr как ошибки. Тут на самом деле все зависит от того, что и как туда писать. У ошибок есть классификатор. Если программа ведет себя удовлетворяя ТЗ, и помимо того, пишет в stderr - такое поведение зачтут как minor error (мелкий недочет) только в случае если на такую запись будет потрачено много усилий, т.е. ради этого будет раздут код. Если запись в stderr будет феерична - например, туда будут писать ошибки рассчета клеток, боюсь, проверяющий зачтет это как просто error (немотивированное применение). Потому, что для данной программы наличие #error в клетке является вполне штатной ситуацией.

При этом, minor error вообще не считается (с кем не бывает), на них обращают внимание только если их _очень_ много. error - не являестя поводом для не приглашения на собеседование. major error - даже он не фатален, если человек очень хорошо решил какие-нибудь другие аспекты, скажем: у нас словлено 3 major error дизайна, однако очень простой, компактный и читабельный код, с понятными идентификаторами, грамотно задействующими стандартные библиотеки, да еще человек не забыл про коды возврата. Это тоже все в плюс идет.

Думаете, его не позовут на собеседование? Щаз. Зачем грамотных спецов из-за какой-то задачи пропускать. Задача - это лишь повод для разговора, не более. Задача выявляет сильные и слабые стороны человека, у каждого своя раскладка. Иногда правда по решению видно, что говорить с кандидатом решительно не о чем. Ну, в таких случаях обычно никто и ошибки не считает - там сразу видно, что код говно. Ошибки считают тогда, когда с человеком поговорить хотят, толко и всего. Никакого снобизма.

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]binarin
2007-11-08 02:06 pm UTC (link)
Первое сообщение в треде неоднозначным получилось ("ошибаются" наверное слишком сильное слово). Я его воспринял как "любая запись в stderr - это error(немотивированное применение)".

А в реальности, наверное, "ошибающаяся в этом пункте половина" - это те, у кого "minor error"? Или половина - это с более серьезными недостатками?

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]gaperton
2007-11-08 02:15 pm UTC (link)
Какой там stderr - чтоб туда писать, надо знать о его существовании, это уже продвинутый уровень. Не было таких ошибок. Все было гораздо хуже. Короче, примерно _половина_ людей присылает программу, которая работает не со стандартным вводом-выводом, а с файлом. Т.е. берет имя файла параметром, открывает его, и читает. Дальше идут вариации - часть из таких товарищей пишет его в другой файл, часть выдает в стандартный вывод.

Нас настолько этот факт изумил (когда писал в условии про стандартный ввод - я хотел всего лишь упростить жизнь решающим задачу, не более того - чтоб с файлами не возились), что мы стали ставить за такое жирный минус. Это пипец какой-то - черным по белому написано в самом начала - из стандартного ввода. Чем читают, не понятно.

(Reply to this) (Parent)

Re: Вот тут ты подсказку даешь.
[info]gaperton
2007-11-08 02:20 pm UTC (link)
Т.е. акцент в первом сообщении был не на stderr, а на "никакие другие файлы читать и писать не нужно".

(Reply to this) (Parent)(Thread)

Re: Вот тут ты подсказку даешь.
[info]thesz
2007-11-09 09:39 am UTC (link)
belnetmon
2007-11-08 06:51 pm UTC (от 212.98.181.67) (ссылка) СтеретьЗаморозитьСкрытьОтслеживать Выбрать
Очень хороший тест, весьма удачно выбрано то, как челвоек пропустит все через мозг и какую родит объектную модель в итоге. Правда, что это на С++ не суть важно, такое вообще можно на бумаге потребовать нарисовать :)

У нас был аналогичный тест, но на обработку баз данных, загруженных в консольной программе через stdin из текстового файла

Тоже замечательно показывает, какие у претендента водятся жуки и жабы в голове :)


Вот. Мопед не мой. ;)

(Reply to this) (Parent)

Re: Вот тут ты подсказку даешь.
[info]thesz
2007-11-08 10:19 am UTC (link)
Про stderr и проверку на умение читать ТЗ - на мой взгляд, чушь полнейшая.

Ничуть.

Посмотрите, сколько всего вы додумали. ;)

Например, оптимизация под огромные таблицы может включать вывод прогресса как раз в этот stderr, для особо нервных пользователей.

Этого в предложенном ТЗ нет.

</i>Да и функции в стандартной библиотеки, навроде того же perror(2) неспроста существуют.</i>

Значит, не надо ими пользоваться.

К тому же, скажите, где может понадобиться perror в этой задаче в ее текущем выражении?

(Reply to this) (Parent)


[info]belnetmon
2007-11-08 06:51 pm UTC (link)
Очень хороший тест, весьма удачно выбрано то, как челвоек пропустит все через мозг и какую родит объектную модель в итоге. Правда, что это на С++ не суть важно, такое вообще можно на бумаге потребовать нарисовать :)

У нас был аналогичный тест, но на обработку баз данных, загруженных в консольной программе через stdin из текстового файла

Тоже замечательно показывает, какие у претендента водятся жуки и жабы в голове :)

(Reply to this) (Thread)


[info]thesz
2007-11-08 07:04 pm UTC (link)
Надо то же самое написать [info]gaperton. Это он автор. ;)

(Reply to this) (Parent)(Thread)


[info]belnetmon
2007-11-09 07:26 am UTC (link)
Я не нашел у него в журнале такой записи

(Reply to this) (Parent)(Thread)


[info]thesz
2007-11-09 09:38 am UTC (link)
Да можно здесь в комментариях.

Да я сейчас сам ему на ваш комментарий укажу. ;)

(Reply to this) (Parent)

Еще вариант
[info]nlv2
2008-07-29 06:14 am UTC (link)
см. http://nlv2.livejournal.com/754.html

(Reply to this) (Thread)

Re: Еще вариант
[info]thesz
2008-07-29 09:06 am UTC (link)
Эта штука и на чтение ТЗ тоже.

Поэтому, если нет ввода и вывода, то не засчитывается. ;)

(Reply to this) (Parent)

Re: Еще вариант
[info]nlv2
2008-07-29 10:06 am UTC (link)
Ну чтоже, будет время - добавим ввод вывод, а так же вычитание и деление.
Кстати, монады входят в "стандартные библиотеки и классы"?

(Reply to this) (Thread)

Re: Еще вариант
[info]thesz
2008-07-29 10:40 am UTC (link)
Входят. ;)

(Reply to this) (Parent)


Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…