Kode Sumber Metamorfosis

29

mbomb007 meminta kami untuk membuat program pemotongan diri . Ini tantangan yang menarik, tetapi saya pribadi tidak suka mendorong program saya untuk melukai diri sendiri. Saya suka berpikir bahwa, di jantung setiap program ada kupu-kupu yang indah menunggu untuk keluar.

Karena itu, untuk tantangan Code Golf pertama saya, saya menantang Stack Exchange untuk bermetamorfosis menjadi kupu-kupu. Program Anda harus menerima kode sendiri sebagai input dan output I am a caterpillar!diikuti oleh kode untuk program lain dalam bahasa yang sama (Anda dapat meletakkan pembagi antara output atau tidak ... tapi kami berbicara tentang kupu-kupu, jadi sangat bagus!). Program kedua ini harus di-outputI am a beautiful butterfly!

Metamorfosis: Program ini harus memodifikasi dirinya sendiri, itulah sebabnya ia diberikan sebagai input. Saya tidak ingin program bersarang membosankan yang tidak lain adalah pernyataan cetak I am a caterpillar!diikuti dengan mencetak kode sumber. Anda harus mengubah kode itu sendiri, jadi jawaban yang paling membosankan yang dapat diterima adalah yang mencetak I am a caterpillar, kemudian merobek string dari input (yang kebetulan berupa kode) dan mencetaknya. Tentu saja, ini adalah persyaratan kecil yang sangat sulit untuk ditulis, sehingga harus dianggap sebagai "semangat tantangan." Persyaratan formal akan ditetapkan pada "Jika program Anda diberikan string acak dengan panjang yang sama dengan program Anda, harus ada kemungkinan kurang dari 5% untuk mencetak I am a butterflyketika program kedua dijalankan."

Ringkasan:

  • Tulis program yang, ketika diberikan kode sendiri sebagai input, dicetak I am a caterpillar!diikuti dengan blok kode sumber (dengan pembatas di antara mereka atau tidak).
  • Blok kode sumber kedua ini, ketika dikompilasi / ditafsirkan sebagai bahasa yang sama, dicetak I am a beautiful butterfly!
  • Jika program Anda tidak memasukkan kode sumbernya sendiri sebagai input, dan sebaliknya diberikan string acak karakter yang tidak cocok dengan kode sendiri, hasilnya harus gagal dikompilasi / diinterpretasikan, atau tidak mencetak I am a butterfly!setidaknya 95% dari acak string (spirit: Anda diharapkan membaca kode sumber Anda sendiri dari input, dan menjahitnya menjadi kupu-kupu).
    • Saya nyaman dengan Anda tidak membuktikan ini, selama Anda memegang semangat ide metamorfosis, memodifikasi kode Anda sendiri, tetapi jika Anda mencoba untuk bermain game celah untuk bekerja menggunakan input Anda, berharap untuk memiliki untuk membuktikannya.
  • Celah standar berlaku

Saya ingin ini dinilai berdasarkan kecantikan mereka, tetapi itu jelas merupakan pendekatan non-kuantitatif, sehingga rute "jumlah byte" yang biasa dapat digunakan untuk menilai

Bonus : -20% - pilih string 3 huruf apa pun yang tidak cocok dengan 3 huruf pertama dari program Anda. Jika saya menjalankan program ulat, tetapi memodifikasi input sehingga 3 karakter pertama diubah ke yang ditentukan, cetak I am Batman!saja. Selalu menjadi Batman. ( Aturan string acak yang sama berlaku untuk ini ... metamorfosis! )

Contoh sepele (python):

"""
    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
Cort Ammon - Pulihkan Monica
sumber
Sebagai catatan: Saya ingin melihat program seni ascii di mana ia terlihat seperti ulat pertama kali, dan berubah menjadi kupu-kupu ascii pada fase berikutnya, tapi itu sedikit lebih maju daripada tantangan yang seharusnya.
Cort Ammon - Reinstate Monica
Apa yang harus kita lakukan jika suatu program memiliki banyak file?
TheNumberOne
@TheNumberOne Saya ingin tahu apa yang Anda rencanakan di sana! Saya tidak tahu apakah saya ingin mengalahkan aturan untuk itu segera, tanpa melihat konsekuensinya, tetapi menurut saya, jika Anda menerima set multi-bagian file sebagai input (daripada satu file saja konten), dan Anda harus mengeluarkan serangkaian output multi-bagian (daripada output tunggal), dengan deliniator setengah masuk akal di antara file, saya pikir itu harus menjadi solusi yang masuk akal. Jika itu tidak berhasil untuk Anda, saya mungkin perlu lebih banyak wawasan tentang solusi yang Anda usulkan untuk menyusun aturan dengan lebih baik.
Cort Ammon - Reinstate Monica
@TheNumberOne Dan terima kasih atas kesalahan ketiknya. Kesalahan ketik itu jelas bukan kupu-kupu yang indah!
Cort Ammon - Reinstate Monica

Jawaban:

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\

Diuji dalam PyFunge.

Saat dijalankan dengan string yang tidak dimulai dengan 2 spasi (probabilitas lebih dari 95% saat acak) tidak menghasilkan apa-apa. Ini bukan apa yang dicari OP, tetapi sesuai dengan spesifikasinya.

Ketika melewati sebuah string yang dimulai dengan 2 spasi (seperti itu sendiri) menghasilkan ini:

I am a caterpillar!

---

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

Bagian bawah dari itu, pada gilirannya, menghasilkan:

I am a beautiful butterfly!
PurkkaKoodari
sumber
2
Wow. Ini luar biasa.
spaghetto
3
Saya tahu seseorang ingin mendorong aturan seperti yang Anda lakukan; Saya senang sesuatu yang indah keluar dari sana =)
Cort Ammon - Reinstate Monica
Ulat dan kupu-kupu terlihat seperti tersangkut di Matriks. Indah!
Erno
dimana saya bisa menjalankan ini?
user1514631
3
Saya tidak akan pernah mengerti bagaimana Anda, orang-orang baik di Code Golf, berhasil menciptakan keburukan yang begitu indah.
Chris Cirefice
19

PHP, 74 Bytes

<?=~¶ßž’ßžß,$s="caterpillar!",strtr($argv[1],[$s=>~šžŠ‹–™Š“ߊ‹‹š™“†Þ]);
  • <?=setara dengan <?php echodan dapat mengambil beberapa nilai yang dipisahkan koma ke output
  • ¶ßž’ßžßdan šžŠ‹–™Š“ߊ‹‹š™“†Þadalah nama konstanta yang valid dalam PHP, tetapi karena konstanta tidak ada diperlakukan sebagai string literal. ~membalikkan mereka ke "I am a "dan "beautiful butterfly!"(masing-masing menyimpan byte untuk satu tanda kutip)
  • strtrmenggantikan "ulat!" dengan "kupu-kupu yang indah!" dalam argumen
Fabian Schmengler
sumber
2
Mau memberikan penjelasan?
Timwi
@Timwi tidak masalah, penjelasan ditambahkan
Fabian Schmengler
Saya sepenuhnya berharap seseorang untuk menyandikan "kupu-kupu yang indah" dengan sesuatu seperti ROT13, tetapi gagasan untuk mencocokkannya dengan teknik literal string PHP, dalam kata-kata Kaylee, mengkilap!
Cort Ammon - Reinstate Monica
7

Pyth, 50 46 byte

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

Penjelasan

"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

Kode sumber yang dihasilkan adalah

"I am a beautiful butterfly!

Yang pada dasarnya mencetak teks.

PurkkaKoodari
sumber
6

Perl 6, 60 56 byte

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

Membutuhkan -p untuk berjalan dengan baik; Saya telah memperhitungkan ini dalam hitungan byte. Sayangnya salah satu kelemahan dari Perl 6 adalah bahwa sintaksanya jauh lebih ketat sekarang ...

sebuah spaghetto
sumber
Ulat rentan selama metamorfosis. Itu sebabnya mereka suka membungkus diri mereka dalam variabel c̶o̶c̶o̶o̶n̶s̶: $a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/(Saya berasumsi bahwa Perl 6 mengizinkan kata kunci seperti Perl 5 no strict 'subs'dan s///menginterpolasi variabel pada LHS.)
ThisSuitIsBlackNot
Hah, itu lucu. Saya mencoba itu dan untuk beberapa alasan ketika saya melakukan wc itu memberi saya jumlah byte yang sama. Tetapi setelah mengetiknya lagi itu memberi saya lebih sedikit byte. Aneh.
spaghetto
Oh, tunggu dulu, aku ingat kenapa aku tidak melakukannya. Ketika menjalankan kode baru itu melempar kesalahan karena jarak antara indah dan kupu-kupu.
spaghetto
Ah, saya belum pernah menggunakan Perl 6 jadi tidak bisa membantu Anda di sana. Aku benar-benar hanya ingin alasan untuk membuat komentar yang jenaka. ;) say"I am a caterpillar!";s/\S+!/beautiful butterfly!/lebih pendek dan pasti akan bekerja di Perl 6.
ThisSuitIsBlackNot
1
@ ThisSuitIsBlackNot Tidak sesuai dengan tantangan. Aturannya ada hanya untuk memastikan Anda benar-benar membaca dan memodifikasi kode Anda. Pada akhirnya, roh yang sebenarnya mencoba untuk membiarkan kupu-kupu yang indah di jantung kode bebas. Kecantikan, tentu saja, ada di mata yang melihatnya. Kita masing-masing akan menemukan solusi yang berbeda lebih atau kurang cantik daripada yang lain. Adapun solusi dalam PERL, well ... anggap saja PERL memiliki definisi sendiri yang unik tentang indah, dan itu sesuai dengan tujuannya ;-)
Cort Ammon - Reinstate Monica
4

Retina, 53 byte

caterpillar
beautiful butterfly
^
I am a caterpillar!

Mencetak:

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

Perhatikan bahwa tidak ada pemisah antara I am a caterpillar! dan program baru. Program baru tidak mengharapkan input.

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

Demo:

$ 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

Saya berharap 20% berlaku untuk setiap string yang dimulai dengan xyz, jika hitungan asli 224 212 210 byte (tetap "I am Batman!"bagian).

Transformasi dilakukan: menggantikan satu-satunya terjadinya literal !NFdengan 10, sehingga " butterfly"ini juga dicetak dengan menggunakanprintf .

Melakukan yang sederhana cksumpada bagian (yaitu sisa) dari kode sumber, karenanya diperlukan juga.

Peringatan: input pertama harus diakhiri dengan '. Tidak terlalu banyak peringatan untuk menekan input yang salah ...

Tidak ada input kedua yang diharapkan.

hjk
sumber
1
WHOA. Saya sedang menunggu orang awk, dan hanya itu. Itu keren sekali.
jrg
@ jrg terima kasih atas dorongannya. :)
hjk
1

Python - 184 byte -20% untuk bonus = 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";'''

Untuk mencetak I am batman, ganti tiga tanda kutip ganda dengan tanda kutip tunggal pada input. (Baris pertama adalah '''""")

pppery
sumber