Хоча завдання було відредаговано, щоб показати, що читання вашого джерела дозволено, я вже без цього створював своє рішення. Отже, щоб показати, що це можливо, я це закінчив. Немає читання вихідного файлу:
s='s=%r;print s%%s\nfrom random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint\nf.write("\\n".join((s%%s).split("\\n")[1:5:2]).replace("4",`map(ord,s%%s)`))\nif L>5:exec\'b=[];h=%%d\\nwhile~-h:b+=[h%%%%1000];h/=1000\\nwhile 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]\\nprint"".join(map(chr,L))\'%%1\n\nn=R(0,2);p=R(0,len(L if L>5else s%%s));r=R(0,255);f.write("%%03d"*3%%(n,p,r))';print s%s
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile 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]\nprint"".join(map(chr,L))'%1
n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))
Спробуйте в Інтернеті! (Зверніть увагу, що це не змінить джерело. Вам потрібно запустити його локально, щоб це працювало)
Для того, щоб показати , що перетворення працюють, ось тестова програма ( в даний час створено , щоб завжди вибрати 100
для r
, і виводить результат для кожної комбінації n
і p
для початкового списку.)
Пояснення:
s='s=%r;print s%%s...';print s%s...
Перший рядок - це ваша класична королева, але набагато довше, щоб враховувати те, що відбувається після.
from random import*;L=4;f=open(__file__,"wa"[L>5]);R=randint
Імпорт для випадкових цілих чисел. L
стане списком порядків вихідного коду, але спочатку це ціле число, яке не використовується ніде в джерелі, щоб дозволити заміну рядків. Відкрийте файл, щоб написати нове джерело. На пізніших програмах він відкриється для додавання замість цього.
f.write("\n".join((s%s).split("\n")[1:5:2]).replace("4",`map(ord,s%s)`))
Видаліть перший і третій рядки коду. Замініть 4
вищесказане на перелік порядків.
if L>5:exec'b=[];h=%d\nwhile~-h:b+=[h%%1000];h/=1000\nwhile 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]\nprint"".join(map(chr,L))'%1
n=R(0,2);p=R(0,len(L if L>5else s%s));r=R(0,255);f.write("%03d"*3%(n,p,r))
Шматками:
if L>5:
- Пропускає цей рядок при першому виконанні. Пізніше L
буде список, і цей запуститься. Я поясню exec
останнім, бо це не перший раз.
n
- Довільне число 0-2. Це визначає, яка модифікація відбувається (0 = вставити, 1 = замінити, 2 = видалити).
p
- Випадкова позиція у списку, на яку відбудеться модифікація.
r
- Випадкове число, яке потрібно вставити або замінити у списку
f.write("%03d"*3%(n,p,r))
- Додайте 3 randoms до кінця вихідного файлу. Кожен запуск, це буде додаватися до цілого числа, яке кодує всі зміни початкового джерела, які відбулися.
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))
- Друкуйте змінене джерело.