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

27.07.11

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

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

Скачать исходный код

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

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

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

 

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

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

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

1 стартмани

30.01.2024    1870    stopa85    12    

34

Алгоритм симплекс-метода для решения задачи раскроя

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

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

19.10.2023    4662    user1959478    50    

34

Регулярные выражения на 1С

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

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

1 стартмани

09.06.2023    7652    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

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

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

1 стартмани

21.03.2022    7930    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

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

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4546    fishca    13    

36

Интересная задача на Yandex cup 2021

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

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8935    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

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

31.08.2021    7957    dusha0020    8    

70
Комментарии
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
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 721 29.07.11 09:02 Сейчас в теме
Жаль 1с не позволяет программно получить тексты модулей. Это была бы замечательная возможность для написания различных парсеров. А так нужно исходники сначала выгрузить а затем проводить анализ.
9. Voland36 9 02.08.11 11:51 Сейчас в теме
задачку надо назвать не программа, а "программист, выводящий на экран свой исходный код". :D
denis_aka_wolf; Dvornik; +2 Ответить
10. ildarovich 7861 02.08.11 15:15 Сейчас в теме
Вот несколько более короткий вариант (срабатывает при открытии формы)
С="С="";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)


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