Здравствуйте, skeptic, Вы писали:
S>Здравствуйте, sjukov, Вы писали:
S>>Коллеги,
S>>поругайте пожалуйста код :
S>>http://pastebin.com/U505pmkr
S>Ты совершенно прав — нет никакого смысла решать такую задачу на собеседовании, S>если у тебя нет какой то ну очень большой мотивации идти работать именно к этому работодателю. S>Более того — этот работодатель, я так думаю, и сам в курсе что нет в этом никакого смысла, но S>поток соискателей надо чем то сбивать, вот и глумятся
S>P.S. надеюсь я правильно понял подтекст твоего поста
Я хотел сказать что у меня это заняло чуть больше времени чем этого ожидает "средний"
интервьюер в компании масштаба Яндекса. На самом деле за годы практики для меня ситуация "хочется странного"
вполне нормальна... поэтому чтобы попросили, то и попробовал бы сделать.
Когда я нанимал людей к нам в отдел я давал задание уровня — "длинная арифметика" (там где символы в столбик надо оперировать)
Самым сложным заданием что я давал это был многопоточный TCP/IP сервер(echo) . Это задание нужно было сделать дома максимум за неделю.
Здравствуйте, Abyx, Вы писали:
A>Здравствуйте, sjukov, Вы писали:
S>>Я тут подсуетился- теперь мой код опять , я считаю, лучше чем Ваш
A>это легко проверить — попробуйте расширить функциональность. A>если код хороший, то это будет очень просто сделать, изменений существующего кода будет мало, в основном надо будет только дописать новый код.
Я попробую завтра сделать вечером , обещаю !
A>а такой новой функциональностью могут быть новые операторы с другими приоритетами, и многосимвольные операторы ('<=', '>=', 'shl' или '<<' и т.п.) A>или можно пойти "вглубь" и добавить унарные операторы — и ~, например константу Pi и вызов функции sin()
С константами проблем вообще нет —
вместо этой строчки проверять sval по таблице на соответствие константе и подставлять значение . PI,E,...
...
if (_p == std::string::npos)
{
if (sval[0] == '(')
return Eval(sval.substr(1, FindClosePar(sval.substr(1, sval.length()))));
else
/*ТУТ >>>*/return float(atof(sval.c_str()));
}
else
...
A>многосимвольные операторы сломают switch(c)
Не сломают... многосивольные операторы для внутреннего представления можно заменить на спец-символы (любой ASCII символ не используемый в мат выражениях)
A>усложнение грамматики раздует функцию Eval,
Не думаю что значительно — завтра посмотрим.
A>а вызов функции — наверное сломает поиск скобок
Не сломает — а потребует дополнительный код для поддержки новой функциональности (функции)
Это пожалуй сейчас самая сложная для меня часть... завтра отпишусь о результатах
Не, всё ещё плохо. Вот, "120/1/2/3/4/5" посчитай.
И ещё что хочется сказать — твой калькулятора не проверяет корректность работы разбора. Довольно опасное свойство для вычислителя, который уверенно выдаёт чушь при ошибке ввода вместо того, чтобы сообщить что имеет место именно ошибка ввода. Вот почему у тебя можно смайлики складывать, например, "(0_o)+8D"? Как такой программе можно доверять?
Здравствуйте, sjukov, Вы писали:
S>>>Я тут подсуетился- теперь мой код опять , я считаю, лучше чем Ваш
A>>это легко проверить — попробуйте расширить функциональность. A>>если код хороший, то это будет очень просто сделать, изменений существующего кода будет мало, в основном надо будет только дописать новый код. S>Я попробую завтра сделать вечером , обещаю !
(Раз уж тут (да и "там") "парад строчных калькуляторов" образовался.)
Давным-давно (лет десять уже прошло, это видно по комментариям в тексте; я-то уже и позабыл, когда) писал я строчный калькулятор для Multi-Edit 7.0 DOS (так как тот, что там был (и остался) — совсем по другому принципу работает). Язык там почти C.
Метод разбора взят из "Книги Дракона" ("shift-reduce" syntax analyzer, есть матрица приоритетов и ассоциативности), там в комментарии есть номера страниц русского перевода. То есть, "строго научный метод".
Особо распространяться не буду (с телефона не очень-то).
(Ужас — позабыл даже, что там скобки обрабатываются.)
Писал, конечно, не "час-два-три", а, скорее, с неделю или даже больше — потихоньку. Что помню — точную позицию ошибки тогда не стал определять (хотя там всё для этого было подготовлено), только сам факт ошибки (ибо не нужна была позиция).
Если есть интерес, то по ссылке на архивы (внизу тут) берите архив ME_PLUS и в нём — файл MATH.S на почти 1400 строк (ещё есть MATH.SH — интерфейс вызова). Язык, повторюсь, почти C. Попробовать в работе — архив ME (он строкой выше там). Калькулятор запускается по Alt+C из редактора. В калькуляторе есть справка по F1.
Здравствуйте, Abyx, Вы писали:
S>>>>Для каких-то либо референтных значений времени выполнения автор попросил сделать двух людей сделать такое задание. S>>>>Один был боевым программистом Яндекса — сделал за 2 часа примерно, второй был менеджером (в отрочестве программистом) — так тот справился за S>>>>4.5 часа. A>>>там про менеджеров написано что они auto_ptr юзают, что какбэ намекает на их профессиональный уровень.
NB>>а что не так с авто_птром? ну и на анатоликса наезжаешь тоже напрасно.
A>auto_ptr был deprecated в стандарте 11го года, это было более двух лет назад.
и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано.
если и кого-то по этому поводу комплексы, то это их личные трудности.
A>при этом до этого его не рекомендовали использовать наверное с середины нулевых, и писали всякие boost::scoped_ptr, llvm::OwningPtr и т.п.
ага, нужно было в демонстрационный пример обязательно буст протащить. куда же без него.
A>люди, которые не в курсе современного состояния языка вполне заслуживают наездов.
вы знакомы лично?
добавь побольше пафоса, это всегда помогает.
Здравствуйте, Abyx, Вы писали:
A>auto_ptr был deprecated в стандарте 11го года, это было более двух лет назад. A>при этом до этого его не рекомендовали использовать наверное с середины нулевых, и писали всякие boost::scoped_ptr, llvm::OwningPtr и т.п.
С auto_ptr все нормально, просто некоторые получали граблями по лбу из-за непонимания эстафетного владения, ну так С++ наполовину состоит из вещей которыми можно получить по лбу, если не знать как ими пользоваться
Здравствуйте, skeptic, Вы писали:
S>вот ещё это например — "зачем что test-driven development не дает совершать ошибки и сокращает время на разработку."
Здравствуйте, night beast, Вы писали:
NB>и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано.
о как. это какой такой конкретный код? покажи.
чтоб два раза не вставать, может у тебя гдето и gotocomefrom оправдано?
A>>при этом до этого его не рекомендовали использовать наверное с середины нулевых, и писали всякие boost::scoped_ptr, llvm::OwningPtr и т.п. NB>ага, нужно было в демонстрационный пример обязательно буст протащить. куда же без него.
в какой еще пример? и что не так с бустом? может еще и с stdlib что-то не так?
A>>люди, которые не в курсе современного состояния языка вполне заслуживают наездов. NB>вы знакомы лично? NB>добавь побольше пафоса, это всегда помогает.
а что, надо быть знакомым лично, чтобы кого-то критиковать?
Здравствуйте, MTD, Вы писали:
MTD>Здравствуйте, Abyx, Вы писали:
A>>сейчас попробовал решить эту задачку, получилось ровно час, от первого коммита до коммита полностью функциональной версии — https://bitbucket.org/goldfinch/stringcompiler/commits/all
MTD>[Abyx-style on] MTD>MS VS не нужен т.к. есть современный, mature g++ доступный на всех платформах. MTD>[Abyx-style off]
вообще я сначала хотел писать этот код под mingw, чтоб еще и засунуть его на coliru
но потом я подумал что для этого надо текстовый редактор, а еще лучше IDE, и вдруг мне в какой-то момент понадобится отладчик — в итоге я стал писать в студии.
Здравствуйте, Abyx, Вы писали:
NB>>и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано. A>о как. это какой такой конкретный код? покажи.
здесь
A>чтоб два раза не вставать, может у тебя гдето и gotocomefrom оправдано?
естественно. применение goto в чистых сях вполне оправдано.
что такое comefrom я не совсем понял. это что-то личное, да?
A>>>при этом до этого его не рекомендовали использовать наверное с середины нулевых, и писали всякие boost::scoped_ptr, llvm::OwningPtr и т.п. NB>>ага, нужно было в демонстрационный пример обязательно буст протащить. куда же без него.
A>в какой еще пример? и что не так с бустом? может еще и с stdlib что-то не так?
мда.
A>>>люди, которые не в курсе современного состояния языка вполне заслуживают наездов. NB>>вы знакомы лично? NB>>добавь побольше пафоса, это всегда помогает.
A>а что, надо быть знакомым лично, чтобы кого-то критиковать?
чтобы делать выводы о том, что кто-то чего то не знает, было бы не плохо иметь на руках какие-то подтверждения этому.
без этого ты выставляешь себя обычным пустозвоном. ничего личного, но со стороны это выглядит не очень красиво.
Здравствуйте, night beast, Вы писали:
NB>>>и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано. A>>о как. это какой такой конкретный код? покажи.
NB>здесь
и чем именно там оправдано применение auto_ptr?
тем что в 2013 году код писался на языке 98года? или тем что #include <boost/scoped_ptr.hpp> не написать?
действительно, если код пишется на выброс, то можно применить auto_ptr и написать прочие using namespace std;
но тогда хорошо бы написать комментарий типа "do not write this in real code", и уж точно не стоит гордиться применением auto_ptr, как сделал anatolix
A>>чтоб два раза не вставать, может у тебя гдето и gotocomefrom оправдано? NB>естественно. применение goto в чистых сях вполне оправдано.
угу, только применение Си не оправдано. NB>что такое comefrom я не совсем понял. это что-то личное, да? http://en.wikipedia.org/wiki/COMEFROM
A>>в какой еще пример? и что не так с бустом? может еще и с stdlib что-то не так? NB>мда.
что "мда"?
A>>>>люди, которые не в курсе современного состояния языка вполне заслуживают наездов. NB>>>вы знакомы лично? NB>>>добавь побольше пафоса, это всегда помогает. A>>а что, надо быть знакомым лично, чтобы кого-то критиковать? NB>чтобы делать выводы о том, что кто-то чего то не знает, было бы не плохо иметь на руках какие-то подтверждения этому. NB>без этого ты выставляешь себя обычным пустозвоном. ничего личного, но со стороны это выглядит не очень красиво.
код в той статье на хабре вполне себе является подтверждением. комментарий про auto_ptr тоже.
S>>Излишнее увлечение этой всякой ооп-фигней, извините MTD>Его код читать можно спокойно и развивать, а вот твой, без обид, на выброс.
Ммм... ну как вариант На выброс потому что он не работает... Вот я его подлатаю, и тогда уххх...
На самом деле жалею что выложил неработоспособный код — надо было проверить вначала тщательней.
Дуракам не показывают половину работы, но конкретно в этом случае дурак я.
Здравствуйте, Abyx, Вы писали:
NB>>>>и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано. A>>>о как. это какой такой конкретный код? покажи.
NB>>здесь
A>и чем именно там оправдано применение auto_ptr? A>тем что в 2013 году код писался на языке 98года? или тем что #include <boost/scoped_ptr.hpp> не написать?
ответ очевиден
тем что результат работает на любом компиляторе и не требует установки левых библиотек.
A>>>чтоб два раза не вставать, может у тебя гдето и gotocomefrom оправдано? NB>>естественно. применение goto в чистых сях вполне оправдано. A>угу, только применение Си не оправдано.
A>>>в какой еще пример? и что не так с бустом? может еще и с stdlib что-то не так? NB>>мда. A>что "мда"?
это довольно показательно. сначала наговорить ерунды, а потом выяснять, что же это мы обсуждаем
A>>>>>люди, которые не в курсе современного состояния языка вполне заслуживают наездов. NB>>>>вы знакомы лично? NB>>>>добавь побольше пафоса, это всегда помогает. A>>>а что, надо быть знакомым лично, чтобы кого-то критиковать? NB>>чтобы делать выводы о том, что кто-то чего то не знает, было бы не плохо иметь на руках какие-то подтверждения этому. NB>>без этого ты выставляешь себя обычным пустозвоном. ничего личного, но со стороны это выглядит не очень красиво. A>код в той статье на хабре вполне себе является подтверждением. комментарий про auto_ptr тоже.
Здравствуйте, Abyx, Вы писали:
NB>>>>и? есть конкретный код, иcпользование auto_ptr в котором вполне оправдано. A>>>о как. это какой такой конкретный код? покажи.
NB>>здесь
A>и чем именно там оправдано применение auto_ptr? A>тем что в 2013 году код писался на языке 98года? или тем что #include <boost/scoped_ptr.hpp> не написать?
Ну например, тем, что auto_ptr будет компиляться в любой Студии, хоть в VS6. Если понимаешь, как он работает, то никаких проблем он не доставляет.
Кстати, твой вариант калькулятора я у себя собрать не смогу — мои работодатели все еще пользуются Студией 2008 (а код ТС — запросто).
Ни одна компания, в которой я работал, не горит желанием апгрейдить компилятор. Некоторые даже на VS2005 сидят.
Насчет буста — тоже. Только в одной компании его активно применяли.
В некоторых он был явно запрещен, как и любая сторонняя библиотека. И на это были основания. А в некоторых просто не нашел применения. А втаскивать тонну кода ради одного файла никто не станет.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Ну например, тем, что auto_ptr будет компиляться в любой Студии, хоть в VS6. Если понимаешь, как он работает, то никаких проблем он не доставляет. SVZ>Кстати, твой вариант калькулятора я у себя собрать не смогу — мои работодатели все еще пользуются Студией 2008 (а код ТС — запросто). SVZ>Ни одна компания, в которой я работал, не горит желанием апгрейдить компилятор. Некоторые даже на VS2005 сидят.
ну и что что кто-то сидит на VC6 ?
это не повод пропагандировать устаревшие технологии.
новые версии языка и компиляторов появляются не просто так. если кто-то думает что всё это не нужно — ну наверное это диагноз.
SVZ>Насчет буста — тоже. Только в одной компании его активно применяли. SVZ>В некоторых он был явно запрещен, как и любая сторонняя библиотека. И на это были основания. А в некоторых просто не нашел применения. А втаскивать тонну кода ради одного файла никто не станет.
ага, а где-то запрещена стандартная библиотека. и тоже кто-то думает что на это есть основания.