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

27.07.11

Разработка - Математика и алгоритмы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
ВнешняяОбработка
.epf 5,78Kb
362
362 Скачать бесплатно

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

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

 

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3203    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7611    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3142    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

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

1 стартмани

09.06.2023    10926    7    SpaceOfMyHead    18    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4396    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

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

23.11.2022    3561    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

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

1 стартмани

21.03.2022    9049    7    kalyaka    11    

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

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

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


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




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




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

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


Ну, а если вывод инициируется нажатием кнопки на форме, то вариант будет таким
Процедура КВН(К)С="Процедура КВН(К)С="";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры
PetrPan; NeviD; trumanl; Ягг; pm74; v3rter; +6 Ответить
11. a-novoselov 1158 04.08.11 09:56 Сейчас в теме
12. students 20.09.11 06:17 Сейчас в теме
13. 6728418@mail.ru 15.12.11 12:39 Сейчас в теме
Да, кстати, код я к сожалению пока не смотрел, но можете добавить его в вики, как пример. Чем 1С хуже других
Вот несколько более короткий вариант (срабатывает при открытии формы)
супер. классная идея.
14. 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_aka_wolf 79 10.06.15 13:58 Сейчас в теме
17. Serj1C 483 21.10.21 23:07 Сейчас в теме
Наконец я осилил эту задачу!

С="С=Лев(С, 2)+Символ(34)+С+Символ(34)+Символ(59)+С;Сообщить(С)";С=Лев(С, 2)+Символ(34)+С+Символ(34)+Символ(59)+С;Сообщить(С)
Прикрепленные файлы:
Оставьте свое сообщение