Подтвердить что ты не робот

Может ли программа выводить свою копию

Я думаю, что это может быть классический вопрос, но я не знаю ответа. Может ли программа выводить собственную копию, и если да, есть ли короткая программа, которая делает это?

Я не принимаю "пустую программу" в качестве ответа, и я не принимаю программы, у которых есть доступ к исходному коду. Скорее, я думаю примерно так:

int main(int argc, char** argv){ printf("int main(argc, char** argv){ printf...

но я не знаю, как продолжить...

4b9b3361

Ответ 1

Да. Программа, которая может сделать свою копию, называется "quine".

Основная идея большинства Quine является:

  1. Вы пишете код, который принимает строковый литерал s и печатает его, заменяя вхождения (или вхождения) специальной подстроки foo в s значением самого s.

  2. Вы берете весь исходный код программы и используете его как определение для s. но вы исключаете определение s из строки, вместо этого заменяя его на foo.

Это общая идея. Остальное - детали форматирования строк, правда.

Ответ 3

Это называется Quine:

Quine - это компьютерная программа, которая не принимает входных данных и создает копию собственного исходного кода в качестве единственного выхода. Стандартные термины для этих программ в теории вычислимости и литературы в области информатики - это программы самовоспроизводства, самовоспроизводящиеся программы и программы самокопирования.

Quine - это фиксированная точка среды исполнения, когда среда выполнения рассматривается как функция. Куайны возможны на любом полном языке программирования Тьюринга, как прямое следствие теоремы рекурсии Клейна. Для развлечения программисты иногда пытаются разработать кратчайший возможный quine на любом заданном языке программирования.

Источник: Википедия

Ответ 4

Это действительно классический вопрос!

Помимо существования специфического quines, важным результатом теории вычислимости является то, что для любой функции, которую вы могли бы вычислить, существует программа, которая "знает свой собственный текст программы", то есть может печатать, если это необходимо. Эта теорема называется вторая рекурсивная теорема Клейна.

Ответ 6

Если вы пишете quine, будьте осторожны, чтобы копии также не записывали копии самих объявлений до бесконечности и в конечном итоге захватывали мир.

Ответ 7

В языке, изобретенном Джоном Скитом, следующий оператор печатает "Hello, world!\n".

h

Я могу внести изменения в этот язык, чтобы следующая программа печатала "Hello, world!\n":

Hello, world!

Итак, программа, которая печатает себя.

О, вы чувствуете что-то странное в этом отношении, в то время как оно имеет точное и правильное математическое определение? Это ваша проблема. "Я не соглашусь..." ха! Математика не принимает, и она хозяйка, которой я служу, поэтому я отправляю этот ответ.

Ответ 8

Я предполагаю, что вы разрешаете интерпретировать языки. (На каком-то уровне интерпретируются все языки.) Кто-то пишет интерпретатор, и если вы его пишете, вы можете добавить к нему любые встроенные функции, такие как функция (lispy) (foo), которая ничего не делает, кроме напечатать "(foo)".

Или вы можете добавить более сложную функцию макро-типа (printMeAndMyArgs ...).

Итак, фокус в том, как вы определяете проблему.

Ответ 9

Майкл Сипперс "Введение в теорию вычислений" объясняет в одной из глав, как построить quine. Недавно я написал программу на Java, основанную на этой идее, и разместил ее по адресу: http://bornagainprogrammer.net/2009/11/07/hello-world-from-the-tm-self/

Я бы посоветовал вам завладеть этой книгой и попробовать реализовать программу самостоятельно на своем любимом языке. В этой книге есть много других забавных теорем.

-kiran

Ответ 10

// save it as file.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    system("cat file.cpp"); 
    return 0;
}

Ответ 11

Это возможно в Java, но с некоторыми ограничениями.

Я написал простой код в Java, который печатает сам. Вы можете использовать литералы C/C++, чтобы использовать ту же программу. Вы можете добавить в эту программу все, что захотите, она полностью распечатается.

условия

  1. Файл Java не должен быть внутри какого-либо пакета

  2. Структура папок не должна содержать папок с пробелами в названии

  3. Цель компиляции должна быть по умолчанию или той же папке, где находится файл Java

    import java.io.FileInputStream;
    import java.net.URL;
    
    
    public class PrintYourself {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            URL location = PrintYourself.class.getProtectionDomain().getCodeSource().getLocation();
            String path=location.getFile();
            path=path.replace("/bin", "/src");
            System.out.println(path);
    
            try{
                FileInputStream st=new FileInputStream(path+"PrintYourself.java");
                int i=0;
                while((i=st.read())!=-1){
                    System.out.print((char)i);
                }
                st.close();
            }
            catch(Exception e){
                System.out.println(e);
            }
    
        }
    }