Куайни (непотрібна програма в програмі)

Куайн(від англ. quine) - програма, результатом роботи якої є власний вихідний код. Відразу обмовимося: програми, які звертаються до файлів або зчитують з клавіатури куайнами не є. Більш серйозне обмеження: програми, які можуть отримати доступ до свого вихідного коду (засобами мови), також не є куайнами.

Приклад наБейсіке:

Приклад наФорті:

А чи існують вони?

Незважаючи на просте формулювання завдання, витративши трохи часу на його вирішення, постає питання: чи існують взагалі такі програми? Відповідь: Так!

Більше того, куайн існує в будь-якій мові, здатній виводити довільний рядок, що обчислюється! Вперше ця ідея була описана Полом Братлі та Жаном Мілло. А першим куайном вважається програма, написана мовоюAtlas AutocodeХемішем Дюаром.

А сучасними мовами?

Pascal:

Отже. Ми переконалися, що такі програми існують, а тепер трішки теорії про те, як їх зробити.

Інтуїтивно зрозуміло, що потрібно вивести значення змінної, де зберігається частковий код програми. Чому частковий? Тому що саме привласнення змінної теж має опинитися у значенні змінної. Іншими словами, значення змінної має копіювати саме себе, через що виникає нескінченна рекурсія. Неприємний момент.

Щоб виправити становище, взагалі не вноситимемо в змінну сам факт присвоєння. Тобто:

Після, під час висновку підставимо значеннязу її визначення. Добре, але виникає проблема з лапками. Мови, в яких визначено одинарні та подвійні лапки, справляються з проблемою добре (ми говоримо про те, що можна створити змінну q=" ' ", а потім вивести її значення в їївизначення), але що робити, наприклад, з мовою С? Екранування, очевидно, не допоможе, тому що його теж треба екранувати… У цьому випадку можна задати лапки кодом символу та вивести його.

Тепер залишається проблема вставки рядка у вихідний рядокз. Тут згадаємо про printf і всю його міць.

Найчастіше методи взяття підрядка вміють брати її остаточно:

Ми не позбавлятимемо вас задоволення написати власний куайн, але покажемо кілька екзотичних прикладів.

Вищий пілотаж

Куайн, що виводить власний код, це, звісно, ​​добре. Але як вам ідея куайна, який пише інший код, що є куайном. Причому результатом роботи останнього є первісний куайн! Заманливо, чи не так?

Такі програми називаютьсяцепні куайни, і на сьогоднішній день, найбільший ланцюговий куайн (довжина ланцюга вже досягла 100 мов) написаний японцем Юсуке Ендо.

Для того, щоб працювало:

Ну і відповідно результат кожної програми потрібно запускати самим:

Нескладно переконатися в тому, що результатом цього ланцюга є початкова програма.

Так, мови програмування в куайні розташовані в алфавітному порядку.