Тесты для программистов

Книга Чарльза Уэзерелла "Этюды для программистов" - неисчерпаемый источник для тестов.

Статья в википедии с примерами. Решения для Transact SQL и ANSI SQL.

Вот более формальное описание задачки из книги Чарльза Уэзерелла "Этюды для программистов".

Познай самого себя, или... ПРОГРАММА, ПЕЧАТАЮЩАЯ СОБСТВЕННЫЙ ИСХОДНЫЙ ТЕКСТ

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

Тема. Напишите программу, печатающую копию собственного исходного текста. Вывод не должен содержать «управляющих» карт или другой информации, зависящей от системы. Печатается только то, что перфорируется для компилятора. Однако ваша программа ничего не должна вводить; ей не следует опираться на системные «штучки», например на знание того, что конкретный компилятор оставляет копию исходной программы в непомеченном COMMON-блоке. Проследите, чтобы программа давала одинаковый результат независимо от места и времени выполнения. Указания исполнителю. Не поддавайтесь отчаянию и страху, даже если тринадцатая попытка оказалась неудачной! Подобные программы называются интроспективными, и существует теорема, в которой утверждается, что интроспективную программу можно написать на любом «достаточно мощном» языке. Все обычные языки программирования — достаточно мощные. Для решения требуется лишь взглянуть на язык под соответствующим углом зрения. Программа, вероятно, займет не более 30—40 строк.

Инструментовка. Годится любой язык.

Длительность исполнения. Одному исполнителю на 1 неделю.

Литература
Брэтли, Милло (Bratley P., Millo J.). Computer Recreations Self-Reproducing Automata. Software — Practice and Experience, 2, pp. 397—400, 1972. Эту статью нужно читать только в крайнем случае, поскольку в ней представлено полное решение задачи.
Роджерс (Rogers H., Jr.). Theory of Recursive Functions and Effective Computability. McGraw-Hill, New York, NY, 1972. [Имеется перевод: Роджерс X. Теория рекурсивных -функций и эффективная вычислимость. — М.: Мир, 1972.] Чтение этого превосходного введения в теорию рекурсивных функций требует усердия, но вы будете вознаграждены полнотой и ясностью полученной картины. Главы 1—3 образуют достаточный фундамент; результаты об интроспекции содержатся в параграфах 11.1, 11.2 и 11.4.

Комментарии

Совершенно не годится длоя теста

Уж эта задача никак не поможет выяснить, мыслит чел, или нет. К тому же, это скорее тест на алгоритмиста, на программиста чуть ли не противоположные должны быть.

Изображение пользователя st.

Всё наоборот

Всё наоборот. Годится для теста программиста. Инженера-программиста. Но не годится для кодировщика. Техника-программиста.

Ошибаетесь!

Мой друг и напарник - программист ФАНТАСТИЧЕСКОЙ силы! Я по сравнению с ним - щенок. Но я сильнее его как алгоритмист. Так вот: это тест ДЛЯ МЕНЯ, но не ДЛЯ НЕГО. Я имею в виду тесты для профессионалов, а не для быдлокодеров - здесь я ничего не соображаю.

Я не спорю, но...

Юра (тот самый мой друг) тоже прекрасный алгоритмист (да и я не последний программист), но я НИКОГДА не стану таким супером, как он в программировании, а он не догонит меня в алгоритмах. Это черты характера, по которым мы чуть ли не антиподы. Я убежден, что элитный программист не может быть элитным же алгоритмистом (и наоборот).

Изображение пользователя st.

Это специализация

Это специализация
Программист минус алгоритмизация = кодировщик
Программист минус кодирование = постановщик задачи
Программист = алгоритмизация и кодирование

Прелестно!

Мне понравилось. Консенсус! Точнее, признаю Вашу правоту.

Изображение пользователя Alexey_Donskoy.

Ах, были

Ах, были времена весёлые! ;)
В 1987 году у нас на олимпиаде профессиональных программистов (ещё облсовпроф проводил) была такая задача...
Я представил решение на PL/1 с substr'ами, как в Википедии. А заодно, практически для хохмы, ещё на парочке интерпретаторов (Фокал и другие языки Диамсового семейства: "1.1 w", ну и Бейсик с "1 list" :) ).
Это была первая (насколько знаю) и последняя олимпиада (потому что универ не оставил ни одного призового места программистской конторе, на базе которой и проводилась олимпиада) ;)

Не знаю, как сейчас, но тогда задача выглядела совсем нетривиальной, и вполне олимпиадной. И вполне программистской, имхо :) Тут вам не кнопочки по формочке раскидывать!

Времена-то веселые были...

Я тоже когда-то представил свое (довольно корявое) решение, и даже получил на него восторженные отзывы, но теперь... Цитата: Это стандартная задачка для олимпиады по программированию: Для языка C

char*a="char*a=%c%s%c;main(){printf(a,34,a,34);}";main(){printf(a,34,a,34);}