Куайни (непотрібна програма в програмі)
Куайн(від англ. quine) - програма, результатом роботи якої є власний вихідний код. Відразу обмовимося: програми, які звертаються до файлів або зчитують з клавіатури куайнами не є. Більш серйозне обмеження: програми, які можуть отримати доступ до свого вихідного коду (засобами мови), також не є куайнами.
Приклад наБейсіке:
Приклад наФорті:
А чи існують вони?
Незважаючи на просте формулювання завдання, витративши трохи часу на його вирішення, постає питання: чи існують взагалі такі програми? Відповідь: Так!
Більше того, куайн існує в будь-якій мові, здатній виводити довільний рядок, що обчислюється! Вперше ця ідея була описана Полом Братлі та Жаном Мілло. А першим куайном вважається програма, написана мовоюAtlas AutocodeХемішем Дюаром.
А сучасними мовами?
Pascal:
Отже. Ми переконалися, що такі програми існують, а тепер трішки теорії про те, як їх зробити.
Інтуїтивно зрозуміло, що потрібно вивести значення змінної, де зберігається частковий код програми. Чому частковий? Тому що саме привласнення змінної теж має опинитися у значенні змінної. Іншими словами, значення змінної має копіювати саме себе, через що виникає нескінченна рекурсія. Неприємний момент.
Щоб виправити становище, взагалі не вноситимемо в змінну сам факт присвоєння. Тобто:
Після, під час висновку підставимо значеннязу її визначення. Добре, але виникає проблема з лапками. Мови, в яких визначено одинарні та подвійні лапки, справляються з проблемою добре (ми говоримо про те, що можна створити змінну q=" ' ", а потім вивести її значення в їївизначення), але що робити, наприклад, з мовою С? Екранування, очевидно, не допоможе, тому що його теж треба екранувати… У цьому випадку можна задати лапки кодом символу та вивести його.
Тепер залишається проблема вставки рядка у вихідний рядокз. Тут згадаємо про printf і всю його міць.
Найчастіше методи взяття підрядка вміють брати її остаточно:
Ми не позбавлятимемо вас задоволення написати власний куайн, але покажемо кілька екзотичних прикладів.
Вищий пілотаж
Куайн, що виводить власний код, це, звісно, добре. Але як вам ідея куайна, який пише інший код, що є куайном. Причому результатом роботи останнього є первісний куайн! Заманливо, чи не так?
Такі програми називаютьсяцепні куайни, і на сьогоднішній день, найбільший ланцюговий куайн (довжина ланцюга вже досягла 100 мов) написаний японцем Юсуке Ендо.
Для того, щоб працювало:
Ну і відповідно результат кожної програми потрібно запускати самим:
Нескладно переконатися в тому, що результатом цього ланцюга є початкова програма.
Так, мови програмування в куайні розташовані в алфавітному порядку.