Sederhananya, tujuan Anda adalah membuat program lengkap yang mengubah kode sumbernya sendiri hingga setiap karakter sumber berbeda dari apa yang dimulai.
Harap sertakan sumber awal serta sumber akhir dalam posting Anda, serta deskripsi. Misalnya, Jelaskan apa yang program Anda lakukan, bahasa yang Anda gunakan, strategi Anda, dll.
Aturan
- Program Anda harus berhenti beberapa saat setelah modifikasi selesai.
- Ini harus benar-benar memodifikasi sendiri, sedang menjalankan kode sumber (tidak harus file yang Anda berikan kepada penerjemah, itu memodifikasi instruksinya), tidak mencetak program baru atau menulis file baru.
- Celah standar tidak diijinkan.
Kemenangan program terpendek.
Jika bahasa Anda dapat memodifikasi file sendiri dan menjalankan proses kompiler baru, tetapi tidak dapat memodifikasi kode sumbernya sendiri (saat ini sedang berjalan), Anda dapat menulis program seperti itu dengan penalti + 20% byte, dibulatkan. Bahasa pengubah otomatis yang sesungguhnya harus memiliki keunggulan.
Sunting : Jika program Anda terhenti karena kesalahan, harap sebutkan itu (dan mungkin katakan apa kesalahannya.)
sumber
Jawaban:
/// , 1 byte
Program ini menemukan
/
(awal dari grup pengganti-pola), dan menghapusnya sebagai persiapan untuk melakukan penggantian. Kemudian mencapai EOF, jadi menyerah dan berhenti.sumber
Labirin , 2 byte
The
>
berputar sumber sehingga menjadiPointer instruksi sekarang berada di jalan buntu dan berbalik untuk mencapai
@
yang mengakhiri program.Tentu saja
<@
akan berhasil juga.sumber
Python 2, 225 byte
Kode sumber akhir adalah string
"0"
s yang panjangnya sama dengan jumlah byte dalam objek kode terkompilasi asli.Kode menemukan objek kode yang sedang berjalan
sys._getframe().f_code.co_code
,, dan membuat struktur yang mewakili objek string python. Ini kemudian mendapatkan memori yang benar-benar diambil dan diganti dengan kode"0"*len(c)
.Saat dijalankan, program keluar dengan traceback berikut:
Ini menunjukkan bahwa penimpaan berhasil dan program mati karena
0
bukan opcode yang valid.Saya terkejut bahwa ini bahkan mungkin dalam python, objek bingkai hanya-baca, saya tidak dapat membuat yang baru. Satu-satunya hal yang rumit yang dilakukan adalah mengubah objek yang tidak dapat diubah (string).
sumber
"1"
string dalam kode itu sebenarnya bukan bagian dari 'kode', itu hanya sebuah konstanta yang disebut dalam bytecode. Apa yang sebenarnya saya ubah adalah python opcode mesin virtual yang dikompilasi, bukan konstanta atau variabel. Jadi yang saya ubah bukanlah kode sumber per kata, hanya kode yang dikompilasi. Saya dapat mengubah kode sumber sebagai disimpan tetapi itu tidak akan benar-benar mempengaruhi kode saat runtime karena sudah dikompilasi. Jika Anda mau, saya dapat memposting ini dalam 'compcodes Python 2.7 yang dikompilasi dengan konstanta', tetapi itu akan menjadi IMO konyol."1"
ke<backtick>1+1<backtick>
hanya 2 byte lagi1+1
dari saran saya berubah menjadi2
dalam versi yang dikompilasi ... Kompiler terlalu pintar untuk kebaikannya sendiri!jahat , 1 byte
jahat memiliki beberapa penyimpanan memori - satu adalah kode sumber itu sendiri dan satu adalah roda yang merupakan antrian melingkar yang diinisialisasi ke nol tunggal.
q
swap kode sumber dan roda, sehingga menggantikan sumber dengan null-byte. Namun, hanya huruf kecil yang merupakan operator dalam kejahatan, sehingga karakter hanyalah sebuah larangan dan program berakhir.sumber
MSM , 8 byte
Mengubah kode sumber menjadi
pqpqpqpq
MSM beroperasi pada daftar string. Perintah diambil dari kiri dan mereka memperlakukan sisi kanan sebagai tumpukan. MSM selalu bekerja pada sumbernya sendiri.
Jejak eksekusi:
sumber
Malbolge, 1 atau 2 byte.
Bahasa Malbolge "mengenkripsi" setiap instruksi setelah mengeksekusinya, jadi surat ini (Malbolge NOP) akan menjadi
!
(yang juga merupakan nop), dan kemudian berakhir. Untuk beberapa alasan, interpreter Malbolge yang saya gunakan membutuhkan dua byte untuk dijalankan, memberiDC
(keduanya adalah nops) menjadi!U
(keduanya juga nops)Sunting: Keadaan awal memori Malbolge tergantung pada dua karakter terakhir dalam kode, sehingga tidak didefinisikan dengan baik untuk satu program karakter. (Meskipun kode ini tidak peduli dengan keadaan awal memori)
sumber
x86 asm - 6 byte
tidak yakin apakah "sampai setiap karakter sumber berbeda dari apa yang dimulai sebagai" mengacu pada setiap byte, setiap nemonik, atau modifikasi umum. jika saya tidak valid saya dapat mengubah xor menjadi repor xor sehingga setiap bit mengubah nilai tetapi berharap tidak melakukan itu untuk menghemat 6 byte lebih agar tetap setidaknya sedikit sebanding dengan bahasa-bahasa golf khusus ini.
Semua ini dilakukan adalah mengubah c2 ke c3 retn dengan mendapatkan alamat langsung eip dan xoring 5 byte di depan.
sumber
SMBF , 92 byte
Dapat bermain golf, dan saya mungkin akan mengerjakannya lebih lanjut nanti.
Penjelasan
Program menghasilkan perintah-perintah berikut di akhir rekamannya untuk menghapus dirinya sendiri, sehingga ia harus menghasilkan nilai-nilai berikut pada rekaman itu:
Buat sekelompok
91
s, dengan nulls (ditampilkan sebagai_
) antara untuk digunakan untuk nilai temp.Sesuaikan nilainya dengan perbedaan
Eksekusi rekaman berikut akan semua nol, dengan pengecualian kode yang dihasilkan
[_[_-_]_<_]
.catatan:
Program ini membuat saya menyadari bahwa juru bahasa Python saya untuk SMBF memiliki satu atau dua bug,
dan saya belum menemukan cara untuk memperbaikinya.Sudah diperbaiki sekarang.sumber
Emacs Lisp 22 byte
Jalankan dari REPL:
Fungsi sekarang dievaluasi menjadi
nil
.Bergantian (lepaskan ikatannya sendiri) 30 byte
Evaluasi dan galat sebagai
void-function
. Fungsi sudah ada sebelum dijalankan.sumber
Redcode , 7 byte, 1 instruksi (Hanya sebuah contoh. Tidak bersaing)
Ini adalah contoh sepele.
Memindahkan lokasi memori berikutnya ke dalam dirinya sendiri, lalu berhenti (karena seluruh memori diinisialisasi ke
DAT 0 0
, yang menghentikan program ketika dieksekusi.)sumber
Powershell 65 byte
Tentukan fungsi yang menulis ulang dirinya sendiri menjadi nol.
Evaluasilah sekali dan hilangkan dengan sendirinya.
Bergantian (menghapus sendiri dari memori) 36 byte
Menyebutnya terlebih dahulu menghapusnya kemudian mencoba untuk mengevaluasi secara rekursif. Kesalahan sebagai perintah yang tidak dikenal.
sumber
MIXAL, 6 byte (menghitung 2 tab)
Program dimulai pada lokasi memori 0 dan kemudian menulis 0 ke lokasi memori 0, sehingga terhapus dengan sendirinya. Mesin berhenti secara otomatis.
Ini adalah bahasa assembly untuk komputer MIX hipotetis Donald Knuth, yang dapat dirakit dan dijalankan menggunakan kit pengembangan MIX GNU ( https://www.gnu.org/software/mdk/ ).
sumber
> <> ,
403430 byteCoba di sini!
Penjelasan:
Pada dasarnya ini menempatkan sekelompok 3 blok karakter dalam tumpukan seperti: (ypos, xpos, karakter ASCII) yang akan dibalik di bagian akhir sehingga perintah 'p' terakhir dibaca (karakter, xpos, ypos) dan menetapkan posisi itu di kode untuk karakter itu. Karakter pertama secara manual ditetapkan sebagai '<', sehingga kode berakhir menjadi '> p <' di akhir untuk mengulangi perintah. Kemudian setiap karakter lain ditimpa sebagai '' termasuk karakter p. The '' sebenarnya "ASCII CHAR 0" yang BUKAN NOP dan akan memberikan kesalahan saat dibaca.
Juga harus ada jumlah karakter ganjil (?) Sebelum perintah 'p' atau tidak akan diulang kembali menjadi yang terakhir dan ditimpa.
sumber
Batch, 11 byte
Memodifikasi kode sumber menjadi
ECHO is on.
Ada di
@
sana sehingga perintah tidak digaungkan, tetapi sebagian besar agar keduanyaecho
tidak berbaris.sumber
@
dapat dihapus, karenaECHO
(huruf besar) =!echo
(huruf kecil)echo
tidak bisa berbaris.Jolf, 4 byte, tidak bersaing
Ini memberi
₯S
nilai pada₯C
elemen ode ke input,undefined
karena tidak ada yang diberikan. Coba di sini!sumber
(Filesystem) Befunge 98, 46 byte
Perhatikan bahwa program ini membuat dan memanipulasi file bernama
a
. Bagaimana itu bekerja:a
berisi seluruh kode (keluar ke 256 karakter di setiap dimensi) bergeser satu ruang ke atas dan dua di sebelah kiri.a
satu baris, menggantikan seluruh baris pertama dengan isia
file.a
file ke baris kedua menggeser dua tempat ke kanan.Sebagai efek samping, kode sumber akhir bahkan tidak valid Befunge! (karena berisi baris baru sebagai data dalam satu baris)
sumber
Python 2, 238 byte + 20% = 285,6
Pada dasarnya, ini mengubah encoding file sumber python saat ini di antara
ascii
danutf-8
, sehingga pada dasarnya mengubah setiap karakter sumber!sumber
) as
->)as
,) else
->)else
,"utf-8"if
,'w',encoding
.