Mã nguồn biến thái


29

mbomb007 yêu cầu chúng tôi thực hiện một chương trình tự cắt xén . Đây là một thử thách thú vị, nhưng cá nhân tôi không muốn khuyến khích các chương trình của mình tự cắt xén. Tôi thích nghĩ rằng, tại trung tâm của mọi chương trình là một con bướm xinh đẹp đang chờ đợi để thoát ra.

Như vậy, đối với thử thách Code Golf đầu tiên của tôi, tôi thách thức Stack Exchange biến hình một con bướm. Chương trình của bạn nên chấp nhận mã của chính nó làm đầu vào và đầu ra, I am a caterpillar!sau đó là mã cho một chương trình khác có cùng ngôn ngữ (bạn có thể đặt một dải phân cách giữa các đầu ra hoặc không ... nhưng chúng ta đang nói về những con bướm, vì vậy tính tốt đẹp!). Chương trình thứ hai này sẽ xuấtI am a beautiful butterfly!

Biến thái: Chương trình này nên tự sửa đổi, đó là lý do tại sao nó được truyền chính nó làm đầu vào. Tôi không muốn một chương trình lồng nhau nhàm chán mà không có gì ngoài một câu lệnh in I am a caterpillar!theo sau là in mã nguồn. Bạn phải tự biến hình mã, vì vậy câu trả lời dễ chấp nhận nhất là câu in I am a caterpillar, sau đó xé một chuỗi ra khỏi đầu vào (tình cờ là mã) và in ra. Tất nhiên, đây là một yêu cầu rất nhỏ để viết, vì vậy nó nên được coi là một "tinh thần của thách thức". Yêu cầu chính thức sẽ được đặt ở "Nếu chương trình của bạn được cung cấp một chuỗi ngẫu nhiên có cùng độ dài với chương trình của bạn, sẽ có ít hơn 5% cơ hội in I am a butterflykhi chương trình thứ hai được chạy."

Tóm lược:

  • Viết chương trình, khi được cung cấp mã riêng làm đầu vào, sẽ in I am a caterpillar!theo sau là một khối mã nguồn (có dấu phân cách giữa chúng hay không).
  • Khối mã nguồn thứ hai này, khi được biên dịch / giải thích là cùng một ngôn ngữ, sẽ in I am a beautiful butterfly!
  • Nếu chương trình của bạn không được cung cấp mã nguồn riêng làm đầu vào và thay vào đó được cung cấp một chuỗi ký tự ngẫu nhiên không khớp với mã của chính nó, kết quả phải không được biên dịch / giải thích hoặc không được in I am a butterfly!ít nhất 95% ngẫu nhiên chuỗi (tinh thần: bạn sẽ đọc mã nguồn của riêng bạn từ đầu vào và ghép nó lại với nhau thành một con bướm).
    • Tôi cảm thấy thoải mái với bạn khi không chứng minh điều này, miễn là bạn giữ vững tinh thần của ý tưởng biến thái, sửa đổi mã của riêng bạn, nhưng nếu bạn đang cố gắng chơi trò chơi kẽ hở để sử dụng đầu vào của mình, hãy mong đợi để chứng minh điều đó.
  • Áp dụng sơ hở tiêu chuẩn

Tôi muốn những điều này được đánh giá bởi vẻ đẹp của chúng, nhưng đó là một cách tiếp cận không định lượng, do đó, tuyến đường "số byte" thông thường có thể được sử dụng để đánh giá

Phần thưởng : -20% - chọn bất kỳ chuỗi 3 chữ cái nào không khớp với 3 chữ cái đầu tiên của chương trình của bạn. Nếu tôi chạy chương trình sâu bướm, nhưng sửa đổi đầu vào để 3 ký tự đầu tiên được thay đổi thành ký tự được chỉ định, I am Batman!thay vào đó hãy in . Luôn luôn là Người Dơi. ( Các quy tắc chuỗi ngẫu nhiên tương tự áp dụng cho ... biến thái này! )

Ví dụ tầm thường (trăn):

"""
    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

Lưu ý: Tôi rất thích xem các chương trình nghệ thuật ascii lần đầu tiên trông giống như một con sâu bướm và biến thành một con bướm ascii trong giai đoạn tiếp theo, nhưng điều đó tiến bộ hơn một chút so với thử thách cần phải có.
Cort Ammon - Phục hồi Monica

Chúng ta nên làm gì nếu một chương trình có nhiều tệp?
TheNumberOne

@TheNumberOne Tôi tò mò không biết bạn đã lên kế hoạch gì ở đó! Tôi không biết nếu tôi muốn loại bỏ các quy tắc cho điều đó ngay lập tức, mà không thấy hậu quả, nhưng đối với tôi, nếu bạn chấp nhận một tập hợp nhiều phần làm đầu vào (chứ không phải là một tệp duy nhất nội dung) và bạn đã xuất ra một bộ đầu ra gồm nhiều phần (chứ không phải là một đầu ra duy nhất), với một bộ phân tách nửa hợp lý giữa các tệp, tôi nghĩ đó nên là một giải pháp hợp lý. Nếu điều đó không hiệu quả với bạn, tôi có thể cần có cái nhìn sâu sắc hơn về giải pháp được đề xuất của bạn để xây dựng quy tắc tốt hơn.
Cort Ammon - Phục hồi Monica

@TheNumberOne Và cảm ơn bạn đã bắt lỗi chính tả. Lỗi đánh máy đó rõ ràng không phải là một con bướm đẹp!
Cort Ammon - Phục hồi Monica

Câu trả lời:


63

Befunge-98, 602 byte

                                        "^@<"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\

Đã thử nghiệm trong PyFunge.

Khi chạy với một chuỗi không bắt đầu với 2 khoảng trắng (xác suất cao hơn 95% khi ngẫu nhiên) sẽ không có kết quả gì. Đây không phải là chính xác những gì OP đang tìm kiếm, nhưng phù hợp với đặc điểm kỹ thuật.

Khi được thông qua một chuỗi bắt đầu bằng 2 khoảng trắng (giống như chính nó) sẽ xuất ra:

I am a caterpillar!

---

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

Phần dưới của nó, lần lượt, xuất ra:

I am a beautiful butterfly!

2
Ồ Thật đáng kinh ngạc.
một spaghetto

3
Tôi biết ai đó sẽ muốn thúc đẩy các quy tắc giống như bạn đã làm; Tôi rất vui vì một cái gì đó đẹp đẽ đã ra khỏi nó =)
Cort Ammon - Tái lập Monica

Cả sâu bướm và bướm trông giống như chúng bị mắc kẹt trong Ma trận. Đẹp!
Erno

Tôi có thể chạy cái này ở đâu?
dùng1514631

3
Tôi sẽ không bao giờ hiểu làm thế nào những người tốt của bạn tại Code Golf quản lý để tạo ra những điều quái dị đẹp như vậy.
Chris Cirefice

19

PHP, 74 byte

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=tương đương <?php echovà có thể đưa một số giá trị được phân tách bằng dấu phẩy vào đầu ra
  • ¶ßž’ßžßšžŠ‹–™Š“ߊ‹‹š™“†Þlà các tên hằng hợp lệ trong PHP, nhưng vì các hằng số không tồn tại được coi là chuỗi ký tự. ~đảo ngược chúng thành "I am a ""beautiful butterfly!"(lưu một byte cho mỗi dấu ngoặc kép)
  • strtrthay thế "sâu bướm!" với "một con bướm xinh đẹp!" trong cuộc tranh luận

2
Quan tâm để cung cấp một lời giải thích?
Timwi

@Timwi không có vấn đề, giải thích thêm
Fabian Schmengler 7/10/2015

Tôi hoàn toàn mong đợi ai đó mã hóa "con bướm xinh đẹp" bằng thứ gì đó giống như ROT13, nhưng ý tưởng kết hợp nó với kỹ thuật chuỗi ký tự của PHP là, theo lời của Kaylee, sáng bóng!
Cort Ammon - Phục hồi Monica

7

Bình thường, 50 46 byte

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

Giải trình

"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

Mã nguồn kết quả là

"I am a beautiful butterfly!

Mà về cơ bản in văn bản.


6

Perl 6, 60 56 byte

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

Yêu cầu -p để chạy đúng; Tôi đã tính đến điều này trong số byte. Đáng buồn thay, một trong những nhược điểm của Perl 6 là cú pháp hiện nay nghiêm ngặt hơn nhiều ...


Sâu bướm dễ bị tổn thương trong quá trình biến thái. Đó là lý do tại sao họ thích bọc mình trong các biến c̶o̶c̶o̶o̶n̶s̶: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Tôi giả sử rằng Perl 6 cho phép các barewords như Perl 5 với no strict 'subs's///nội suy các biến trên LHS.)
ThisSuitIsBlackNot

Huh, thật buồn cười. Tôi đã thử điều đó và vì một số lý do khi tôi làm wc, nó đã cho tôi cùng một lượng byte. Nhưng khi gõ nó ra một lần nữa, nó cho tôi ít byte hơn. Lạ thật.
một spaghetto

Đợi đã, tôi nhớ tại sao tôi không làm điều đó. Khi chạy mã mới, nó sẽ xuất hiện lỗi do khoảng cách giữa đẹp và bướm.
một spaghetto

À, tôi chưa bao giờ sử dụng Perl 6 nên không thể giúp bạn ở đó. Tôi thực sự chỉ muốn một cái cớ để đưa ra một nhận xét dí dỏm. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/ngắn hơn và chắc chắn sẽ hoạt động trong Perl 6.
ThisSuitIsBlackNot

1
@ ThisSuitIsBlackNot Nó phù hợp với thử thách. Các quy tắc chỉ ở đó để đảm bảo bạn thực sự đọc và sửa đổi mã của mình. Cuối cùng, tinh thần thực sự đang cố gắng để con bướm xinh đẹp trong trái tim của mật mã thoát ra. Vẻ đẹp, tất nhiên, là trong mắt của kẻ si tình. Mỗi chúng ta sẽ tìm ra những giải pháp khác nhau đẹp hơn hoặc kém hơn những giải pháp khác. Đối với các giải pháp trong PERL, cũng ... chúng ta hãy chỉ nói PERL có nét đặc biệt riêng của mình đẹp, và nó phù hợp với mục đích của nó chỉ tốt ;-)
Cort Ammon - Khôi phục Monica

4

Võng mạc, 53 byte

caterpillar
beautiful butterfly
^
I am a caterpillar!

In ra:

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

Lưu ý rằng không có dải phân cách giữa I am a caterpillar! và chương trình mới. Chương trình mới dự kiến ​​không có đầu vào.


3

bash/ awk/ cksum- 179.2 169.6 168 byte

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}'

Bản giới thiệu:

$ 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

Tôi hy vọng 20% ​​áp dụng cho bất kỳ chuỗi nào bắt đầu bằng xyz, nếu không, số lượng ban đầu là 224 212 210 byte (đã sửa "I am Batman!"phần này).

Chuyển đổi thực hiện: thay thế sự xuất hiện duy nhất của văn chương !NFvới 10, do đó " butterfly"được cũng được in bằng cách sử dụngprintf .

Thực hiện một cách đơn giản cksumtrên một phần (tức là phần còn lại) của mã nguồn, do đó cũng yêu cầu của nó.

Hãy cẩn thận: đầu vào đầu tiên phải kết thúc bằng '. Không có quá nhiều cảnh báo để ngăn chặn đầu vào sai ...

Không có đầu vào thứ hai được mong đợi.


1
WHOA. Tôi đã chờ đợi người awk, và đó là nó. Điều đó thật tuyệt.
JRG

@jrg cảm ơn sự khuyến khích. :)
hjk

1

Python - 184 byte -20% cho tiền thưởng = 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";'''

Để in I am batman, thay thế ba dấu ngoặc kép đầu tiên bằng dấu ngoặc đơn trong đầu vào. (Dòng đầu tiên là '''""")

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.