gifts2017

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

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

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

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

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

 

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

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

См. также

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

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

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


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




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




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

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


Ну, а если вывод инициируется нажатием кнопки на форме, то вариант будет таким
Процедура КВН(К)С="Процедура КВН(К)С="";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры
NeviD; trumanl; Ягг; pm74; v3rter; +5 Ответить
11. Алексей Новоселов (a-novoselov) 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) 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) 10.06.15 13:58