Как стать автором
Обновить

Комментарии 19

Я бы добавил более четкую (как в оригинале) формулировку:
You have to produce the following output by appropriately instantiating the available classes: «Never send a human to do a machine's job.»

Выведите следующую фразу путем инстанцирования имеющихся классов: «Never send a human to do a machine's job.»
«Имеющихся» звучит коряво. Надо было писать «доступных».
исправил формулировку задания + добавил по исправлению комментарий UPD 1.
ээх не сыпь мне соль на рану…
сегодня как раз не сдал экзамен по С#.NET
попробую в качестве подготовки порешать
Головоломка интересная, спасибо. С интересом отвлёкся на 5 минут :)

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

PS: ещё раз спасибо за задачку. Моя версия решения тут – snipt.org/tyj, но она уже как-то не оченб подходит под условие. Только инстанциированием имеющихся классов, я не знаю как вывести слово job.
про «Только инстанциированием имеющихся классов, я не знаю как вывести слово job.» свою точку зрения я высказал в UPD1, хотя я не авторитетен.
да и задачка это не для собеседований — а исключительно for fun. на собеседованиях считаю аналогично — правильнее и лучше поговорить о прошлой работе, о будущей работе, о привычках, увлечениях…
for fun конечно, про собеседование это я задумался о своём, очитался и дальше как обычно бывает :)
Не согласен с вами. На собеседовании нужно сделать все, чтобы в сжатое время понять, умеет ли кандидат использовать межушный нервный узел или просто катится по накатанной дорожке. Quiz'ы хороши для выявления не «рабочих лошадок», а потенциальных звезд — люди, которые умеют нестандартно мыслить нужны далеко не любой компании, но иногда без них нельзя.
палка о двух концах. не факт ведь, что Фаулер отлично решает quiz'ы, но ценность его как члена команды переоценить нельзя. с другой стороны — quiz это быстрый способ понять, насколько быстро человек умеет решать нестандартные задания.
так или иначе — я всё таки настаиваю на индивидуальном подходе и не согласен с quiz'ами в роли панацеи.
Безусловно — квизы ни разу не панацея, а всего лишь способ выявить индивидуалов с некоторыми вполне определенными характеристиками. Так что — индивидуальный подход по-прежнему рулит.
Мне кажется, в этой постановке задача не может быть решена. В пользу этого говорит и то, что ни в одном конструкторе ни одного класса не вызывается метод Print — тогда его невозможно вызвать только инстанцированием. Получается, что либо «Print не нужен» (тогда невозможно вывести все, что нужно), либо условие неверно.

И оно таки неверно, потому что в блоге автора задачи (судя по нику) она сформулирована так:
You have the following classes which MUST NOT be modified. In the main method of the class AgentSmith, produce the output «Never send a human to do a machine's job.» by instantiating or invoking the available methods of the given classes.

Получается, что можно грабить корованывызывать методы классов. Тогда задача превращается в задачку и решается так, как предлагает SpeCT тут.

Я, собственно, решил ее практически так же, допустив, что можно вызывать методы данных классов, а потом решил поискать решение в точной формулировке. Которая оказалась неверной.
не вчитываясь (чтобы не испортить личное решение) — оценил решение от SpeCT. действительно, как-то поразительно мало строк. хмхм
Но оно правильное. Правда, я решил чуть-чуть по-своему.
Забыл решение: snipt.org/tLg
Более того, в моем решении еще на строчку меньше. Правда, оно отличается от решения SpeCT лишь тем, что у меня две последние строчки объеденены.
for(int i=0; i<100; ++i) Console.Write(«I will never overload virtual methods. „);
Спасибо за задачку, вспомнил C#, решение получилось схожим, но более лаконичным.
snipt.org/tPo
Эта задача интересна не только для новчиков.

Если понять именно смысл фразы «Never send a human to do a machine's job», внимательно посмотреть на код и увидеть что метод Print не вызывается из констраутора, то можно сделать вывод, что решение данной задачи нужно можно автоматизировать.

Алгоритм действуют следующим образом:
1. Получаем все публичные и не абстрактные классы в нашей сборке.
2. Создаем экзмепляр каждого класса, при этом сохраняя результат выводимый в консоль.
3. Для каждого экземпляра вызываем функцию Print и записываем результат.
3(а) Для каждого экземпляра получаем все интерфейсы. Вызываем функцию Print для каждого интерфейса (приводим экземпляр к интерфейсу и вызываем метод).
3(б) Для каждого экземпляра получаем все унаследованные классы. Вызываем функцию Print для каждого унаследованного класса.
4. Кушаем фразу приоритетно выбирая те действия которые приводят к созданию экземпляра класса.

Несколько замечаний:
Используется определенная структура данных содержащая:
-Код (пример Finished finished = new Finished(); или finished.Print();)
-Результат (пример 'human ')
-Требующаяся переменная (пример finished)
-Создаваемая перменная (пример finished)

Так как первый класс, чей экземпляр создается, вызывает статические конструкторы, то необходимо вызвать этот алгоритм четыре раза (в разных доменах) — создавая первым каждый из четырех классов. (Но я это не делал, так как мне повзело! Функция GetTypes() возвращает типы сортированные по алфавиту, т.е. Derived идет первым :) )

Алгоритм дал следующий результат:
Derived derived = new Derived(); // Never send a
Finished finished = new Finished(); // human
((Base)derived).Print(); // to
MoreDerived morederived = new MoreDerived(); // do
((IWord)morederived).Print(); // a
morederived.Print(); // mach
MoreDerived2 morederived2 = new MoreDerived2(); // ine's
((IWord2)morederived2).Print(); // job.

Исходники:
snipt.org/tQg

Да, я понимаю что лучше знать об ООП и просто подумать головой. Но мы же не ищем легких путей ;)
по сути получилось то же самое

new Derived(); // never send a
new Finished().Print(); // human to

MoreDerived mach = new MoreDerived(); // do
((IWord)mach).Print(); // a
mach.Print(); // mach

MoreDerived2 ine = new MoreDerived2(); // ine's
((IWord)ine).Print(); // job
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории