การเปลี่ยนแปลงรหัสที่มา


29

mbomb007 ขอให้เราทำให้โปรแกรมการทำร้ายร่างกายตนเอง มันเป็นความท้าทายที่น่าสนใจ แต่โดยส่วนตัวแล้วฉันไม่ชอบที่จะสนับสนุนให้โปรแกรมของฉันกลายเป็นการทำร้ายตนเอง ฉันชอบคิดว่าหัวใจของทุกโปรแกรมคือผีเสื้อที่สวยงามรออยู่

เช่นนี้สำหรับการแข่งขันกอล์ฟ Code แรกของฉันฉันท้าทาย Stack Exchange เพื่อแปรสภาพผีเสื้อ โปรแกรมของคุณควรยอมรับรหัสของตัวเองเป็นอินพุทและเอาท์พุทI am a caterpillar!ตามด้วยรหัสสำหรับโปรแกรมอื่นในภาษาเดียวกัน (คุณอาจใส่ตัวแบ่งระหว่างเอาท์พุทหรือไม่ ... แต่เรากำลังพูดถึงผีเสื้อ โปรแกรมที่สองนี้ควรส่งออกI am a beautiful butterfly!

การเปลี่ยนแปลง: โปรแกรมนี้ควรแก้ไขตัวเองซึ่งเป็นสาเหตุที่มันถูกส่งตัวเองเป็นอินพุต ฉันไม่ต้องการโปรแกรมซ้อนที่น่าเบื่อที่ไม่มีอะไรนอกจากคำสั่งพิมพ์I am a caterpillar!ตามด้วยการพิมพ์ซอร์สโค้ด คุณต้องเปลี่ยนรหัสตัวเองดังนั้นคำตอบที่น่าเบื่อที่สุดที่ยอมรับได้คือคำตอบที่พิมพ์I am a caterpillarแล้วฉีกสตริงออกจากอินพุต (ซึ่งเกิดขึ้นเป็นรหัส) และพิมพ์นั้น แน่นอนว่านี่เป็นข้อกำหนดเล็กน้อยในการเขียนดังนั้นควรคิดว่าเป็น "วิญญาณแห่งความท้าทาย" ข้อกำหนดอย่างเป็นทางการจะได้รับการตั้งค่าที่ "หากโปรแกรมของคุณได้รับสตริงสุ่มที่มีความยาวเท่ากับโปรแกรมของคุณควรมีโอกาสน้อยกว่า 5% ในการพิมพ์I am a butterflyเมื่อรันโปรแกรมที่สอง"

สรุป:

  • เขียนโปรแกรมซึ่งเมื่อให้รหัสของตัวเองเป็นอินพุทแล้วพิมพ์I am a caterpillar!ตามด้วยบล็อกของซอร์สโค้ด
  • บล็อกที่สองของซอร์สโค้ดเมื่อรวบรวม / ตีความเป็นภาษาเดียวกันพิมพ์ I am a beautiful butterfly!
  • หากโปรแกรมของคุณไม่ได้รับรหัสที่มาของตัวเองเป็นอินพุตและจะได้รับสตริงอักขระแบบสุ่มที่ไม่ตรงกับรหัสของตัวเองผลลัพธ์จะต้องล้มเหลวในการรวบรวม / ตีความหรือไม่พิมพ์I am a butterfly!อย่างน้อย 95% ของการสุ่ม สตริง (วิญญาณ: คุณคาดว่าจะอ่านซอร์สโค้ดของคุณเองจากอินพุตและต่อเข้าด้วยกันเป็นผีเสื้อ)
    • ฉันสบายใจกับคุณที่ไม่ได้พิสูจน์สิ่งนี้ตราบใดที่คุณยังคงยึดมั่นในจิตวิญญาณของความคิดการเปลี่ยนแปลงการปรับเปลี่ยนรหัสของคุณเอง แต่ถ้าคุณกำลังพยายามเล่นเกมช่องโหว่เพื่อหลีกเลี่ยงการใช้อินพุตของคุณ เพื่อพิสูจน์มัน
  • ช่องโหว่มาตรฐานใช้

ฉันต้องการให้สิ่งเหล่านี้ตัดสินโดยความสวยงามของพวกเขา แต่นั่นเป็นวิธีการที่ไม่ใช่เชิงปริมาณอย่างเด็ดขาดดังนั้นเส้นทาง "จำนวนไบต์" ปกติจึงสามารถใช้ตัดสินได้

โบนัส : -20% - เลือกสตริงตัวอักษร 3 ตัวที่ไม่ตรงกับตัวอักษร 3 ตัวแรกของโปรแกรม หากฉันรันโปรแกรม caterpillar แต่แก้ไขอินพุตเพื่อให้อักขระ 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

ตามที่ทราบ: ฉันชอบที่จะดูโปรแกรมศิลปะ ASCII ซึ่งดูเหมือนว่าหนอนในครั้งแรกและกลายเป็นผีเสื้อ ASCII ในระยะต่อไป แต่มันค่อนข้างสูงกว่าความท้าทายเล็กน้อย
Cort Ammon - Reinstate Monica

เราควรทำอย่างไรหากโปรแกรมมีหลายไฟล์?
TheNumberOne

@TheNumberOne ฉันอยากรู้ว่าคุณวางแผนไว้ที่นั่น! ฉันไม่รู้ว่าฉันต้องการเอาชนะกฏเกณฑ์สำหรับสิ่งนั้นทันทีโดยไม่เห็นผลที่ตามมาหรือไม่ แต่ดูเหมือนว่าสำหรับฉันถ้าคุณต้องยอมรับชุดไฟล์หลายส่วนเป็นอินพุต (แทนที่จะเป็นไฟล์เดียว เนื้อหา) และคุณต้องส่งออกชุดเอาต์พุตหลายส่วน (แทนที่จะเป็นเอาต์พุตเดียว) โดยมีตัวคั่นครึ่งตัวที่เหมาะสมระหว่างไฟล์ฉันคิดว่าควรเป็นทางออกที่สมเหตุสมผล หากวิธีนี้ไม่ได้ผลสำหรับคุณฉันอาจต้องการข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับโซลูชันที่คุณเสนอเพื่อสร้างกฎให้ดีขึ้น
Cort Ammon - Reinstate Monica

@TheNumberOne และขอขอบคุณสำหรับการสะกดผิด พิมพ์ผิดนั้นไม่ชัดเจนว่าเป็นผีเสื้อที่สวยงาม!
Cort Ammon - Reinstate Monica

คำตอบ:


63

Befunge-98, 602 bytes

                                        "^@<"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% เมื่อสุ่ม) จะไม่แสดงผลใด ๆ นี่ไม่ใช่สิ่งที่ OP ต้องการ แต่ตรงกับสเปค

เมื่อผ่านสตริงที่เริ่มต้นด้วย 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
ฉันรู้ว่ามีคนต้องการผลักดันกฎเหมือนที่คุณทำ ฉันดีใจที่มีบางสิ่งที่สวยงามออกมาจากมัน =)
Cort Ammon - Reinstate Monica

ทั้งตัวหนอนและผีเสื้อดูเหมือนว่าพวกมันติดอยู่ในเมทริกซ์ สวย!
Erno

ฉันจะเรียกใช้สิ่งนี้ได้ที่ไหน
user1514631

3
ฉันจะไม่เข้าใจว่าคุณเป็นคนดีที่ Code Golf จัดการเพื่อสร้างความประหลาดใจที่สวยงามเช่นนี้ได้อย่างไร
Chris Cirefice

19

PHP, 74 ไบต์

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=เทียบเท่า<?php echoและสามารถนำค่าที่คั่นด้วยเครื่องหมายจุลภาคหลายตัวออกไป
  • ¶ßž’ßžßและšžŠ‹–™Š“ߊ‹‹š™“†Þเป็นชื่อค่าคงที่ที่ถูกต้องใน PHP แต่เนื่องจากค่าคงที่ไม่มีอยู่ถือว่าเป็นสตริงตัวอักษร~แปลงกลับเป็น"I am a "และ"beautiful butterfly!"(บันทึกไบต์สำหรับเครื่องหมายคำพูดแต่ละอัน)
  • strtrแทนที่ "caterpillar!" ด้วย "ผีเสื้อที่สวยงาม!" ในการโต้แย้ง

2
สนใจที่จะให้คำอธิบาย?
Timwi

@ Timwi ไม่มีปัญหาเพิ่มคำอธิบาย
Fabian Schmengler

ฉันคาดหวังให้ใครบางคนเข้ารหัส "ผีเสื้อที่สวยงาม" กับบางอย่างเช่น ROT13 แต่ความคิดในการจับคู่มันกับเทคนิคสตริงตัวอักษรของ PHP คือในคำพูดของ Kaylee มันวาว!
Cort Ammon - Reinstate Monica

7

Pyth, 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

Perl 6, 60 56 ไบต์

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

ต้องการ -p เพื่อให้ทำงานได้อย่างถูกต้อง ฉันคิดว่านี่เป็นจำนวนไบต์ น่าเสียดายที่หนึ่งในข้อเสียของ Perl 6 คือไวยากรณ์มีความเข้มงวดมากขึ้นในขณะนี้ ...


หนอนผีเสื้อมีความเสี่ยงในระหว่างการเปลี่ยนแปลง นั่นเป็นเหตุผลที่พวกเขาต้องการห่อหุ้มตัวเองในตัวแปรc̶o̶c̶o̶o̶o̶n̶s Perl: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(ฉันสมมติว่า Perl 6 อนุญาต barewords เช่น Perl 5 ที่มีno strict 'subs'และs///สอดแทรกตัวแปรใน LHS)
ThisSuitIsBlackNot

นั่นมันตลกดี ฉันลองมันและด้วยเหตุผลบางอย่างเมื่อฉันทำมันมันให้ฉันจำนวนไบต์เดียวกัน แต่เมื่อพิมพ์มันออกมาอีกครั้งมันทำให้ฉันมีไบต์น้อยลง แปลก.
ปาเก็ตตี้

โอ้รอไม่เป็นไรฉันจำได้ว่าทำไมฉันไม่ทำ เมื่อเรียกใช้รหัสใหม่มันจะพ่นข้อผิดพลาดเนื่องจากช่องว่างระหว่างสวยงามกับผีเสื้อ
ปาเก็ตตี้

อ่าฉันไม่เคยใช้ Perl 6 ดังนั้นไม่สามารถช่วยคุณได้ ฉันแค่ต้องการข้อแก้ตัวที่จะทำให้คำพูดที่มีไหวพริบ ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/สั้นกว่าและจะทำงานใน Perl 6 อย่างแน่นอน
ThisSuitIsBlackNot

1
@ ThisSuitIsBlackNot ไม่เหมาะกับความท้าทาย กฎอยู่ที่นั่นเพื่อให้แน่ใจว่าคุณอ่านและแก้ไขรหัสของคุณจริงๆ ในท้ายที่สุดวิญญาณที่แท้จริงพยายามที่จะปล่อยให้ผีเสื้อที่สวยงามอยู่ในใจกลางของการทำลายรหัสฟรี แน่นอนว่าความงามอยู่ในสายตาของคนดู เราแต่ละคนจะพบทางออกที่แตกต่างกันไม่มากก็น้อยสวยงามกว่าคนอื่น ๆ สำหรับวิธีการแก้ปัญหาใน PERL ... ขอแค่บอกว่า PERL มีคำนิยามที่แปลกประหลาดของตัวเองและมันเหมาะสมกับจุดประสงค์ของมัน ;-)
Cort Ammon - Reinstate Monica

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ในส่วน (เช่นส่วนที่เหลือ) ของซอร์สโค้ดดังนั้นความต้องการของมันเช่นกัน

Caveat: อินพุตแรกต้องลงท้ายด้วย 'การป้อนข้อมูลครั้งแรกจะต้องจบลงด้วยการ ไม่มากนักที่จะระงับการป้อนข้อมูลผิด ...

ไม่คาดว่าจะมีอินพุตที่สอง


1
โว้ว. ฉันกำลังรอคน awk และที่มัน มันเท่ห์มาก
jrg

@jrg ขอบคุณสำหรับกำลังใจ :)
hjk

1

Python - 184 ไบต์ -20% สำหรับโบนัส = 147.2

""""""
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ให้เปลี่ยนเครื่องหมายคำพูดคู่สามตัวแรกเป็นเครื่องหมายคำพูดเดี่ยวในอินพุต (บรรทัดแรกคือ'''""")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.