Ваша задача - написать программу или функцию, которая:
- При первом запуске выводит исходный код.
При последующих выполнениях он должен выводить то, что выводил ранее, но с одним случайным изменением символов (определено ниже). Это не должно быть равномерно случайное изменение, но каждое возможное изменение должно иметь ненулевую вероятность возникновения.
После первого выполнения ваша программа больше не обязательно будет quine; выходные данные будут изменены (и программа также может изменять себя).
Например, если ваш quine был ABCD
запущен повторно, он может вывести:
ABCD
A!CD
j!CD
j!CjD
Характеристики
Изменение персонажа:
- Вставка случайного символа,
- Удаление случайного символа или
- Замена персонажа новым случайным персонажем. Обратите внимание, что новый символ может быть таким же, как тот, который он заменяет, в этом случае никаких изменений не будет.
Конечно, удаление или замена символа из пустой строки не является допустимым изменением.
- Несмотря на пометку quine , правила против чтения вашего исходного кода не применяются.
Вы можете использовать любой набор символов, если он включает символы, используемые в вашем исходном коде.
Ответы:
Python 3 ,
288 270 224 212 195 196 194 180 178168 байтПопробуйте онлайн!
После печати исходного кода файла на первой итерации мы добавляем дополнительную строку для установки x в новый исходный код, а не m.
Объяснение:
Предполагая, что
hash
возвращается равномерно случайное число, существует вероятность 1/6 вставки нового символа, 1/6 вероятности изменения существующего символа и 2/6 вероятности удаления символа. Каков оставшийся 2/6 шанс, который вы спросите? Почему, это ничего не делает 2/6 времени!(Вот программа проверки, адаптированная из ответов mbomb007 . Попробуйте онлайн! )
источник
f=__file__
что поможет на первом этапе тоже.Python 3 ,
205195 байтПопробуйте онлайн!
Хотел попробовать версию, которая не читает исходный код. Получилось неплохо, как я и думал, и только 30 или около того байтов за версию, которая делает . Объяснение того, как это работает, в основном совпадает с другим ответом, но инициализирует x по-другому, поскольку не может просто прочитать исходный код.
источник
Python 2 ,
779801 байтХотя задача была отредактирована, чтобы показать, что чтение вашего источника разрешено, я уже создавал свое решение без этого. Итак, чтобы показать, что это возможно, я закончил. Нет чтения исходного файла:
Попробуйте онлайн! (Обратите внимание, что это не изменит источник. Вы должны запустить его локально, чтобы это работало)
Для того, чтобы показать , что преобразования работают, вот тестовая программа ( в настоящее время создано , чтобы всегда выбрать
100
дляr
, и выводит результат для каждой комбинацииn
иp
для первоначального списка.)Объяснение:
Первая строка - это ваша классическая квинна, но намного длиннее, чтобы учесть, что будет после.
Импорт для случайных целых чисел.
L
станет списком ординалов исходного кода, но изначально это целое число, которое не используется нигде в источнике для замены строки. Откройте файл, чтобы написать новый источник. При последующих запусках он откроется для добавления.Удалите первую и третью строки кода. Замените
4
вышеприведенное списком порядковых чисел.По кусочкам:
if L>5:
- пропускает эту строку при первом исполнении. ПозжеL
будет список, и это запустится. Я объяснюexec
последнее, потому что это не в первый раз.n
- случайное число 0-2. Это определяет, какая модификация происходит (0 = вставить, 1 = заменить, 2 = удалить).p
- Случайная позиция в списке, в которой произойдет изменение.r
- случайное число для вставки или замены в спискеf.write("%03d"*3%(n,p,r))
- Добавьте 3 ранда в конец исходного файла. При каждом запуске это будет добавление к целому числу, которое кодирует все произошедшие изменения в исходном источнике.exec'b=[];h=%d...'%1...
- Получить случайные числа (найденные позже%1
при последующих запусках), применить изменения к списку и распечатать.while~-h:b+=[h%%1000];h/=1000
- Составьте список рандомов, сгенерированных до сих пор, с учетом лидирующих1
, что предотвращает проблемы с лидирующими нулями.while b:r,p,n=b[-3:];b=b[:-3]
- Назначьте случайные числа для этой итерации.L=[L[:p]+L[p+1:],L[:p]+[r]+L[p+n:]][n<2if L else 1]
- (0 = вставить, 1 = заменить, 2 = удалить)print"".join(map(chr,L))
- Распечатайте измененный источник.источник
p
может быть длина строки. Кроме того, каково поведение с пустой строкой?Of course, deleting or replacing a character from an empty string is not a valid change
Java 10, 370 байт
Попробуйте онлайн.
Объяснение:
Общее объяснение:
quine -part:
s
содержит неформатированный исходный код.%s
используется для ввода этой строки в себя с помощьюs.format(...)
.%c
,%1$c
И34
используются для форматирования двойных кавычек.%%
используется для форматирования по модулю%
).s.format(s,34,s)
складывает все это вместе.Здесь основная программа Java Quine.
Задача часть:
String s;
это исходный код, который мы изменим на уровне класса.int r=s.length();r*=Math.random();
используется для выбора случайного индекса исходного кода в диапазоне[0, length_of_modified_source_code)
.char c=127;c*=Math.random();
используется для выбора случайного символа ASCII (включая непечатаемые) в диапазоне Unicode[0, 126]
.c%3
используется для выбора случайной опции 0, 1 или 2. Опция 0 добавит случайный символ перед индексомr
; опция 1 заменит символ в индексеr
случайным символом; и вариант 2 удалит символ в индексеr
.источник