स्रोत कोड कायापलट


29

mbomb007 ने हमें एक स्वयं परिवर्तन कार्यक्रम बनाने के लिए कहा । इसकी एक दिलचस्प चुनौती है, लेकिन मैं व्यक्तिगत रूप से अपने कार्यक्रमों को आत्म-उत्परिवर्तित करने के लिए प्रोत्साहित करना पसंद नहीं करता। मुझे यह सोचना पसंद है कि, हर कार्यक्रम के दिल में एक खूबसूरत तितली है जो बाहर तोड़ने के लिए इंतजार कर रही है।

जैसे, मेरी पहली बार कोड गोल्फ चुनौती के लिए, मैं एक तितली को स्टैक एक्सचेंज को चुनौती देता हूं। आपके प्रोग्राम को अपने कोड को इनपुट और आउटपुट के रूप में स्वीकार करना चाहिए, उसके I am a caterpillar!बाद कोड उसी भाषा में किसी अन्य प्रोग्राम के लिए होगा (आप आउटपुट के बीच कोई डिवाइडर लगा सकते हैं या नहीं ... लेकिन हम तितलियों की बात कर रहे हैं, इसलिए प्रिटीनेस मायने रखता है!)। यह दूसरा कार्यक्रम आउटपुट होना चाहिएI am a beautiful butterfly!

कायापलट: इस कार्यक्रम को खुद को संशोधित करना चाहिए, यही कारण है कि इसे स्वयं इनपुट के रूप में पारित किया जा रहा है। मैं एक उबाऊ नेस्टेड प्रोग्राम नहीं चाहता, जो कि एक प्रिंट स्टेटमेंट हो, जो प्रिंट I am a caterpillar!सोर्स कोड के बाद हो। आपको स्वयं कोड को मेटामॉर्फ करना होगा, इसलिए सबसे उबाऊ स्वीकार्य उत्तर वह है जो प्रिंट करता है I am a caterpillar, फिर इनपुट से एक स्ट्रिंग निकलता है (जो कोड होता है) और प्रिंट करता है। बेशक, यह लिखने के लिए बहुत मुश्किल आवश्यकता है, इसलिए इसे "चुनौती की भावना" के रूप में सोचा जाना चाहिए। औपचारिक आवश्यकता "आपके कार्यक्रम के रूप में यदि आपके प्रोग्राम को उसी लंबाई की एक यादृच्छिक स्ट्रिंग दी जाती है, I am a butterflyतो दूसरे प्रोग्राम को चलाने पर मुद्रण की 5% से कम संभावना होनी चाहिए ।"

सारांश:

  • एक प्रोग्राम लिखें, जो इनपुट के रूप में अपना कोड प्रदान करते समय प्रिंट करता है, I am a caterpillar!जिसके बाद स्रोत कोड का एक ब्लॉक होता है (उनके या नहीं के बीच एक सीमांकक के साथ)।
  • स्रोत कोड का यह दूसरा ब्लॉक, जब उसी भाषा के रूप में संकलित / व्याख्या की जाती है, प्रिंट करता है I am a beautiful butterfly!
  • यदि आपके प्रोग्राम को इनपुट के रूप में अपना स्वयं का सोर्स कोड नहीं दिया गया है, और इसके बजाय वर्णों का एक यादृच्छिक स्ट्रिंग दिया गया है जो अपने स्वयं के कोड से मेल नहीं खाता है, तो परिणाम को I am a butterfly!कम से कम 95% यादृच्छिक के लिए संकलन / व्याख्या करने में विफल होना चाहिए, या प्रिंट नहीं करना चाहिए। तार (आत्मा: आपको इनपुट से अपने स्वयं के स्रोत कोड को पढ़ने की उम्मीद है, और इसे एक तितली में एक साथ सिलाई करें)।
    • मैं आपको यह साबित करने में सहज नहीं हूं, इसलिए जब तक आप कायापलट विचार की भावना को पकड़ रहे हैं, अपने स्वयं के कोड को संशोधित कर रहे हैं, लेकिन यदि आप अपने इनपुट का उपयोग करके काम करने के लिए लूपोल गेम खेलने की कोशिश कर रहे हैं, तो उम्मीद करें सिद्ध करने के लिए।
  • मानक खामियां लागू होती हैं

मैं चाहता हूँ कि उनकी सुंदरता का अंदाज़ा लगाया जाए, लेकिन यह एक निश्चित रूप से गैर-मात्रात्मक दृष्टिकोण है, इसलिए सामान्य "बाइट्स" मार्ग का उपयोग न्याय करने के लिए किया जा सकता है

बोनस : -20% - किसी भी 3 अक्षर स्ट्रिंग को चुनें जो आपके कार्यक्रम के पहले 3 अक्षरों से मेल नहीं खाती है। यदि मैं कैटरपिलर प्रोग्राम चलाता हूं, लेकिन इनपुट को संशोधित करता हूं ताकि पहले 3 चरित्र निर्दिष्ट लोगों में बदल जाएं, I am Batman!इसके बजाय प्रिंट करें । हमेशा बैटमैन बनो। ( एक ही यादृच्छिक स्ट्रिंग नियम इसके लिए लागू होते हैं ... कायापलट! )

तुच्छ उदाहरण (अजगर):

"""
    print "I am a beautiful butterfly!"
    #print "I am Batman!"
"""
import sys
code = sys.stdin.read()
if code.startswith("YYZ"):
   # swap the comments between the print statements
   code = code.replace("#print", "_a").replace("print", "#print").replace("_a", "print")
code = [3:] # remove """ or XYZ
code = code.split('"""')[0]
print "I am a caterpillar!"
print code

एक नोट के रूप में: मैं आस्की कला कार्यक्रमों को देखना पसंद करूंगा जहां यह पहली बार एक कैटरपिलर की तरह दिखता है, और अगले चरण में आस्की तितली में बदल जाता है, लेकिन यह चुनौती की तुलना में काफी अधिक उन्नत है।
कोरट अमोन -

यदि किसी प्रोग्राम में कई फाइलें हैं तो हमें क्या करना चाहिए?
TheNumberOne

@ TheNumberOne मैं उत्सुक हूँ कि आपने वहाँ क्या योजना बनाई है! मैं नहीं जानता कि क्या मैं उस परिणाम के लिए नियमों को हरा देना चाहता हूं, बिना परिणामों को देखे, लेकिन यह मुझे लगता है कि, यदि आप इनपुट के रूप में फ़ाइलों के एक बहु-भाग सेट को स्वीकार करना चाहते थे (बल्कि एक एकल फ़ाइल के बजाय सामग्री), और आप आउटपुट के एक बहु-भाग सेट (एक एकल आउटपुट के बजाय) को आउटपुट करने के लिए थे, फाइलों के बीच एक आधा-उचित डेलीनेटर के साथ, मुझे लगता है कि एक उचित समाधान होना चाहिए। यदि वह आपके लिए काम नहीं करता है, तो मुझे एक नियम को बेहतर बनाने के लिए आपके प्रस्तावित समाधान में अधिक जानकारी की आवश्यकता हो सकती है।
कोरट अमोन -

@ TheNumberOne और टाइपो कैच के लिए धन्यवाद। वह टाइपो बहुत स्पष्ट रूप से एक सुंदर तितली नहीं थी!
कोरट अमोन -

जवाबों:


63

Befunge-98, 602 बाइट्स

                                        "^@<"v@@
                                     "'I'"00v>00g::
                                   "@v"0v@@@>g::a">#"
                                 "a">v@@>      0g::'"1>                                 /
                             ":\"'"v@>            'm'"00g:a                       >"@v$"
 "lufituaeb"'"'v00ga"@v\"'":'b\00v@>                :'a\":*84>"00ga"\>@@@@_,#:>"00g:a'<'"
"et"'"'va'v'":'l\00g5k:'""y!">>v@>                    g::'''""ut"'"'>a'<'""fr"'"00g3k:'">
 "ma"00g>'I~48*-~48*-+#@_>:#,_@>                        '"aa"---"aa"!rallipretac"00g:'a\

PyFunge में परीक्षण किया गया।

जब एक स्ट्रिंग के साथ 2 रिक्त स्थान शुरू नहीं होता है (संभावना 95% से अधिक है जब यादृच्छिक) कुछ भी नहीं आउटपुट करता है। यह वही नहीं है जो ओपी देख रहा है, लेकिन विनिर्देश फिट बैठता है।

जब एक स्ट्रिंग 2 स्थानों से शुरू होती है (जैसे स्वयं) यह आउटपुट करता है:

I am a caterpillar!

---

"!y"       "l"v
v"te"     "rf"<
>"tu"'   "b"\v@
 v"beautiful"<
  >:#,_@@@@>\
 >48*:"a"\:$v@
  "ma"   v@#>
   'I'   <@^

उसका निचला हिस्सा, बदले में, आउटपुट:

I am a beautiful butterfly!

2
वाह। ये अद्भुत है।
एक

3
मुझे पता था कि कोई भी आपके जैसे नियमों को आगे बढ़ाना चाहेगा; मुझे खुशी है कि इसमें से कुछ सुंदर आया =)
कोरट अमोन - पुनः मोनिका

कैटरपिलर और तितली दोनों दिखते हैं जैसे वे मैट्रिक्स में फंस गए हैं। सुंदर!
एरनो

मैं इसे कहाँ चला सकता हूँ?
user1514631

3
मैं यह कभी नहीं समझ पाऊंगा कि कोड गोल्फ में आप कितने अच्छे लोग हैं जो इस तरह के खूबसूरत मठों का निर्माण करते हैं।
क्रिस साइरफाइस

19

PHP, 74 बाइट्स

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=के बराबर है <?php echoऔर आउटपुट के लिए कई अल्पविराम से अलग मान ले सकता है
  • ¶ßž’ßžßऔर šžŠ‹–™Š“ߊ‹‹š™“†ÞPHP में मान्य निरंतर नाम हैं, लेकिन क्योंकि स्थिरांक मौजूद नहीं हैं, उन्हें स्ट्रिंग शाब्दिक माना जाता है। ~उन्हें ( "I am a "और "beautiful butterfly!"एक उद्धरण चिह्न प्रत्येक के लिए एक बाइट को बचाने के लिए) का विरोध करता है
  • strtr"कैटरपिलर!" "एक सुंदर तितली!" तर्क में

2
एक स्पष्टीकरण प्रदान करने के लिए देखभाल?
टिमवी

@ टिमिमा कोई समस्या नहीं है, स्पष्टीकरण जोड़ा गया
फेबियन शेंगलर

मैं पूरी तरह से किसी को ROT13 जैसी चीज़ के साथ "सुंदर तितली" को एनकोड करने की उम्मीद करता हूं, लेकिन PHP के स्ट्रिंग शाब्दिक तकनीक के साथ मिलान करने का विचार कायली, चमकदार शब्दों में है!
कोरट अमोन -

7

पायथ, 50 46 बाइट्स

"I am a caterpillar!"+<z8"beautiful butterfly!

व्याख्या

"I am a caterpillar!"        print "I am a caterpillar!"
 z<8                         first 8 chars of input
+   "beautiful butterfly!    add "beautiful butterfly!" to that and print

परिणामी स्रोत कोड है

"I am a beautiful butterfly!

जो मूल रूप से पाठ को प्रिंट करता है।


6

पर्ल 6, 60 56 बाइट्स

say "I am a caterpillar!"; s/\S+\!/beautiful butterfly!/

आवश्यकता है -p ठीक से चलाने के लिए; मैंने इसके लिए बाइट काउंट में हिसाब लगाया है। अफसोस की बात यह है कि पर्ल 6 में गिरावट का एक सिंटैक्स यह है कि अब और अधिक सख्त ...


कायापलट के दौरान कैटरपिलर कमजोर होते हैं। यही कारण है कि वे खुद को c̶o theyc̶o̶o̶n̶sables चर में लपेटना पसंद करते हैं: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(मैं मान रहा हूं कि Perl 6 पर्ल को 5 जैसे नंगे पासवर्ड की अनुमति देता है no strict 'subs'और s///LHS पर चर को इंटरपोलेट करता है।)
ThisSiIsBlackNot

हुंह, यह मज़ेदार है। मैंने कोशिश की कि और किसी कारण से जब मैंने wc किया तो उसने मुझे उतनी ही बाइट दी। लेकिन फिर से टाइप करने पर इसने मुझे कम बाइट्स दीं। अजीब।
एक स्पेगेटो

अरे रुको नहीं, मुझे याद है कि मैंने ऐसा क्यों नहीं किया। नया कोड चलाते समय यह सुंदर और तितली के बीच की जगह के कारण एक त्रुटि फेंकता है।
एक स्पेगेटो

आह, मैंने कभी पर्ल 6 का उपयोग नहीं किया है इसलिए आप वहां मदद नहीं कर सकते। मैं वास्तव में सिर्फ एक मजाकिया टिप्पणी करने का बहाना चाहता था। ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/छोटा है और निश्चित रूप से पर्ल 6. में काम करेगा
ThisSuitIsBlackNot

1
@ThisSuitIsBlackNot यह चुनौती फिट नहीं है। नियम केवल यह सुनिश्चित करने के लिए थे कि आप वास्तव में अपना कोड पढ़ें और संशोधित करें। अंत में, वास्तविक आत्मा कोड के दिल में सुंदर तितली को मुक्त करने की कोशिश कर रही है। सौंदर्य, ज़ाहिर है, देखने वाले की नज़र में है। हम प्रत्येक अलग-अलग समाधानों को दूसरों की तुलना में कम या ज्यादा सुंदर पाएंगे। PerL में समाधान के लिए के रूप में, अच्छी तरह से ... चलो बस कहना है कि पर्ल सुंदर की अपनी अजीब परिभाषा है, और यह सिर्फ कुछ उद्देश्यों के अनुरूप है;;
Cort Ammon - 20-28 पर मोनिका

4

रेटिना, 53 बाइट्स

caterpillar
beautiful butterfly
^
I am a caterpillar!

प्रिंट:

I am a caterpillar!beautiful butterfly
beautiful butterfly
^
I am a beautiful butterfly!

ध्यान दें कि I am a caterpillar! नए प्रोग्राम के बीच कोई विभाजक नहीं है । नए कार्यक्रम में कोई इनपुट नहीं होने की उम्मीद है।


3

bash/ awk/ cksum- 179.2 169.6 168 बाइट्स

awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'

डेमो:

$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am a caterpillar!
echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
$ echo|awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."10"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
I am a beautiful butterfly!

# Batman!
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> xyzawk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'
> E
I am Batman!

# Invalid input
$ awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0}'<<'E'
> awk '/^xyz/{print"I am Batman!";exit}NF{("cksum<<<'"'"'"substr($0,100))|getline r;if(r!~/^6689751/)exit}{printf"I am a %s%."!NF"s!\n",NF?"caterpillar":"beautiful"," butterfly"}NF&&sub(/!NF/,10){print"echo|"$0{'
> E

मुझे उम्मीद है कि 20% के लिए लागू होता है किसी भी स्ट्रिंग केxyz , अन्यथा मूल गणना 224 212 210 बाइट्स (निश्चित "I am Batman!"भाग) है।

परिवर्तन किया: शाब्दिक का ही घटना की जगह !NFके साथ 10, ताकि " butterfly"है भी उपयोग कर मुद्रितprintf

cksumस्रोत कोड के एक हिस्से (यानी शेष) पर एक सरल प्रदर्शन करता है , इसलिए इसकी आवश्यकता भी है।

कैविएट: पहले इनपुट के साथ समाप्त होना चाहिए 'गलत इनपुट को दबाने के लिए इतना कैविटी नहीं ...

कोई दूसरा इनपुट अपेक्षित नहीं है।


1
वाह। मैं जागते हुए व्यक्ति की प्रतीक्षा कर रहा था, और यह बात है। यह बहुत मजेदार है।
21

@jrg प्रोत्साहन के लिए धन्यवाद। :)
hjk

1

पायथन - बोनस = 147.2 के लिए 184 बाइट्स -20%

""""""
import sys;c=sys.stdin.read();print"I am a caterpillar!";x=c[3:] if"\'''"!=c[:3] else c
print x+c[:3]
""";print"I am a beautiful butterfly!" """
''';print"I am Batman";'''

प्रिंट करने के लिए I am batman, इनपुट में सिंगल कोट्स के साथ पहले तीन डबल कोट्स को बदलें। (फर्स्ट लाइन है '''""")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.