पायथन 2 , 779 801 बाइट्स
यद्यपि यह चुनौती यह दिखाने के लिए संपादित की गई थी कि आपके स्रोत को पढ़ने की अनुमति है, मैं पहले से ही इसके बिना अपना समाधान बना रहा था। इसलिए, यह दिखाने के लिए कि यह संभव है, मैंने इसे समाप्त कर दिया। स्रोत फ़ाइल का कोई पठन नहीं:
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 रैंडम संलग्न करें। प्रत्येक रन, यह एक पूर्णांक पर जोड़ रहा होगा जो कि होने वाले प्रारंभिक स्रोत में सभी परिवर्तनों को एन्कोड करता है।
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))
- संशोधित स्रोत मुद्रित करें।