Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  00:01[Войти] | [Зарегистрироваться]
Ответ на вопрос № 35202

Головоломки и алгоритмические задачки | 01-09-2005 01:27
Жители! Вам надоели простые вопросы? А слабо написать функцию, которая выводит сама себя? Хоть куда, хоть в showmessage, хоть в мемо, хоть в stdout... Я знаю, что на с++, такая есть... А вот возможно ли такое на паскале? Если, нет, то докажите :)

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

22-12-2009 06:22 | Комментарий к предыдущим ответам
>>> задача не такая уже и неразрешимая, если перед компиляцией исходный код будет обрабатывать специальный (какой-то) препроцессор (примерно как в С++)
Я, конечно, понимаю, что прочитывать целиеком тему на 125 сообщений лениво, а ответить хочется. Однако, если бы Вы тему все же прочитали, то увидели бы, что задача не такая уж и неразрешимая, даже если перед компиляцией НЕ обрабатывать код никаким препроцессором ;-)

>>> Мое пердыдущее сообщение должно было быть помечено как Ответ
В головоломках приянто помечать сообщения как комментарии. Часто так бывает, что головоломка выросла из прикладного вопроса конкретного человека. Человек нужный ему ответ уже получил, а письма все идут и идут, так как головоломки ,зачастую, -- вещь долгоживущая.

22-12-2009 04:22 | Комментарий к предыдущим ответам
Мое пердыдущее сообщение должно было быть помечено как Ответ

22-12-2009 04:21 | Сообщение от автора вопроса
ИМХО, задача не такая уже и неразрешимая, если перед компиляцией исходный код будет обрабатывать специальный (какой-то) препроцессор (примерно как в С++), генерируя новый исходник путем замены специальных конструкций на соответствующие строковые константы-фрагменты кода, и подсовывая сгенерированный исходник компилятору

25-04-2007 13:27 | Комментарий к предыдущим ответам
Извините, опечатка: не "бесконечность", а "минус бесконечность"

25-04-2007 13:24 | Комментарий к предыдущим ответам
to  Антон Григорьев, Михаил Комин:
К вопросу о 3-х рыбаках и минус двух рыбах:
может быть я чего-то недопонял, но бесконечность ведь меньше чем минус 2?! Тогда ответ "-2" не соответствует условию: "какое минимальное количество рыбы могло быть у рыбаков". Правильный ответ должен быть: 25.

24-04-2007 10:38 | Комментарий к предыдущим ответам
Настоящий программист может сделать, любую(возможную) программу, какую захочет. А у вас разве не всегда так?

24-04-2007 09:31 | Комментарий к предыдущим ответам
>>> Уже хочу!!! :-D

Представим себе класс, содержащий собственные исходники... Self.Sourse, так сказать...

// Fisher спешно наливает из графина всем присутствующим...



24-04-2007 01:44 | Комментарий к предыдущим ответам
>>> Значит, для решения поставленной задачи программистам достаточно захотеть распечатать собственные исходники ;-)
Уже хочу!!! :-D

24-04-2007 01:28 | Комментарий к предыдущим ответам
>>> Но программа то делает то, что хотели сами программисты

Значит, для решения поставленной задачи программистам достаточно захотеть распечатать собственные исходники ;-)

23-04-2007 23:43 | Комментарий к предыдущим ответам
2 Yashin:
Но программа то делает то, что хотели сами программисты.
Ага. Т.е. когда программа проигрывает гроссмейстеру, то она проигрывает только потому, что программисты так захотели. Когда выигрывает - то же самое.
Если Вы придерживаетесь такой точки зрения, попробуйте захотеть, чтобы Ваша программа выиграла у чемпиона мира по игре Го.

23-04-2007 09:52 | Комментарий к предыдущим ответам
>>> Программист не может написать свой собственный код, не анализируя себя
Я так и думал, что на самом деле, программист -- это специально разработанная Богом программа :-D

Ну, генетический код, сами понимаете.
Несостоятельный довод. Например, не думаю, что программисты Deep Blue или X3D Fritz могли бы выиграть у Каспарова. А их программы выиграли.
Но программа то делает то, что хотели сами программисты.

23-04-2007 01:24 | Комментарий к предыдущим ответам
to Yashin:
Такое ощущение, что здесь в стан критиков попали исключительно какие-то философы (схоласты). Но ни одного самого задрипанного физика. Физики, те все же идут от эксперимента. И если есть эксперимент, то он является аксиомой.

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

А так... смотреть на белую лошадь и утверждать, что белых лошадей не существует, это как-то... того ;-)

На правах шутки:
>>> Программист не может написать свой собственный код, не анализируя себя
Я так и думал, что на самом деле, программист -- это специально разработанная Богом программа :-D

23-04-2007 01:04 | Комментарий к предыдущим ответам
>>> А программа не может сделать того, что не может сделать сам программист.

Несостоятельный довод. Например, не думаю, что программисты Deep Blue или X3D Fritz могли бы выиграть у Каспарова. А их программы выиграли.

22-04-2007 23:58 | Комментарий к предыдущим ответам
2 Yashin:
Это вообще невозможно.
Значит Geo сделал невозможное (см. пост 08-12-2006 08:32). Не забудьте его поздравить с этим.

22-04-2007 12:36 | Комментарий к предыдущим ответам
Это вообще невозможно. Программист не может написать свой собственный код, не анализируя себя. А программа не может сделать того, что не может сделать сам программист.

16-04-2007 14:15 | Комментарий к предыдущим ответам
2 Geo & Сергей Перовский
Спасибо!
ушел в туман, побитый монстрами программирования, доучивать матчасть...

16-04-2007 09:31 | Комментарий к предыдущим ответам
>>>Не скопирует (из констант), а именно создаст - т.е. сформирует на основе логических действий.
Сформирует из чего?
Вы внимательно посмотрите на приведенные решения - все это комбинации этих подходов: формирование из набора констант путем их многократного использования. Этим путем достаточно просто решается эта задача практически на любом языке. В том числе на ассемблере и прямо в машинных кодах. Как и в других случаях, трудоемкость при переходе на ассемблер будет резко возрастать. Поэтому никто в здравом уме не будет решать эту учебную задачку на ассемблере или с описанием всех используемых стандартных процедур на языке высокого уровня.
Но идея повторного использования нескольких строковых констант для формирования текста достаточно хорошо показана на приведенных примерах, с ее помощью Вы можете решить эту задачку с учетом всех ограничений, которые придумаете. Попробуйте и убедитесь, что подход работает. Это гораздо полезнее, чем пытаться доказать невозможность при помощи сомнительных рассуждений.

15-04-2007 15:51 | Комментарий к предыдущим ответам
>>> Под внешними функциями подразумеваются функции, определенные в файлах (включенных в раздел uses или подключенных в качестве библиотек), ссылки на которые содержатся в исходном коде программы, но которые программист сам не писал.
Вообще-то уже начинает надодать. В моем ответе за 08-12-2006 08:32 приведен пример функции, которая выводит свой собственный текст, при этлм не используя ни функции, определенные в модулях, подключенных через USES, ни, тем более, функции из DLL (так как написана и отлажена на TP 6.0 под DOS, где не было DLL).

14-04-2007 13:17 | Комментарий к предыдущим ответам
Как я понимаю, из всех возможных источников получения выводимого кода программы остался только алгоритмический (получение данных из констант невозможно, а обращение к внешним источникам запрещено условием).

Следовательно, нужно написать алгоритм, который создаст алгоритм. Не скопирует (из констант), а именно создаст - т.е. сформирует на основе логических действий. Эти действия должны быть заложены в исходном алгоритме, включая синтаксис и семантику языка (иначе как этот алгоритм узнает, как нужно формировать выводимый код, включая такие единицы языка, как "function, begin, :=" и т.д.?).

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

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

Иначе говоря: чтобы сформировать программный текст алгоритмическими средствами, необходимо в этом же тексте (а больше и негде!) указать правила его формирования. Поскольку эти правила также являются текстом, то и для их формирования нужен текст, для которого, в свою очередь... и т.д.

Если признать бесконечную рекурсию допустимым ограничением, то придется согласиться, что алгоритмический способ формирования полного (да-да!) исходного кода невозможен. А других способов нет.

Вот такие размышления на ночь глядя...

14-04-2007 06:47 | Комментарий к предыдущим ответам
2 Fisher

Полностью согласен. Поскольку для использования команды Writeln программисту нет необходимости обращаться ко внешним файлам (включать в раздел uses или подключать библиотеку), то, конечно, команду Writeln следует считать встроенной командой языка.

Под внешними функциями подразумеваются функции, определенные в файлах (включенных в раздел uses или подключенных в качестве библиотек), ссылки на которые содержатся в исходном коде программы, но которые программист сам не писал.

14-04-2007 01:08 | Комментарий к предыдущим ответам
Здесь не имеются в виду встроенные команды языка.

Что такое "встроенная команда языка"? writeln - это встроенная команда?

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

И если Никлаус Вирт когда-то определил, что вывод в Pascal осуществляется абстрактной командой writeln, то так тому и быть, независимо от того, куда она выводит - на телевизор, принтер или перфоратор, какие аппаратные средства она активизирует, и какой программный код задействует. Это встроенная команда языка.

В противном случае можно прийти к выводу, что если компилятор pascal написан на C или ассемблере, то writeln - встроенная команда, а если Delphi написана на Delphi - то не встроенная. Но это же абсурд.

13-04-2007 12:45 | Комментарий к предыдущим ответам
Я по-прежнему настаиваю, что программа должна выводить исходный код всех используемых в программе функций, включая функции вывода.
Здесь не имеются в виду встроенные команды языка.

13-04-2007 12:35 | Комментарий к предыдущим ответам
2 всем

Прошу прощения за долгий уход "в себя", бросив вам на растерзание свое "доказательство" и оставив без ответа ваши комментарии. Доказательство мне самому не нравится, а усовершенствовать его не удалось.

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

Если вы имеете в виду примеры "доказатель теорем, мастер написания программ, генератор кода" и т.п., то это не пример программы, а обощенное название программ, исходный код которых мне недоступен, вследствие чего я не могу судить о ценности приведенных "примеров".

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

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

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

Остальные решения я лично считаю неверными.

01-04-2007 12:33 | Комментарий к предыдущим ответам
Даже если я сделаю это, остается вопрос о том, ОТКУДА брать этот самый текст программы - см. последнюю версию доказательства.
Вы пытаетесь доказать, что Солнце не может каждый день появляться на востоке и садиться на западе?
Вам уже дали текст программы.

31-03-2007 09:41 | Комментарий к предыдущим ответам
Ну дак кто-то уже что-то работающее напишет?
Хоть дизассемблер, или мой вариант.

31-03-2007 08:39 | Комментарий к предыдущим ответам
Честно говоря, начинает уже надоредать. Когда мы путем, вроде бы, правильных умозаключений получаем вывод, который проитиворечит фактам, то это называется софизм. В детстве было интересно искать ошибку в умозаключениях, сейчас как-то уже не очень интересно.

to beaver:
Ваше доказательство является типичным софизмом, так как примеров работающих программ в данной теме приведено предостаточно. Вы по прежнему обучаетесь логике таким странным способом или пытаетесь всерьез что-то доказать?

>>> 1. Формирование текста Кода Программой на основании логических операций (вычислений), предусмотренных алгоритмом, описанным в Коде, невозможно  — в этом случае имело бы место создание Кода Программой без участия Программиста.
В этом утверждении содержится ошибка, так как Программист может разработать программу, которая разрабатывает вторую программу. Автором и первой, и второй программы является программист. Но первую он пишет руками, а вторую получает с помощью разработанной им программы.

31-03-2007 06:31 | Комментарий к предыдущим ответам
У меня появилась маленькая идея, как создать программу которая пишет программы.
1)Программа имеет некоторый список команд, из которых состоит сама, но не в прямой последовательности, а расположенных случайным образом.
2)составляет из них код, посылает компилятору, если есть ошибка, производит отладку, переставляет строки и снова пытается компилить.И так далее, пока не получается что-то рабочее.
3)Затем запускается программа-потомок, которая делает тоже самое, и выводит свой код.

30-03-2007 16:15 | Комментарий к предыдущим ответам
2 panda

введите такую команду языка вместо функции, и текст программы станет полным.

Даже если я сделаю это, остается вопрос о том, ОТКУДА брать этот самый текст программы - см. последнюю версию доказательства.

30-03-2007 16:12 | Комментарий к предыдущим ответам
и еще 2 Fisher

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

30-03-2007 16:06 | Комментарий к предыдущим ответам
По просьбе Fisher публикую последнюю версию доказательства - оно претерпело заметный апгрейд ;)

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

Условия
Условие 1. Описываемая Программа должна обладать функцией визуального вывода полного исходного Кода, использованного при ее создании.
Условие 2. Описываемой Программе запрещено получать данные из внешних источников.

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

Доказательство
1. Формирование текста Кода Программой на основании логических операций (вычислений), предусмотренных алгоритмом, описанным в Коде, невозможно  — в этом случае имело бы место создание Кода Программой без участия Программиста. Такое создание невозможно, т.к. процесс создания предусматривает выполнение случайных действий, результат которых предсказать в 100% случаев невозможно. Описываемая Программа должна в 100% случаев своей работы создавать требуемый (всегда одинаковый) код. Следовательно, создание Кода описываемой Программы возможно только Программистом либо другой программой.

2. Исходный код Программы нельзя сохранить в Коде в виде констант, т.к. присвоение значений константам потребует написания/генерирования дополнительного кода, не содержащегося в коде, подлежащем выводу.

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

30-03-2007 15:38 | Комментарий к предыдущим ответам
2 Сергей Перовский

Допустим, что программа умеет генерировать некоторый алгоритм (Алгоритм2) и соответствующий код без участия человека, основываясь исключительно на некотором количестве констант и логике, заложенной в ее алгоритм (Алгоритм1).

Случай А. Если создатель программы (т.е. тот, кто создал Алгоритм1 = человек-программист) точно знает, каким будет Алгоритм2, то имеет место создание Алгоритма2 посредством Алгоритма1 человеком, т.к. этот человек выполнил свою задачу по созданию Алгоритма2, используя при этом Алгоритм1.

Случай Б. Если создатель программы не знает, каким будет Алгоритм2, то имеет место создание Алгоритма2 Алгоритмом1 (человек не участвует).

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

Например, если я не знаю, как испечь хлеб (но хочу это узнать), я могу сделать 1 из 3:
1. Спросить того, кто знает, как печь, и стать обладателем этого знания, сразу получив в готовом виде полный его объем (это не создание, т.к. полный объем знаний получен из внешнего источника - это копирование).
2. Спросить у того, кто знает, как замесить тесто, потом спросить другого, кто знает, как приготовить противень, и самому догадаться, как засунуть противень в печь (это создание, т.к. часть знания получена без обращения ко внешним источникам).
3. Никого не спрашивать и самому методом проб и ошибок найти способ приготовления хлеба (это создание алгоритма).

Если субъектом создания является Алгоритм1, то в Случае А имеет место получение всех знаний Алгоритмом1 от человека для создания Алгоритма2. У Алгоритма1 нет возможности создать даже часть Алгоритма2 в результате проб и ошибок - вся программа действий по созданию Алгоритма2 передана ему человеком. Это аналогично пункту 1 в примере с хлебом и созданием не является.

Если имеет место Случай Б, то Алгоритм1 получает от человека только часть знаний о процессе изготовления Алгоритма2, остальное получает в результате случайно сгенерированных действий (т.е. методом проб и ошибок). Т.е. часть или все знания о процессе изготовления Алгоритма2 получены Алгоритмом1 без обращения к внешним источникам. Это есть создание.

Таким образом, если мы хотим, чтобы программа сама ВСЕГДА создавала только свой собственный алгоритм (и соответствующий ему код), программист должен сразу передать ей все знания по созданию алгоритма, подлежащего выводу программой. При этом программа не должна иметь возможности пытаться получить даже часть знаний по созданию кода выводимого алгоритма методом проб и ошибок, т.к. в результате таких действий может получиться алгоритм (и, следовательно, код), не соответствующий алгоритму (и коду) создающей программы. А нам случайности не нужны, нам в 100% случаев нужен ТОЛЬКО алгоритм и код ЭТОЙ программы и никакой самодеятельности, ибо результат случайных действий непредсказуем! Если же предварительно ограничить диапазон возможных результатов случайных действий Алгоритма1 по созданию Алгоритма2 жесткими рамками, опять-таки будет иметь место передача полных знаний человеком Алгоритму1.

Вывод: создание одного алгоритма другим алгоритмом возможно. Невозможно лишь создание одним алгоритмом другого алгоритма, полностью ему идентичного, в 100% случаев работы исходного алгоритма (т.е. такого алгоритма, который необходим нашей программе, выводящей собственный исходный код).

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

30-03-2007 04:51 | Комментарий к предыдущим ответам
>>>Да, спор об этой аксиоме сводится к тому, может ли машина мыслить.
Тогда Вам на базарную площадь в ветку о информационных полях :)
Там обсуждаются вопросы о происхождении и уникальности человека, мне они уже изрядно надоели.
Как только от абстрактных терминов "творчество", "мышление" Вы перейдете к конкретным задачам, так выяснится, что ни в одном случае нет принципиальных ограничений на решение задачи при помощи компьютеров сейчас или в будущем.

Генетические алгоритмы, это алгоритмы создающие методом проб и отбора АЛГОРИТМЫ для решения некоторых задач.

Доказатели теорем, это алгоритмы, результатом деятельности которых является ПОСЛЕДОВАТЕЛЬНОСТЬ логических выводов приводящая от аксиом к заданному (или не заданному!) утверждению. Доказательство является частным случаем алгоритма.

Вы утверждали, что алгоритм не может порождать другие алгоритмы, поэтому я и привел эти примеры.

30-03-2007 04:31 | Комментарий к предыдущим ответам
2 Fisher: мыси )

29-03-2007 23:47 | Комментарий к предыдущим ответам
>>> Предлагаю генераторы кода уравнять с редакторами исходного кода и считать средством облегчения человеческого труда в деле создания программы.

Что следует из понятия  "Приравнивания к редактору"? Среда Delphi, как известно, написана на Delphi. Почему бы некоему генератору кода не заняться генерацией собственного кода?

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

В константах - не может, а в выражениях - запросто. Ведь выражения могут ссылаться на константы и другие выражения по много раз. А ведь есть еще и операторы...

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

Если хотите продолжить разговор - приведите текущую версию доказательства с учетом всех изменений "генеральной линии партии". А то трудновато следить за течением Вашей мыслии по древу ;-)

29-03-2007 23:05 | Комментарий к предыдущим ответам
Кстати, если вы согласны, предлагаю обсуждать доказательство.
Вам привели пример программы, которая "печатает" сама себя. Вы стали утверждать, что приведен не полный текст программы (без функций ShowMessage/Writeln). Я Вам говорю, введите такую команду языка вместо функции, и текст программы станет полным.
Что тут еще обсуждать?

29-03-2007 14:39 | Комментарий к предыдущим ответам
2 Сергей Перовский

1. Вы будете смеяться, но генетические алгоритмы реализуются именно на электронно-вычислительных машинах(в том числе и на ПК) :)

Речь не о том, где алгоритмы используются, а кто (или что) их создает. См. текст доказательства.

2. А Google уже отменили?

Очень жаль, что у вас не было времени хотя бы вкратце пояснить, что такое доказатели теорем (как минимум в вашем понимании), иначе у каждого из нас может оказаться различное представление о том, что мы обсуждаем. Если я правильно понимаю, доказатели используются для доказательства верности заданных равенств или неравенств (или их систем), тождество которых необходимо подтвердить либо опровергнуть, так? Если да, то покажите, пожалуйста, каким образом эта способность доказателя может привести к созданию кода (без участия человека), компиляция/интерпретация которого может привести к созданию самостоятельной программы. Прошу учесть, что, если доказатель используется человеком (!) в качестве средства облегчения генерирования исходного кода итоговой программы, то изначальным создателем такого кода следует все-таки считать человека, т.к. он принимает решение, какую теорему (проблему) должен решить доказатель, чтобы выдать в результате нужный человеку код. Да, спор об этой аксиоме сводится к тому, может ли машина мыслить. Если есть сомнения в верности этой логической константы, то давайте определимся, может ли машина мыслить. Какие есть мнения?

3. Интересно, если дочь будет точной копией матери, это не будет рождение?

3.1. Мы не говорили о рождении, мы говорили о создании и копировании.
3.2. Прошу подтвердить, считаете ли вы, что полное копирование алгоритма - это равносильно созданию алгоритма. Да или нет.
3.3. Какой именно пункт доказательства вы пытаетесь оспорить, задавая этот вопрос?

29-03-2007 14:11 | Комментарий к предыдущим ответам
2 Fisher

1. Любой мастер написания программ, где после размышлений юзера с мышкой выдается работоспособный программный код, реализующий алгоритмы, которые юзеру и вовсе неизвестны.

Программисту на Object Pascal вряд ли известны (и даже если известны, то что с того?) алгоритмы преобразования команд языка высокого уровня в инструкции процессора. Тем не менее никто не называет среду разработки приложений Delphi генератором кода. Здесь каждый считает себя творцом, бросая кнопки на форму. Предлагаю генераторы кода уравнять с редакторами исходного кода и считать средством облегчения человеческого труда в деле создания программы. Степень облегчения, конечно, различна, но это непринципиально, на мой взгляд. В конечно счете не генератор кода принимает решение (т.е. определяет алгоритм - последовательность действий), что должна делать итоговая программа, а человек.

2. Определение философского понятия объекта - в студию! С четким пояснением, почему, собственно, он не сможет быть частью себя?

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

3. Вы не ответили на мой вопрос "Что такое пустая программа в вашем понимании".

29-03-2007 13:56 | Комментарий к предыдущим ответам
2 panda

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

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

Не вижу связи между цитатой из моего поста и вашим рассуждением. Я прокомментировал взаимоотношения между программой и компилятором, а вы это непонятным образом связываете с использованием функции writeln. Может, я не владею какими-то фактами, которые позволяют эти два высказывания связать друг с другом?

Кстати, если вы согласны, предлагаю обсуждать доказательство. Если мы обсуждаем доказательство, прошу приводить свои доводы относительно конкретных положений этого доказательства, а не относительно доказательства в целом ("ваше доказательство рассыплется"), иначе мне непонятно, что именно в нем вы подвергаете критике или сомнению. Как уже говорил, я не хочу кого-то обидеть, просто интересно, насколько это доказательство жизнеспособно и получится ли у меня убедить вас в его корректности. Постараюсь продолжать в том же духе :)

27-03-2007 06:14 | Комментарий к предыдущим ответам
>>>Смотри, например, генетические алгоритмы.
>>>Я думаю, не стоит придираться к словам - и так понятно, что имеется в виду только алгоритм приложения для электронно-вычислительной машины, в народе именуемой ПК. А то мы так доберемся до алгоритма вызова духов в шаманских ритуалах.
Вы будете смеяться, но генетические алгоритмы реализуются именно на электронно-вычислительных машинах(в том числе и на ПК) :)
>>>Или доказатели теорем.
>>>Поясни, пожалуйста, что такое доказатели теорем и как они действуют?
А Google уже отменили?
Посмотрите хотя бы в Википедии "генетические алгоритмы", "доказатели теорем", "экспертные системы". Многое прояснится.
А то мы скатываемся к филосовскому спору "может ли машина мыслить". 


>>>Пораждаемый алгоритм должен совпадать с пораждающим.
>>>Это не создание, а копирование. Разницу, я думаю, объяснять не нужно.
Интересно, если дочь будет точной копией матери, это не будет рождение?

27-03-2007 02:34 | Комментарий к предыдущим ответам
>>> Что конкретно ты понимаешь под генератором кода, поясни, пожалуйста, как можно боле точно.

Любой мастер написания программ, где после размышлений юзера с мышкой выдается работоспособный программный код, реализующий алгоритмы, которые юзеру и вовсе неизвестны. Яркий, хотя и древний пример - FoxGen, генерящий неплохие программы на языке FoxPro. Кстати, на FoxPro же и написанный.

>>> Под словом "объект" я имел в виду философское понятие объекта, а не понятие из области ООП.

Отето Вы попали. Определение философского понятия объекта - в студию! С четким пояснением, почему, собственно, он не сможет быть частью себя?

>>> Что такое "пустая программа"? .exe-файл размером в 0 байт? Если так, то у такой программы просто >>> нет необходимых средств для того, чтобы вывести даже ничто - ведь она пуста!

Вы уже противоречите сами себе. EXE-файл - это не программа в данном Вами определении. Это не последовательность команд, а некая оболочка вокруг них, предназначенная для загрузки последовательности команд в память. Имеет определенный формат. Иначе с чего бы все "программы" начинались с "MZ" ? ;-)

Строже надо быть в определениях, и все у Вас получится.

27-03-2007 00:07 | Комментарий к предыдущим ответам
2 beaver:
Компилятор не используется программой во время выполнения - программа является результатом его работы, а это не одно и то же.
Следовательно, достаточно в язык ввести команду (а НЕ библиотечную функцию) writeln и все Ваше доказательство рассыплется?

26-03-2007 12:40 | Комментарий к предыдущим ответам
Вызов стандартной процедуры - стандартная конструкция языка или его диалекта. ShowMessage(S) ничуть не менее стандартная для ObjectPascal конструкция чем if-then-else;
Предлагаю попробовать убрать из раздела uses слово Dialogs и сразу станет ясно, насколько неотъемлемой частью языка является функция ShowMessage()... Несмотря на это, if-then-else продолжают работать.

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

Или доказатели теорем.
Поясни, пожалуйста, что такое доказатели теорем и как они действуют?

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

пораждаемый алгоритм должен совпадать с пораждающим.
Это не создание, а копирование. Разницу, я думаю, объяснять не нужно. Достаточно сравнить Баха и Филиппа Киркорова.

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

26-03-2007 12:21 | Комментарий к предыдущим ответам
to Fisher

Что насчет генераторов кода?
Что конкретно ты понимаешь под генератором кода, поясни, пожалуйста, как можно боле точно.

Что насчет рекурсивных ссылок?
Под словом "объект" я имел в виду философское понятие объекта, а не понятие из области ООП.

что насчет пустой программы? Попробуйте применить теорему к ней.

Что такое "пустая программа"? .exe-файл размером в 0 байт? Если так, то у такой программы просто нет необходимых средств для того, чтобы вывести даже ничто - ведь она пуста!

26-03-2007 12:12 | Комментарий к предыдущим ответам
to panda

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

26-03-2007 10:51 | Комментарий к предыдущим ответам
>>>Если имеется в виду вывод программой собственного ПОЛНОГО исходного кода
Что понимать под ПОЛНЫМ исходным кодом - вопрос открытый.
В Фортране вся трансляция сводилась по существу к вызовам процедур, реализующих операторы. От этого операторы не перестали быть частью языка.
Вызов стандартной процедуры - стандартная конструкция языка или его диалекта.
ShowMessage(S) ничуть не менее стандартная для ObjectPascal конструкция чем if-then-else;

>>>Если есть случаи создания логики алгоритма не человеком...
Смотри, например, генетические алгоритмы.
Или доказатели теорем.
Почему Вы не можете представить себе алгоритм, результатом деятельности которого является алгоритм? Это очень частая ситуация.
В данном случае тонкость в том, что пораждаемый алгоритм должен совпадать с пораждающим. Но ничего заумного в этом нет: строительные блоки храняться в константах, которые многократно используются - за этот счет снимается кажущееся противоречие насчет целого и части.

26-03-2007 08:09 | Комментарий к предыдущим ответам
>>> А2. Алгоритм работы Программы создается только путем написания Кода Программистом

Что насчет генераторов кода?

>>> объект не может являться частью самого себя

Что насчет рекурсивных ссылок?

type TImpossible = class
  IAm: TImpossible;
end;



И наконец, позволю себе процитировать себя: что насчет пустой программы? Попробуйте применить теорему к ней.

26-03-2007 05:14 | Комментарий к предыдущим ответам
2 beaver:
Если имеется в виду вывод программой собственного ПОЛНОГО исходного кода (включая исходный код всех используемых и подключаемых функций и библиотек - см. Определения) без обращения к внешним источникам, прошу привести пример.
Что Вы предлагаете делать с компилятором? Его исходник тоже должен печататься? А откуда Вы его возьмете, если он защищен лицензией и легально Вам недоступен?

25-03-2007 12:58 | Комментарий к предыдущим ответам
to Сергей Перовский

>>>А2. Алгоритм работы Программы создается только путем написания Кода Программистом.

Из этой аксиомы прямо следует неразрешимость задачи, которая успешно решается. Вывод: аксиома не соответствует реальности.

1. Неразрешимость КАКОЙ задачи прямо следует из этой аксиомы? Если имеется в виду вывод программой собственного ПОЛНОГО исходного кода (включая исходный код всех используемых и подключаемых функций и библиотек - см. Определения) без обращения к внешним источникам, прошу привести пример.

2. Если есть случаи создания логики алгоритма не человеком (животным или машиной), прошу привести пример.

24-03-2007 10:02 | Комментарий к предыдущим ответам
>>>А2. Алгоритм работы Программы создается только путем написания Кода Программистом.
Из этой аксиомы прямо следует неразрешимость задачи, которая успешно решается. Вывод: аксиома не соответствует реальности.

24-03-2007 09:57 | Комментарий к предыдущим ответам
Это задача математическая и что-то это мне очень напоминает машины Тьюринга.
ЗЫ Очень стыдно, но напрочь забыл эту матчасть - на практике не сталкиваюсь.

24-03-2007 06:39 | Комментарий к предыдущим ответам
Мда, все-таки баг вкрался - поздно было...
Исправляю:

Определения
• Программа - это набор команд процессора (или среды выполнения - в случае с .NET или Java), записанных в виде набора байтов в исполняемом файле или библиотеке.
• Код - это содержимое текстового файла, используемого компилятором/интерпретатором для создания Программы в режиме разработки, а также исходный код, использованный для создания всех функций и библиотек, подключаемых к Программе в режиме выполнения.
• Программист - человек, создавший Код Программы.

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

Доказательство
1. Формирование текста Кода Программой на основании логических операций (вычислений), предусмотренных алгоритмом, описанным в Коде, невозможно  — в этом случае имело бы место создание Кода Программой, а это противоречит аксиоме А2, т.к. Программа не является Программистом.

2. Исходный код Программы нельзя сохранить в Коде в виде констант, т.к. объект не может являться частью самого себя (для этого он должен быть другим объектом, если, конечно, объект-контейнер допускает хранение внутри себя других объектов - в любом случае это нарушение условия задачи), если только кроме него самого в этом объекте больше ничего не содержится. Однако невозможно создать даже программу, Код которой содержит только (!) Код в виде константы и ничего больше, т.к. присвоение значений константам потребует написание дополнительного кода, в результате чего кроме Кода в исходном коде будет содержаться еще и алгоритм присвоения константам их значений.

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

23-03-2007 16:51 | Комментарий к предыдущим ответам
Ошибка здесь

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

Из первого утверждения не следует второе

23-03-2007 15:42
Попробую доказать Теорему о Невозможности Отображения Программой Собственного Исходного Кода :)

Определения
• Программа - это набор команд процессора (или среды выполнения - в случае с .NET или Java), записанных в виде набора байтов в исполняемом файле или библиотеке.
• Код - это содержимое текстового файла, используемого компилятором/интерпретатором для создания Программы  врежиме разработки (см. п. 1), а также исходный код, использованный для создания всех функций и библиотек, подключаемых к Программе в режиме выполнения.

Аксиомы
• Программа может получать данные только следующими способами (одним либо несколькими из них в любой последовательности и в любой комбинации): вычисления, обращение к внешним источникам (память, носители, пользовательский ввод), извлечение данных из констант. Другие способы получения данных программой невозможны.
• Алгоритм работы Программы создается только путем написния Кода.

Доказательство
1. Программа не имеет возможности писать свой код самостоятельно, т.к. его уже написал программист, следовательно, получение Программой текста Кода в результате вычислений невозможно.

2. Исходный код Программы нельзя сохранить в Коде в виде констант, т.к. объект не может являться частью самого себя (для этого он должен быть другим объектом, если, конечно, объект-контейнер допускает хранение внутри себя других объектов - в любом случае это нарушение условия задачи), если только кроме него самого в этом объекте больше ничего не содержится. Однако невозможно создать даже программу, Код которой содержит только (!) Код в виде константы и ничего больше, т.к. присвоение значений константам потребует написание дополнительного кода, в результате чего кроме Кода в исходном коде будет содержаться еще и алгоритм присвоения константам их значений.

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

Если кто найдет ошибку в доказательстве, прошу указать на нее - люблю тренировать логику :)

05-02-2007 03:53 | Комментарий к предыдущим ответам
>>> Если текст программы изменить

А как вообще можно требовать от программы сохранения прежней полной функциональности при условии внесения в нее произвольных изменений? ;-)

05-02-2007 02:55 | Комментарий к предыдущим ответам
>>> По-моему, все решения здесь сводятся к тому, что в тексте программы явным образом пишут ее текст.
Дык именно к этому и сводится данная задача. Это же задача олимпиадная или еще какая конкурсная. Самостоятельной ценности она не имеет. И по постановке вовсе не требуется написать такую функцию, которая сама выводила бы исходный текст после внесения в него любых изменений.

03-02-2007 23:50 | Комментарий к предыдущим ответам
Не вижу многочисленных решений. По-моему, все решения здесь сводятся к тому, что в тексте программы явным образом пишут ее текст.  Если текст программы изменить (ну хорошо, не изменить, а добавить полезную нагрузку) - придется менять и эти "константные строки" что выводятся на экран. А это получается, что не программа, а мы сами делаем текст, что выводить. На бейсике как вы наверное помните это решалось командой LIST (с вариантом LLIST). Но это был бейсик интерпретатор, а не компилятор.
Да, я не закончил мысль (ускакал) там, извините... Задача не имеет решения в паскале потому что по научном вроде так: связка программа-текст не "рефлексивна". А если по простому: компилирование текста дает однозначный код программы, а декомпилирование кода программы - множество текстов.

25-01-2007 14:27 | Комментарий к предыдущим ответам
to AXAE:

Честно говоря, не понял мысль. Ваше предложение: Доказать, что задачка, в том виде, в каком ее задали, по-моему, довольно просто является незаконченным. Что просто доказать? Что задача не имеет решения? А чем Вас не устраивают многочисленные решения, приведенные здесь?

25-01-2007 05:22 | Комментарий к предыдущим ответам
Доказать, что задачка, в том виде, в каком ее задали, по-моему, довольно просто:
Печать функции самой себя возможна, но не на дельфи - свой дельфи код она точно не напечатает: кто сможет однозначно декомпилировать исполняемый код в строки дельфи? Я думаю и это естественно, что на ассемблере бы эта задачка имела бы более конкретное решение, чем обсуждаемое здесь. И решение естественно не будет алгоритмически независимым, потому что алгоритм не имеет понятия (да и в приципе не должен) на чем он реализован, чего собственно вы от него и хотите (раз вы привязались именно к Pascal'евским строкам).
Еще аргумент - алгоритм имеет бесконечное множество программных решений, в то время как программа имеет единственный алгоритм.

Могу еще добавить, что Дирак - гений в своем роде (кто бы смог додуматься до антирыб?), но нашел неверное решение. Ряд количества "правильных" отрицательных рыб бесконечен вниз. Кто будет спорить, что допустим -117 (не помню точно, какие там числа в решении) меньше его -2?


08-12-2006 08:32
to panda:

Сударь, да Вы -- педант! ;-)

Решил тоже немного поразвлекаться. С учетом высказанных замечаний сформулировал себе следующее ТЗ:

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

2. Функция должна быть реализована на Turbo Pascal 6.0 под DOS, что накладывает следующие ограничения:
- максимальное количество символов в переменной типа String равно 255 символов;
- компилятор не допускает наличия в тексте программы очень длинных строк, соответственно, наложено ограничение, что длина любой строки функции не должна превышать 77 символов (помещаться целиком на экране).

3. При выводе должно сохраняться форматирование.

Результат приведен ниже.

function OutMe : Boolean;
var
  S1,S2,S3,S4 : String;

  function SpecChars(S : String) : String;
  var
    i : Byte;
  begin
    for i:=1 to Length(S) do S[i]:=Chr(Ord(S[i]) AND $7F);
    SpecChars:=S;
  end;

  function QuoteStr(S : String) : String;
  var
    T : String;
  begin
    T[0]:=#0;
    while Length(S) > 65 do
      begin
      T:=T+#39+Copy(S,1,65)+#39#43#13#10#32#32#32#32#32#32;
      Delete(S,1,65);
      end;
    QuoteStr:=T+#39+S+#39;
  end;

begin
  S1:='function OutMe : Boolean;НКvarНК  S1,S2,S3,S4 : String;НКНК  func'+
      'tion SpecChars(S : String) : String;НК  varНК    i : Byte;НК  beg'+
      'inНК    for i:=1 to Length(S) do S[i]:=Chr(Ord(S[i]) AND $7F);НК '+
      '  SpecChars:=S;НК  end;Н';
  S2:='КНК  function QuoteStr(S : String) : String;НК  varНК    T : Stri'+
      'ng;НК  beginНК    T[0]:=#0;НК    while Length(S) > 65 doНК      b'+
      'eginНК      T:=T+#39+Copy(S,1,65)+#39#43#13#10#32#32#32#32#32#32;'+
      'НК      Delete(S,1,65);НК';
  S3:='      end;НК    QuoteStr:=T+#39+S+#39;НК  end;НКНКbeginНК  S1:=;Н'+
      'К  S2:=;НК  S3:=;НК  S4:=;НК  Write(SpecChars(S1),SpecChars(S2),S'+
      'pecChars(Copy(S3,1,63)),QuoteStr(S1));НК  Write(SpecChars(Copy(S3'+
      ',64,9)),QuoteStr(S2),Spec';
  S4:='Chars(Copy(S3,73,9)));НК  Write(QuoteStr(S3),SpecChars(Copy(S3,82'+
      ',9)),QuoteStr(S4));НК  WriteLn(SpecChars(Copy(S3,91,130)),SpecCha'+
      'rs(S4));НК  OutMe:=true;НКend;';
  Write(SpecChars(S1),SpecChars(S2),SpecChars(Copy(S3,1,63)),QuoteStr(S1));
  Write(SpecChars(Copy(S3,64,9)),QuoteStr(S2),SpecChars(Copy(S3,73,9)));
  Write(QuoteStr(S3),SpecChars(Copy(S3,82,9)),QuoteStr(S4));
  WriteLn(SpecChars(Copy(S3,91,130)),SpecChars(S4));
  OutMe:=true;
end;


Обратите внимание, что для работы требуется, чтобы русские буквы Н и К должны быть в альтернативной DOS кодировке.

Желающие могут пробовать. И разбираться ;-) О всех замечанных ошибках просьба сообщать мне. Буду выпускать патчи :D

P.S. Хотел вообще все сделать на представленни символов черех "диез" и код символа, но пожалел тех, кто будет пытаться понять, как же эта функуция работает ;-)

07-12-2006 03:10 | Комментарий к предыдущим ответам
2 Unseen:
112 символов. Кто меньше?
А какая разница, сколько символов, если Вы сделали неправильно?
Надо было сделать функцию (а не программу) на языке Паскаль.

06-12-2006 07:11 | Комментарий к предыдущим ответам
Помню такую задачку. У меня получилось сдедующее:

var s:string='var s:string=;begin insert(#39+s+#39,s,14);write(s)end.';begin insert(#39+s+#39,s,14);write(s)end.



112 символов. Кто меньше? )

17-03-2006 12:50 | Комментарий к предыдущим ответам

procedure phoenix;
const s='procedure phoenix;$const s=!;$function r(s,o,n:string):string;begin r:=StringReplace(s,o,n,[rfReplaceAll]);end;$function p:string;begin p:=r(s,#36,#13#10);end;$begin writeln(R(p,#33,#39+s+#39));end;';
function r(s,o,n:string):string;begin r:=StringReplace(s,o,n,[rfReplaceAll]);end;
function p:string;begin p:=r(s,#36,#13#10);end;
begin writeln(R(p,#33,#39+s+#39))end;



Помницца была в RSWAG'е прога на эту тему - разное/phoenix.pas - наверное, что-то вроде этого...

writeln можно поменять на label1.caption:=R(...), а то экрана не хватает
или написать begin Assign(output,'out.log');Rewrite(output);phoenix;end.

StringReplace есть в SysUtils.pas, но можно и самому написать...

16-03-2006 13:30 | Комментарий к предыдущим ответам

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  s1 : string;
  s2 : string;

begin
  s1 := 'procedure TForm1.Button1Click(Sender: TObject); var  i : integer;  s1 : string;  s2 : string;begin  s1 = ' + ';  s2 = '''' +  s1  + '''';  i := pos( ''''s1 = '''', s1 ) + 5;  insert( s2, s1, i );  Memo1.Text := s1;end; ';
  s2 := '''' +  s1  + '''';
  i := pos( 's1 = ', s1 ) + 5;
  insert( s2, s1, i );
  Memo1.Text := s1;
end;



Ну еще квчки заменить на их коды и символы переносы строк добавить( и в s1 тоже)...
Не праверял, но работать по-идее должно...

26-02-2006 03:42 | Комментарий к предыдущим ответам
to Ameba:
За идею -- респект. Однако проверь параметры в функции Copy :-)

26-02-2006 02:57 | Комментарий к предыдущим ответам
задачка-то детская, на строки :)

var s:string;
begin
s:='var s:string; begin s:=; writeln((copy(s,1,26),chr(39)+s+chr(39),copy(s,27,36)); end.';
writeln(copy(s,1,23),chr(39)+s+chr(39),copy(s,24,62));
end.

*если придиратся к переводам каретки, то можно исходный код написать в одну строку :D

23-11-2005 08:53
А  это  не  прокатит:  в  Delphi  есть  функции  FmtLoadStr  и  LoadStr  которые  загружают  строку  по  ее  индексу  из  ресурсов  приложения.

15-10-2005 04:26 | Вопрос к автору: запрос дополнительной информации
Я так понял вопрос в том как организовать вывод исходного кода программы написанной на том или ином языке программирования, например функции которые использует программа DeDe для раздизассемблирования программ, так или нет?

03-09-2005 20:58 | Комментарий к предыдущим ответам
Походу понятно в чем соль задачи. Если это олимпиадная задача, то надо отдать должное тем, кто ее решил :)

Если решать ее "в лоб", то необходимо написать подобие интерпретатора.
Убил 40 минут драгоценного времени и получил следующее:

function GetSelf: string;
var
  c, c1, c2, c3: string;
  i: integer;
  r: string;
begin
  c1 := 'function GetSelf: string; _brvar_br  c, c1, c2, c3: string;_br  i: integer;_br  r: string;_brbegin_brc1 := _#c_brc2 := _#c_brc3 := _#c_br  r:=c1+c2+c3;_br  i:=1;_br  while i<=Length(r) do begin_br    if r[i]=_#^__#^_br      then begin_br        if (r[i+1]';
  c2 := '=_#^b_#^) and (r[i+2]=_#^r_#^) then begin result:=result+chr(10)+chr(13); i:=i+2; end_br        else if (r[i+1]=_#^#_#^) and (r[i+2]=_#^c_#^) then begin result := result+chr(39)+c+chr(39)+_#^;_#^+chr(10)+chr(13); i:=i+2; if c=c1 then c:=c2 else c:=c3;';
  c3 := ' end_br        else if (r[i+1]=_#^#_#^) and (r[i+2]=_#^^_#^) then begin result:=result+_#^_#^_#^_#^; i:=i+2; end_br        else result:=result+r[i]; end_br      else result:=result+r[i];_br    inc(i);_br  end;_brend;';
  c:=c1;
  r:=c1+c2+c3;
  i:=1;
  while i<=Length(r) do begin
    if r[i]='_'
      then begin
        if (r[i+1]='b') and (r[i+2]='r') then begin result:=result+chr(10)+chr(13); i:=i+2; end
        else if (r[i+1]='#') and (r[i+2]='c') then begin result := result+chr(39)+c+chr(39)+';'+chr(10)+chr(13); i:=i+2; if c=c1 then c:=c2 else c:=c3; end
        else if (r[i+1]='#') and (r[i+2]='^') then begin result:=result+''''; i:=i+2; end
        else result:=result+r[i]; end
        else result:=result+r[i];
    inc(i);
  end;
end;



При определенной сноровке можно почти любой код зашить. Визуально между результатом и кодом отличий не нашел.

Можно HTML или XML зарулить, тогда будет удовлетворять стандартам :)

03-09-2005 15:44
привет
у меня в D6 скомпилировалась программа:
--------
asm
db $00000000;
mov ax, bx;
db $00000000;
end.
--------

значит, можно написать на встроенном асме программу, которая печатает слово "asm" в начале, слово "end." в конце - а посередине, дезассемблированный код, который лежит между двумя указанными константами $00000000 - константы для того, чтобы не дизассемблировать лишний код, который генерируется компилятором

хоть и не на паскале, но на Delphi  :-)
автора это устроит?

02-09-2005 16:24 | Комментарий к предыдущим ответам
почему именно эти темы перерастают в флуд :-)

Думаю, потому что программа, выводящая сама себя - гораздо ближе к вопросу смысла бытия, нежели полосатые гриды и try/except как средство борьбы с AV ;-)

Ведь если программа способна вывести самое себя, следовательно она мыслит, а стало быть - существует?

02-09-2005 09:06 | Комментарий к предыдущим ответам
>>>почему именно эти темы перерастают в флуд
Наверно таки потому что люди парятся отвечать на вопросы как раскрасить грид :)))
А еще надо таки разделять флуд и флейм, если я правильно помню
флейм есть суть обсуждение вопроса не по теме
флуд есть суть абсолютно неинформативный флейм на уровни
и еще собссно по теме, хотел было сказать да думал топик закрыт
>>>"Просто" надо написать программу, дизассемблирующая саму себя
ничего не просто... в этом случае в качестве источника данных испльзуются данные, обработанные внешним алгоритмом(компилятором). т.е. решение  алгоритмически не независимо.

02-09-2005 08:48 | Комментарий к предыдущим ответам
to Green:
Delphi тут совсем непричем. Просто такие вопросы очень часто перерастают в капитальный флуд на отвлеченные темы.

Могу предложить далее рассмотреть вопрос психологии: почему именно эти темы перерастают в флуд :-)

02-09-2005 08:33 | Комментарий к предыдущим ответам
Я уже совсем запутался. Рыбаки выбрасывают в море отрицательных рыб, Ферма не дружил с математикой... А Дельфи-то тут причём?

02-09-2005 04:02 | Комментарий к предыдущим ответам
to Михаил Комин:
Думаю, что теорему косинусов (или некий ее аналог) Ферма точно знал :-)

02-09-2005 03:50 | Сообщение от автора вопроса
Для сравнения - в доказательстве Ильина (пока, напоминаю, не проверенном) используется только теорема косинусов.

А разве Ферма знал теорему косинусов? ;)

02-09-2005 03:08 | Комментарий к предыдущим ответам
Кто то до сих пор доказывает теорему Ферма?

Да есть такие :)

Недавно промелькнуло сообщение, что профессор Ильин из Омска нашёл очень оригинальное и короткое доказательтво. К сожалению, газета, которая это напечатала, доказательство переврала, поэтому проверить его самостоятельно пока нет возможности. Утверждают, что при предварительном обсуждении этого доказательства ошибок не найдено. 15 сентября будет обсуждение доказательства в академии наук. Ждём-с...

Что касается существующего доказательства, то оно очень громоздко. Удалось как-то очень хитро, с применением неизвестного Ферма аппарата, доказать теорему для любого N меньше некоторого N1, потом - для любого N>N2. При этом N1<N2. Для каждого N:N1<=N<=N2 теорема доказывалась отдельно с привлечением мощных численных методов... Одним словом, всё это никак не охладило пыл энтузиастов, которые хотели бы найти то красивое и короткое решение, о котором упоминал Ферма. Для сравнения - в доказательстве Ильина (пока, напоминаю, не проверенном) используется только теорема косинусов.

02-09-2005 01:01
А слабо написать функцию, которая выводит сама себя?
Только сейчас внимательно прочитал вопрос :-)
Вот Вам функция (писать в одну строку):

function p:BOOL;const A='function p:BOOL;const A='; B=';begin writeln(A,chr(39),A,chr(39),chr(59),chr(32),chr(66),chr(61),chr(39),B,chr(39),B); end;';begin writeln(A,chr(39),A,chr(39),chr(59),chr(32),chr(66),chr(61),chr(39),B,chr(39),B); end;


Можно и в процедуру переделать, потому как в возвращаемом значении смысла нет.

01-09-2005 23:29 | Сообщение от автора вопроса
>>> Надо сгенерировать текст ВСЕЙ программы, а не процедуры.
>>> Жители! Вам надоели простые вопросы? А слабо написать функцию, которая выводит сама себя?

Да я и не признавал это решением.

01-09-2005 18:45 | Комментарий к предыдущим ответам
Не знаю как на Delphi, а на асьме такую программу мне кажется можно написать.
"Просто" надо написать программу, дизассемблирующая саму себя, т.е. хоть все своё адресное пространство (можно и продцедуры вывода самому написать, чтоб вообще ничего стороннего не использовать), и пишущая ето все куда угодно. Т.к. никаких констант не используется, то проблем с рекурсией не будет.
В delphi можно попробовать сделать так же, но на object pascal это перевести будет сложно, но можно ведь (зная структуру программы и исходный текст) "угадывать" нужную конструкцию на паскале имея асм-код.

01-09-2005 14:47 | Комментарий к предыдущим ответам
to Михаил Комин:
походу вы не поняли :)

Надо сгенерировать текст ВСЕЙ программы, а не процедуры. Если функции, то вывод кода всех подфункций. (из вопроса этого не следует, но именно из-за этого весь сыр-бор, ИМХО).

В случае с Сишным примером, вывод дополнительно функции Format не влияет на решение т.к. можно ее безболезненно добавить (хотя, может и не так уже безболезненно).

Так вот, в данном контексте ваш код не работает, т.к. выдает строку


procedure c;
begin
  ShowMessage(S);
end;



а на самом деле код программы

const
  S = 'procedure c;'#13#10+
'begin'#13#10+
'  ShowMessage(S);'#13#10+
'end;';

procedure c;
begin
  ShowMessage(S);
end;



А теперь попоробуй добавить вывод константы, и посмотрим, как у тебя это получится :)

01-09-2005 13:08 | Комментарий к предыдущим ответам
Доказательство было получено несколько лет назад, ведущие математики его приняли.

Есть увлекательнейшая популярная книжка на эту тему, например здесь

http://www.ega-math.narod.ru/Singh/FLT.htm

весьма рекомендую распечатать и читать перед сном.

01-09-2005 12:40 | Комментарий к предыдущим ответам
Кто то до сих пор доказывает теорему Ферма?
Доказательство было получено несколько лет назад, ведущие математики его приняли. Честно говоря разобраться в нем не смог - 40 страниц малознакомой математики. Сначала доказывается очень странная гипотеза в теории многомерных графов, потом устанавливается ее эквивалентность теореме Ферма.

01-09-2005 12:37
Нет, для тех, кто попробует сам создать что-то свое...
Если бы. В эттом треде практически никому и не интересна поставленная задача. Я же писал, когда был студентом, участвовал в олимпиадах, тогда да, делал такую задачку.
А здесь в основном общаются люди, у которых уже давно совсем другие интересы.

01-09-2005 12:16 | Комментарий к предыдущим ответам
to Fisher:

:-)))))))))))))))))))))))))))))))))))

01-09-2005 12:13 | Комментарий к предыдущим ответам
т.к. у Вселенной должно хватить памяти на бесконечно вложенную рекурсию.

Попробовал. Получил:

Universe error: out of memory. System halted.



И шо теперь делать???

;-)

01-09-2005 10:38 | Комментарий к предыдущим ответам
Прочитал вот всю ветку, и хочу внести свою долю путаницы в этот вопрос.

Допустим есть даже самая простая процедура, которая ничего не делает:


procedure Out;
begin
end;



Тогда процедура, которая выводит свой код будет выглядеть хотя бы так:


procedure Out;
begin
    writeln('procedure Out;');
    writeln('begin');
    writeln('end;');
end;



Но теперь код процедуры изменился, соответственно, изменится и вывод:


procedure Out;
begin
    writeln('procedure Out;');
    writeln('begin');
    writeln('    writeln('Procedure Out;');');
    writeln('    writeln('begin');');
    writeln('    writeln('end');');
    writeln('end;');
end;



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

во загнул 8-)
 

01-09-2005 09:55 | Сообщение от автора вопроса
Самое интересное, что
C поставленной мною задачей, справляется. Читай внимательно. ;)

Это задача для тех, кто умеет пользоваться гуглом?
Нет, для тех, кто попробует сам создать что-то свое...

Жаль что не поняли...

01-09-2005 09:54 | Комментарий к предыдущим ответам
титпа по моему ето и есть доказательство невозможности решения задачи))

01-09-2005 09:53 | Комментарий к предыдущим ответам
интереснокак программа может себя вывести если
1) Имея ассемблерный код мы никогда не сможем получить из него строки программы на высокоуровневом языке (компиляция проходит с потерей информации)
2) запускающаяся программа это по сути и есть ассемблер(машинный код если быть точным)

3) зна о пункте 2 при постановке задачи и нахождения на нее ответа смотри пункт 1.... вывод есно задачу не решить)))

01-09-2005 08:31 | Комментарий к предыдущим ответам
to Green:
>>> Не знаю, какое отношение это имеет к Delphi
К Delphi это не имеет никакого отнощения. Просто подход Fisher'а к обсуждаемому вопросу очень похож к подходу Лирака к задаче про рыб ;-)

01-09-2005 07:55 | Комментарий к предыдущим ответам
Три рыбака наловили на острове рыбу... Дирак нашёл такое решение: у рыбаков было -2 рыбы.

Не знаю, какое отношение это имеет к Delphi, но почему минимальное число -2 рыбы?
Например, для числа -299 задача тоже решается...

01-09-2005 07:14 | Комментарий к предыдущим ответам
Самое интересное, что
Это эквивалентно следующей процедуре:


const
  S = 'procedure c;'#13#10+
'begin'#13#10+
'  ShowMessage(S);'#13#10+
'end;';

procedure c;
begin
  ShowMessage(S);
end;


и

procedure ShowOut;
begin
  ShowMessage('procedure Proc begin ShowOut end;')
end;
procedure Proc begin ShowOut end;


Не решают поставленной задачи.
Убедится легко, достаточно сравнить то, что она выдаст и исходник :)
Это похоже на отражении зеркала в зеркале :)
 

01-09-2005 06:32 | Комментарий к предыдущим ответам
Программа должна быть записана в 1 строку, а не как получилось здесь.

01-09-2005 06:31
Это задача для тех, кто умеет пользоваться гуглом?
1. Скармливаем гуглу строку: Программа, печатающая свой текст
2. На первой же странице получаем ссылку http://forum.cs.vsu.ru/showthread.php?t=886&pn=0
3. На ней получаем ссылку http://www.nyx.net/~gthompso/self_pasc.txt
4. Берем решение от Gary Lewandowski.
5. Если надо на Delphi, добавляем к нему {$APPTYPE CONSOLE}:


program s;{$APPTYPE CONSOLE}const A='program s;{$APPTYPE CONSOLE}const A='; B='; begin writeln(A,chr(39),A,chr(39),chr(59),chr(32),chr(66),chr(61),chr(39),B,chr(39),B) end.'; begin writeln(A,chr(39),A,chr(39),chr(59),chr(32),chr(66),chr(61),chr(39),B,chr(39),B) end.


И?

01-09-2005 06:29 | Комментарий к предыдущим ответам
2  Сергей Перовский
>>>А каким критериям не удовлетворяет решение Vitа?
Функцию Format ну никак не назовешь алгоритмически атомарной.
Использование ее есть суть использование внешнего источника алгоритмики. Т.е. решение не независимо алгоритмически.
Эта задача используется в преподовании программирования лет тридцать. А Вы говорите "не доказано".
просто доценты спят и видят защитисть докторскую, авось студиузу чтонить путное в голову придет.

01-09-2005 05:51 | Комментарий к предыдущим ответам
main(a){printf(a,34,a=”main(a){printf(a,34,a=%c%s%c,34);}”,34);}

У меня не компилируется. Пишет "неизвестная функция printf"

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

01-09-2005 05:50 | Комментарий к предыдущим ответам
задача про трех рыбаков и количество рыб?
Что за задача? :)


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

Дирак нашёл такое решение: у рыбаков было -2 рыбы. Когда первый рыбак выкинул одну рыбу в море, их осталось -3. Забрав свою -1 рыбу, он уехал, оставив товарищам -2 рыбы. Они действовали точно так же.

01-09-2005 05:41 | Комментарий к предыдущим ответам
>>> Михаил Комин
Три рыбака ловили рыбу. Наловили и легли спать, решив, что улов поделят утром. Утром проснулся первый, пересчитал рыб. Оказалось, что количесвто на 3 не делится, одна лишняя. Он выбросил одну рыбу, взял треть оставшегося улова и ушел. Потом проснулся второй. Думая, что он проснулся первым, также пересчитал рыб. Опять одна оказалась лишней. Выбросил одну, взял треть и ушел. Третий поступил точно так же. Вопрос, какое минимльное количество рыб могло быть?

Задача несложная, и особого интереса не представляет. Интерес представляет решение Дирака. Если результат -- целое число, а не натуральное, то правильный ответ: -2 рыбы.

01-09-2005 05:39 | Сообщение от автора вопроса
Кстати... в решении Vit'a нашел изъян... :(


s[5]:='For i:=1 to 7 do writeln(format(''s[%d]:=''''%s'''''',[i,s[i]]));';


Программа выводит эту строчку с меньшим числом кавычек... :(

Все еще жду подобных решений ;)

01-09-2005 05:30 | Сообщение от автора вопроса
задача про трех рыбаков и количество рыб?
Что за задача? :)


Ровно как и не доказано что теорема Ферма не имеет доказательства...
хотя.... http://newsru.com/russia/22aug2005/ferma.html

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

01-09-2005 05:14 | Комментарий к предыдущим ответам
to Zloxa
>>>это фокус это не решение.
А каким критериям не удовлетворяет решение Vitа?
Внешних источников данных нет, весь вывод генерируется чисто программно. Транслируем, запускаем, печатается исходный текст.
Обратите внимание на ссылку - это форум, на котором студент просит помощи в решении учебной задачи. Эта задача используется в преподовании программирования лет тридцать. А Вы говорите "не доказано".
Значит Вы ставите какую-то другую задачу.
Надо сказать решение Vitа очень изящное, обычно студенты писали полсотни строк и больше.

to Fisher
А с пустой программой поаккуратнее... Все таки в паскале очень строгие требования к оформлению программ. В пустой строке не хватает как минимум точки после последнего end  ;)

01-09-2005 05:01 | Комментарий к предыдущим ответам
to Fisher:
Ты у нас прям Дирак от программирования :-) Помнишь его вариант решения задачи про трех рыбаков и количество рыб?

01-09-2005 04:58 | Комментарий к предыдущим ответам
2Fisher: пустая программа не компилируется, увы.

01-09-2005 04:55 | Комментарий к предыдущим ответам
Ввиду отсутствия практической выгоды предлагаю прекратить разработку функции, которая печатает сама себя, и начать разработку программы, которая пишет сама себя :-)

01-09-2005 04:40 | Комментарий к предыдущим ответам
Ты хотел сказать это:

Если это адресовано мне, то я сказал именно то, что хотел сказать: пустая программа имеет пустой вывод. Что Вы имеете возразить?

;-)

01-09-2005 04:04

задача не решаема - ФАКТ!!!!
Кто сказал? ;)


Это не доказано - ФАКТ!!!

Ровно как и не доказано что теорема Ферма не имеет доказательства...
хотя.... http://newsru.com/russia/22aug2005/ferma.html


ты опять схитрил


ФАКТ!!!
Vit с http://forum.pascal.net.ru/index.php?showtopic=1132
тоже схитрил, просто оставил иллюзорность наличия решения.. это фокус это не решение. Пассы руками, свисающие манжеты, и неискушенный зритель не видит как в шляпу кладут кролика...

01-09-2005 03:55 | Сообщение от автора вопроса
Предыдущий код, не мой... Автор Vit, взято с http://forum.pascal.net.ru/index.php?showtopic=1132

01-09-2005 03:48 | Сообщение от автора вопроса
Ты хотел сказать это:

program Project1;
Uses SysUtils; var s:array[1..10] of string;i:integer;
begin
s[1]:='program Project1;';
s[2]:='Uses SysUtils; var s:array[1..10] of string;i:integer;';
s[3]:='begin';
s[4]:='for i:=1 to 3 do writeln(s[i]);';
s[5]:='For i:=1 to 7 do writeln(format(''s[%d]:=''''%s'''''',[i,s[i]]));';
s[6]:='for i:=4 to 7 do writeln(s[i]);';
s[7]:='end.';
for i:=1 to 3 do writeln(s[i]);
For i:=1 to 7 do writeln(format('s[%d]:=''%s''',[i,s[i]]));
for i:=4 to 7 do writeln(s[i]);
end.


%)

01-09-2005 03:47
Вот решение для Pascal:





;-)

Полагающийся мне приз прошу передать Клубу программистов-теоретиков.

01-09-2005 03:46 | Сообщение от автора вопроса
Zloxa, это не то... ты опять схитрил с использованием полного исходного текста. Вот в примере на си, используется функция printf, которая не заточена под данную задачу, а просто выполняет свою фукцию - вывод на экран...
Если использовать, Format, то это будет пародия на си...

задача не решаема - ФАКТ!!!!
Кто сказал? ;)

01-09-2005 03:41
задача не решаема - ФАКТ!!!!

01-09-2005 03:39

procedure ShowOut;
begin
  ShowMessage('procedure Proc begin ShowOut end;')
end;
procedure Proc begin ShowOut end;


но вообще, чтобы пыль в глаза пустить можно чонить придумать с функцией Format.


01-09-2005 03:36 | Сообщение от автора вопроса
А зачем нужна функция, которая выводит свой исходный текст, ведь кроме этого от нее никакой пользы?
Похоже, решение этой задачи имеет чисто теоретический интерес.

Совершенно верно ;)

01-09-2005 03:35 | Сообщение от автора вопроса
2 Zloxa, ну да... Ну а сможешь написать подобное на паскале? Пусть даже с использованием другой функции, в которой вся алгоритмика... Вот и посмотрим, решаема задача или нет...

01-09-2005 03:28
2 Михаил Комин
Вся алгоритмика выполняется во ВНЕШНЕЙ фукциии :)))) Софистика... это только видимость что функция печатает сама себя :)))

01-09-2005 03:27
А зачем нужна функция, которая выводит свой исходный текст, ведь кроме этого от нее никакой пользы?
Похоже, решение этой задачи имеет чисто теоретический интерес.

01-09-2005 03:26 | Сообщение от автора вопроса
Пардон... она даже на си написана...

01-09-2005 03:23 | Сообщение от автора вопроса
main(a){printf(a,34,a=”main(a){printf(a,34,a=%c%s%c,34);}”,34);}

:) Если у меня данные верны, то она была написана Владом Таировым и Рашидом Фахреевым... год не помню... (всего 64 символа) Причем, это не единственная в своем роде. А самая короткая.

01-09-2005 03:17
нащет восьмидесятых погрубил, наверное всетки в девяностых :))
А можно в студию тот самый исходничек на цэпп?

01-09-2005 03:16 | Сообщение от автора вопроса
Ой, Zloxa, опередил меня. :)

Но на С++ же есть решение... Странно, что для паскаля это не найдено...

01-09-2005 03:14 | Сообщение от автора вопроса
На паскале это делалось обычным открыванием файла текста программы на чтение, построчным считыванием кода и выводом куда это нужно.
Ну так-то это будет слишком просто.
Это эквивалентно следующей процедуре:


const
  S = 'procedure c;'#13#10+
'begin'#13#10+
'  ShowMessage(S);'#13#10+
'end;';

procedure c;
begin
  ShowMessage(S);
end;



А вот без использования заранее подготовленного исходного текста? ;)

01-09-2005 03:14
Вообще эта тема муссировалась в журнале "Наука и жизнь" в восьмидесятых годах... Задача стоит шире - программа которая вываодит свои исходный текст АЛГОРИТМИЧЕСКИ...т.е. не использует внешних  источников. Это как теорема ферма, все знают что задача не имеет решения, но доказать ее никто не может. Есесно можно дампануть лист исходника из файла, можно дизасемблировать свой машинный код, но это не алгоритмическое решение. А в случае с функцией, можно определить строковую констату вне функции с текстом функции и вывести ее на экран.

01-09-2005 02:30
Задачка для первокурсников. На паскале это делалось обычным открыванием файла текста программы на чтение, построчным считыванием кода и выводом куда это нужно. По крайней мере так нам объяснял сам преподаватель.

01-09-2005 02:24 | Сообщение от автора вопроса
Прошу прощения за неточное описание задачки...
Нужно написать функцию, которая выводит свой исходный текст. Пример показать не могу, так как его не знаю еще, и есть ли он вообще. %)


т.е. есть например функция
function d: string
begin
  {To Do}
end;
//
результатом должно являться
'function d: string'#13#10+
'begin'#13#10+
'  {To Do}'#13#10+
'end;'



Можно и без переводов строк... это уже не принципиально. Т.е. либо функция, возвращающая свой исходный текст, либо процедура выводящая сама свой текст.

01-09-2005 01:37
Не знаю зачем это нужно, но вот код функции, которая "выводит сама себя":

function SelfShow: boolean;
begin
  ShowMessage('Меня зовут функция SelfShow');
  Result := true;
end;



Или я неправильно понял вопрос :-)

01-09-2005 01:37 | Вопрос к автору: запрос дополнительной информации
Что именно она выводит ?
Что такое "сама себя" ?

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования