Обновление:
Хорошо, с таким же успехом можно сделать автозапуск. Наслаждайтесь безумием. Беги на свой страх и риск.
Да, это возможно, потому что я действительно это написал. Он не выполняет роль RUN (это просто слишком безумно, потому что, как уже упоминали другие, это вызовет бесконечный цикл), , но вот оно: Quine.java
import java.io.*;
public class Quine {
public static void main(String[] args) throws Exception {
char q = 34;
String out = "Quine$";
String text = (
"import java.io.*; " +
"public class [OUT] { " +
"public static void main(String[] args) throws Exception { " +
"char q = 34; String out = `[OUT]$`; String text = `[TEXT]`; " +
"PrintWriter pw = new PrintWriter(out + `.java`); " +
"pw.format(text, 34, out, text); " +
"pw.close(); Runtime runtime = Runtime.getRuntime(); " +
"runtime.exec(`javac ` + out + `.java`).waitFor(); " +
"runtime.exec(`java ` + out); " +
"} " +
"}"
).replace("`", "%1$c").replace("[OUT]", "%2$s").replace("[TEXT]", "%3$s");
PrintWriter pw = new PrintWriter(out + ".java");
pw.format(text, 34, out, text);
pw.close();
Runtime runtime = Runtime.getRuntime();
runtime.exec("javac " + out + ".java").waitFor();
runtime.exec("java " + out);
}
}
Вот как начать сумасшествие:
javac Quine.java
для компиляции
java Quine
чтобы запустить его
- Он будет производить, компилировать и запускать
Quine$
- Я убедился, что
Quine.java
максимально читаемо, поэтому основное отличие от Quine$.java
- форматирование и 3x replace
. незначительное различие заключается в том, что Quine$.java
имеет out
, установленное в Quine$$
.
Quine$
будет производить, компилировать и запускать Quine$$
Quine$$
будет производить, компилировать и запускать Quine$$$
Quine$$$
будет производить, компилировать и запускать Quine$$$$
- ...
Обратите внимание, что это не делает никакого обратного инжиниринга или обмана, читая исходный код .java
и т. Д. Quine
является генератором квин, потому что он производит другой код, отформатированный по-другому, но Quine$
является в значительной степени настоящая самодостаточная квинна: она воспроизводит себя, просто переименовывает ее Quine$$
(которая воспроизводит себя и соотносит с Quine$$$
и т. д.).
Так что технически нет бесконечного цикла: он в конечном итоге остановится, когда файловая система не сможет обработать другой $
. Мне удалось вручную остановить безумие, принудительно удалив все Quine$*
файлы, но запустить на свой страх и риск !!!