Задача: Программа, выводящая на экран свой исходный код (куайн)

Опубликовал archie (archie) в раздел Программирование - Практика программирования

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

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

Собственно, реализация на платформе 1С v8.2

 

Скачать файлы

Наименование Файл Версия Размер
ВнешняяОбработка
.epf 5,78Kb
27.07.11
302
.epf 5,78Kb 302 Бесплатно

См. также

Добавить вознаграждение
Комментарии
1. dunpil - (dunpil) 82 27.07.11 13:43 Сейчас в теме
Не совсем понял идею обработки. Если бы она выводила свой код,было бы интересно, а там просто весь код в строку продублирован. В чем смысл?
2. archie (archie) 26 27.07.11 13:56 Сейчас в теме
Обрати внимание, что выводимый результат должен в точности повторять исходный код.
Т.е. чтобы на экране появилось "Сообщить();" код должен выглядеть так:
Сообщить("Сообщить();");

А чтобы вывести "Сообщить("Сообщить();");" код будет таким:
Сообщить("Сообщить("Сообщить();");");

Смысл логической задачки понятен?
В любом случае, на гениальность решения никто не претендует. Это всего лишь классическая задача по программированию.
3. Ийон Тихий (cool.vlad4) 41 27.07.11 14:05 Сейчас в теме
(1) для тех, кто не знает - это называется квайн
- тренировка для ума,
4. Ийон Тихий (cool.vlad4) 41 27.07.11 14:15 Сейчас в теме
(0)Да, кстати, код я к сожалению пока не смотрел, но можете добавить его в вики, как пример. Чем 1С хуже других ;)
5. zling zling (zling) 18 28.07.11 10:09 Сейчас в теме
Неа, не катит. Во-первых, текст - не точная копия. Впрочем, в моем варианте тоже.
Во-вторых, и это-главное, если меняется текст кода в одном месте, то выводит совсем не то.
Вот, например, в первом операторе Лев поставить 10 знаков, а не 47.
В-третьих, обработка кроме вывода самого своего текста никакого смысла не имеет.


Лучше, на мой взгляд, подумать, например, над таким вариантом текста обработки:




Текст = "
|запрос = новый запрос;
|запрос.Текст = ""ВЫБРАТЬ ПЕРВЫЕ 5 ФизическиеЛица.Ссылка ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица УПОРЯДОЧИТЬ ПО ФизическиеЛица.Наименование АВТОУПОРЯДОЧИВАНИЕ"";
|Выборка = запрос.Выполнить().Выбрать();
|Пока Выборка.Следующий() Цикл
| Сообщить(Выборка.Ссылка);
|КонецЦикла;
|
|";
Выполнить(Текст);
Сообщить(Текст+символы.ПС+"Выполнить(Текст);");




ну и дальше можно подумать :)
6. archie (archie) 26 28.07.11 10:39 Сейчас в теме
(5)
1. Даже специально скачал обработку перепроверить (вдруг недосмотрел чего), сравнил посимвольно в блокноте - отрабатывает правильно и выводит точно свой исходник. Просьба больше не пугать людей о выложенной неработающей обработке :)
2. Разумеется, это касается и других квайнов на других языках (см. (3)). Изменение в одном месте потребует изменения в других местах.
3. Вывод своего исходного кода и есть смысл программы. Это единственное условие задачи. Конечно, это интересная идея какую-нибудь рабочую обработку привести к условию этой задачи, но это уже выходит за рамки основного требования.
7. zling zling (zling) 18 28.07.11 11:15 Сейчас в теме
(6) а, ну кстати да, приношу свои извинения :)

потом попробую сделать, но с методом Выполнить
8. Ярослав Волохов (YVolohov) 690 29.07.11 09:02 Сейчас в теме
Жаль 1с не позволяет программно получить тексты модулей. Это была бы замечательная возможность для написания различных парсеров. А так нужно исходники сначала выгрузить а затем проводить анализ.
9. Vladimir Martynov (Voland36) 02.08.11 11:51 Сейчас в теме
задачку надо назвать не программа, а "программист, выводящий на экран свой исходный код". :D
denis_aka_wolf; Dvornik; +2 Ответить
10. Сергей (ildarovich) 4773 02.08.11 15:15 Сейчас в теме
Вот несколько более короткий вариант (срабатывает при открытии формы)
С="С="";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)


Ну, а если вывод инициируется нажатием кнопки на форме, то вариант будет таким
Процедура КВН(К)С="Процедура КВН(К)С="";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры
NeviD; trumanl; Ягг; pm74; v3rter; +5 Ответить
11. Алексей Новоселов (a-novoselov) 940 04.08.11 09:56 Сейчас в теме
12. Алексей Сергеев (students) 20.09.11 06:17 Сейчас в теме
13. shro (6728418@mail.ru) 15.12.11 12:39 Сейчас в теме
Да, кстати, код я к сожалению пока не смотрел, но можете добавить его в вики, как пример. Чем 1С хуже других
Вот несколько более короткий вариант (срабатывает при открытии формы)
супер. классная идея.
14. KostyaBu Bu (KostyaBu) 20 26.12.11 10:59 Сейчас в теме
Блин идея простая, а додумался самому сложно. +1 за идею
15. Никита Попов (arxz) 06.05.13 15:59 Сейчас в теме
Вот мой вариант. Не такой компактный, зато отформатирован по человечески :)

Процедура ПриОткрытии()
	q = Символ(34); e = Символы.ПС;
	строка = "Процедура ПриОткрытии()
	|	q = Символ(34); e = Символы.ПС;
	|	строка = $;
	|	строка = СтрЗаменить(строка, Сред(строка, 68, 1), q + СтрЗаменить(строка, e, e + Символы.Таб + Символ(124)) + q);
	|	Сообщить(строка);
	|КонецПроцедуры";
	строка = СтрЗаменить(строка, Сред(строка, 68, 1), q + СтрЗаменить(строка, e, e + Символы.Таб + Символ(124)) + q);
	Сообщить(строка);
КонецПроцедуры
...Показать Скрыть
16. Denis Michaylov (denis_aka_wolf) 32 10.06.15 13:58 Сейчас в теме