Методы реализации кваы
Несколько лет назад я думал о том, как создать программу, которая печатает собственный исходный код, и я предложил следующие два подхода:
- программа печатает файл.c или.cpp на основе имени исполняемого файла (app1 печатает app1.cpp). но это не удастся, если файл.cpp находится где-то еще.
- программа "умно" использует строки (я забыл исходный код этого) и печатает сама.
Есть ли другой алгоритм, который программа может использовать для печати своего исходного кода?
4 ответа
Я думаю, что ваши два случая охватывают все варианты. Случай (1) охватывает случаи формы "загрузить исходный код программы с внешнего устройства", а случай (2) охватывает случаи формы "программный источник исходного кода". Конечно, вы можете рассмотреть гибридный подход, такой как "прочитать первую половину программы из файла, а затем сгенерировать вторую половину программно", но это, похоже, не отличается от того, что вы описали выше.
Как отметил Стив в комментариях, случай 1) обычно не считается квинемным, вероятно, потому, что это по сути тривиально в любом языке, который может выполнять файловый ввод / вывод.
Случай 2) - это то, что имеет в виду большинство людей, когда они говорят "quine", "умное использование строк" - это та часть, которой вы хвастаетесь
в некоторых языках существует третий случай (который также обычно не считается истинным квинем, поскольку он даже более тривиален, чем случай 1). Если язык позволяет правильно сформировать программу без операторов, то эта "пустая" программа обычно ничего не печатает, что, конечно, совпадает с ее исходным кодом. например, скрипт TCL:
напечатает:
;)
Программа не обязательно должна быть "исполняемым" с определенным "именем", а исходный код не обязательно должен находиться в "файле" с конкретным "именем". Все это артефакты современных операционных систем, совершенно не относящиеся к текущей работе.
char*f="char*f=%c%s%c;main()
{printf(f,34,f,34,10);}%c";
main(){printf(f,34,f,34,10);}
(в одну строку)
Есть много таких кодов в http://www.nyx.net/~gthompso/quine.htm
для меня это лучший способ: назначить код переменной и использовать его повторно.