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 butterfly
ketika 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
sumber
Jawaban:
Befunge-98, 602 byte
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:
Bagian bawah dari itu, pada gilirannya, menghasilkan:
sumber
PHP, 74 Bytes
<?=
setara dengan<?php echo
dan 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)strtr
menggantikan "ulat!" dengan "kupu-kupu yang indah!" dalam argumensumber
Pyth,
5046 bytePenjelasan
Kode sumber yang dihasilkan adalah
Yang pada dasarnya mencetak teks.
sumber
Perl 6,
6056 byteMembutuhkan -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 ...
sumber
$a=caterpillar;say"I am a $a!";s/$a/beautiful butterfly/
(Saya berasumsi bahwa Perl 6 mengizinkan kata kunci seperti Perl 5no strict 'subs'
dans///
menginterpolasi variabel pada LHS.)say"I am a caterpillar!";s/\S+!/beautiful butterfly!/
lebih pendek dan pasti akan bekerja di Perl 6.Retina, 53 byte
Mencetak:
Perhatikan bahwa tidak ada pemisah antara
I am a caterpillar!
dan program baru. Program baru tidak mengharapkan input.sumber
bash
/awk
/cksum
-179,2169,6168 byteDemo:
Saya berharap 20% berlaku untuk setiap string yang dimulai dengan
xyz
, jika hitungan asli224212210 byte (tetap"I am Batman!"
bagian).Transformasi dilakukan: menggantikan satu-satunya terjadinya literal
!NF
dengan10
, sehingga" butterfly"
ini juga dicetak dengan menggunakanprintf
.Melakukan yang sederhana
cksum
pada bagian (yaitu sisa) dari kode sumber, karenanya diperlukan juga.Peringatan: input pertama harus diakhiri denganTidak terlalu banyak peringatan untuk menekan input yang salah ...'
.Tidak ada input kedua yang diharapkan.
sumber
Python - 184 byte -20% untuk bonus = 147,2
Untuk mencetak
I am batman
, ganti tiga tanda kutip ganda dengan tanda kutip tunggal pada input. (Baris pertama adalah'''"""
)sumber