Catatan: Tantangan ini hanya memungkinkan jawaban dalam bahasa yang dikompilasi
Tugas
Tugas Anda cukup sederhana, buat dua program berbeda yang ketika dikompilasi menghasilkan output yang sama.
Mencetak gol
Di sinilah kesenangan datang. Skor Anda akan menjadi jumlah byte unik yang hadir dalam satu program. Misalnya jika dua program Anda (dikodekan dalam Kode IBM halaman 437 ) adalah
☻☻Program A
dan
☺Program B
Karakter yang ada dalam satu program adalah
☻☺AB
Dengan demikian skornya 4. Catatan yang ☻
muncul dua kali dalam program pertama tetapi hanya dihitung sekali.
Tujuan Anda adalah untuk mendapatkan skor tertinggi, skor tertinggi adalah 256.
Berikut adalah program penilaian yang berfungsi untuk program yang disandikan ASCII.
Ketentuan
Setiap byte di kedua program harus dapat diganti dengan byte yang berbeda yang menyebabkan program mengkompilasi ke dalam hasil yang berbeda atau gagal untuk mengkompilasi semuanya. Menghapus byte apa pun harus melakukan hal yang sama.
Anda dapat menggunakan flag kompilasi apa pun selama kedua program dijalankan dengan flag yang sama.
Kompilasi yang dihasilkan harus statis (mis. Tidak boleh berbeda dari satu menjalankan ke yang lain), jika hasil bervariasi dari mesin ke mesin menunjukkan mesin itu dimaksudkan untuk berjalan.
Output dari kompilasi harus byte untuk byte yang identik bukan "setara" atau "cukup mirip".
Output dari kompilasi seharusnya tidak kosong
Peringatan / Kesalahan tidak harus sama antara kompilasi
Jika salah satu program atau kompilasi menyertakan karakter yang tidak patut pastikan untuk menyertakan hexdump. Meskipun secara teknis tidak diperlukan.
sumber
abcdefghijqlmnop...
untuk menggunakan 20+ karakter unik. Apakah ini diizinkan?Code-Bowling
pertanyaan yang bagus !Jawaban:
Perl, skor 254 + 2 = 256
Berikut ini hex dump dari satu program:
dan inilah program lainnya:
Perl biasanya tidak memikirkan bahasa yang dikompilasi, tetapi itu; pertama kali dikompilasi menjadi bytecode, dan kemudian bytecode dieksekusi. Anda dapat menerapkan filter pada bytecode (misalnya untuk membuangnya daripada menjalankan program) menggunakan
-MO
opsi. Kedua program ini mengkompilasi bytecode berikut (dibongkar menggunakan-MO=Terse
):Penjelasan
Perl mengganti semua pernyataan tanpa efek (seperti string literal sendiri) dengan pernyataan "pernyataan tanpa efek" dalam kode bytecode yang dihasilkan, sehingga kedua program mengkompilasi ke hal yang sama. Dalam hal penggantian karakter, mengganti sebagian besar karakter dari program 1 dengan tanda kutip akan menyebabkannya gagal dikompilasi (atau mengganti tanda kutip dengan
0
). Dalam program 2, mengganti karakter apa pun denganc
akan menyebabkan program gagal dikompilasi (seperti\c
mengambil argumen).Adapun penghapusan karakter, versi pertama dari jawaban ini mendahului "aturan pengerasan radiasi" (bahwa menghapus karakter apa pun harus mengubah perilaku program). Versi yang diperbarui dan diperkeras radiasi ini bekerja melalui penggunaan checksum; jika menghapus karakter tidak langsung menyebabkan kesalahan sintaks, kode akan dikompilasi menjadi panggilan ke fungsi yang tidak ada
x
. Kompiler Perl tidak mengoptimalkan panggilan dalam kasus di mana ia dibuat (dan secara umum tampaknya tidak menyadari bahwa fungsi tidak ada), dan dengan demikian hasilnya berbeda. Namun, folder konstan Perl mampu melihat bahwa program yang tidak bermutasi adalah pernyataan tunggal tanpa efek, dan dengan demikian mengoptimalkan semuanya menjadi satu pernyataan seperti sebelumnya.Saya awalnya salah membaca pertanyaan karena hanya menghitung karakter unik dari satu program, dan mencoba mengoptimalkannya. Jelas, program 2 harus mengandung setidaknya satu karakter untuk menghasilkan opcode "pernyataan tanpa efek", yang berarti bahwa skor terbaik dalam satu program adalah 255. Saya belum menemukan cara untuk memasukkan backslash dalam program 1 sedemikian rupa sehingga karakter yang segera mengikutinya tidak dapat diganti sedemikian rupa sehingga menyebabkan program rusak, tetapi itu tidak akan mengejutkan saya jika itu mungkin (mengarah ke skor 255 + 1 = 256 ).
sumber
C, 231
Program A
Banyak unsintables di atas. Inilah hexdump xxd:
Program B
Ini mengkompilasi dengan tepat kode objek yang sama. GCC menyematkan nama file dalam kode objek, jadi Anda harus memberikan file nama yang sama (dalam direktori yang berbeda).
Saya khawatir bahwa fakta bahwa tidak ada referensi untuk
i
dapat menyebabkan kompiler untuk mengoptimalkan variabel ini sepenuhnya, tapi saya pikir menjadikannya jaminan global bahwa ia akan hadir di objek. Ini dapat diverifikasi dengan inspeksi rakitan yang dihasilkan:Perhatikan bahwa dalam program B, (sebagian besar) nilai-nilai char diberikan dalam oktal. Mereka bisa juga diberikan dalam desimal, tetapi dengan menggunakan oktal, kita mendapatkan beberapa karakter tambahan -
8
dan9
- dalam set perbedaan.GCC sepertinya tidak menyukai CR, LF dan (untuk alasan yang jelas) NUL karakter di dalam tanda kutip tunggal
''
.Cobalah secara online dan cetak skor .
sumber
char
bukan implisitint
, untuk merugikan skor.Python, skor
16262728Karakter Unik:
-+;132547698<ACBEDFOXabopsx|
Hitung skornya
Program 1:
Dalam program 1, ada 5 ruang di garis yang tampaknya kosong.
Program 2:
Beberapa bantuan ditemukan dengan kode sumber optimizer lubang .
Diuji dengan skrip pembantu ini: Cobalah online!
sumber
Python 3.6,
2 3 56Program 1:
Program 2:
Python biasanya tidak dikompilasi, tetapi ia mengkompilasi kode sumbernya menjadi file pyc. Yang terpenting, kompilasi semacam itu mencakup pass optimasi yang mengubah "1111 + 4168" menjadi 5279. Garis bawah melayani dua tujuan: salah satunya adalah menambahkan satu ke skor, dan yang lainnya adalah menjaga panjang, yang disimpan dalam pyc tajuk yang sama. Semua tugas variabel selain 'x' adalah untuk mempertahankan
co_consts
urutan yang benar. Thex*x
pada akhirnya berfungsi untuk menjaga halco_stacksize
yang sama.sumber
compile
fungsi bawaan, yang tidak menambahkan header. Masalah mtime dan nama file terkait hanya berlaku untuk tajukos.utime
fungsiFASM, 254
tidak ada 0x00 dan 0x1A karena fasme tidak mendukung kedua simbol
sumber