Самый простой способ избавиться от этого - это очень хорошо работает -
Пример:
<script>
function loadUrl(location)
{
this.document.location.href = location;
}</script>
<div onclick="loadUrl('company_page.jsp')">Abc</div>
Это работает очень хорошо. Приветствия
Кроме cheatingВ№ нет никакого различия между скомпилированными и интерпретируемыми языками.
универсальный доступ к quines является довольно свободным. Во-первых, независимо от того, что программа похожа, в какой-то момент она должна распечатать что-то:
print ...
Однако, что это должно распечатать? Самостоятельно. Таким образом, это должно распечатать команду "печати":
print "print ..."
, Что это должно распечатать затем? Ну, тем временем программа выросла, таким образом, она должна распечатать строку, запускающуюся с "печати", также:
print "print \"print ...\""
Теперь программа выросла снова, таким образом, существует снова больше для печати:
print "print \"print \\\"...\\\"\""
И так далее. С каждым добавленным кодом существует больше кода для печати. Этот подход нигде не добирается, но он показывает интересный шаблон: строка "печать \"" повторяется много раз. Было бы хорошо поместить повторяющуюся часть в переменную:
a = "print \"" print a
Однако программа, просто измененная, таким образом, мы должны скорректировать a:
a = "a = ...\nprint a" print a
, Когда мы теперь пытаемся заполнить "...", мы сталкиваемся с теми же проблемами как прежде. В конечном счете мы хотим записать что-то вроде этого:
a = "a = " + (quoted contents of a) + "\nprint a" print a
, Но это не возможно, потому что, даже если у нас была такая функция quoted()
для заключения в кавычки, существует все еще проблема, которую мы определяем a
с точки зрения себя:
a = "a = " + quoted(a) + "\nprint a" print a
, Таким образом, единственная вещь, которую мы можем сделать, помещает заполнителя в [1 113]:
a = "a = @\nprint a" print a
И это - целый прием! Что-либо еще теперь ясно. Просто замените заполнителя заключенным в кавычки содержанием [1 114]:
a = "a = @\nprint a" print a.replace("@", quoted(a))
, Так как мы изменили код, мы должны скорректировать строку:
a = "a = @\nprint a.replace(\"@\", quoted(a))" print a.replace("@", quoted(a))
И вот именно! Все quines на всех языках прокладывают себе путь (кроме обмана).
ну, необходимо удостовериться, чтобы Вы заменили только первое вхождение заполнителя. И если Вы используете держателя второго места, можно постараться не должными быть заключить строку в кавычки.
, Но это - незначительные проблемы и легкий решить. Если факт, реализация [1 115] и replace()
являются единственными деталями, по которым действительно отличаются различные quines.
В№, заставляя программу считать ее исходный файл
Существует несколько различных стратегий к записи quines. Очевидный должен просто написать код, который открывает код и распечатывает его. Но более интересные включают функции языка, которые допускают самовстраивание, как %s-стиль printf функция на многих языках. Необходимо выяснить, как встроить что-то так, чтобы это закончило тем, что разрешило к запросу быть встроенным. Я подозреваю, как палиндромы, большой метод проб и ошибок включен.
Также Вы могли учиться, как Базовая военная игра работает. Это был бы хороший пример, я думаю.
Обычный подход (когда Вы не можете обмануть*) должен записать что-то, что кодирует его источник в строковой константе, затем распечатывает ту константу дважды: Однажды как строковый литерал, и однажды как код. Это двигается "каждый раз, когда я пишу строку кода, я должен записать другому для распечатывания ее!" проблема.
'Обман' включает: - Используя интерпретируемый язык и просто загрузку источника и печать его - файлы 0 байтов длиной, которые являются правильными на некоторых языках, такими как C.
Одна идея думать о кодировании и как дать чему-то двойное значение так, чтобы это могло использоваться для вывода чего-то в нескольких формах. Существует также протест, что этот тип проблемы идет с ограничениями, чтобы мешать, поскольку без любых правил кроме программы производит себя, пустая программа является решением.
Для забавы я придумал один в Схеме, которой я довольно гордился в течение приблизительно 5 минут, пока я не обнаружил, был обнаружен прежде. Так или иначе существует небольшая модификация к "правилам" игры лучше значить дуальность данных и кода в Lisp: вместо того, чтобы распечатать источник программы, это - S-выражение, которое возвращает себя:
((lambda (x) (list x `',x)) '(lambda (x) (list x `',x)))
один на Википедию имеет то же понятие, но с немного отличающимся (более подробный) механизм для заключения в кавычки. Мне нравится мой лучше все же.
Можно найти довольно много решений этого здесь: http://forums.thedailywtf.com/forums/p/5232/147528.aspx