Tulis sebuah program yang mengambil program brainfuck dan kompilasikan ke kode mesin yang dapat dieksekusi. Anda dapat menargetkan x86, x86_64, jvm (java bytecode) atau armv6, dan menggunakan salah satu format yang dapat dieksekusi berikut: ELF, a.out, file kelas, exe, com. Yang dapat dieksekusi harus bekerja di Linux atau Windows (atau Java pada keduanya).
Baik program Anda maupun yang dapat dieksekusi tidak dapat menjalankan program eksternal (seperti kompiler, assembler, atau juru bahasa lain).
Kode terpendek menang.
Jawaban:
C,
866783 byteKarena kode saya menghasilkan 32 bit ELF yang dapat dieksekusi, saya tidak bisa menjanjikan bahwa itu akan bekerja pada pengaturan semua orang. Butuh penyesuaian cukup untuk membuat executable untuk berhenti melakukan segfault di komputer saya.
Bagi siapa pun yang mencoba menjalankan ini:
Program Brainfuck dibaca dari stdin dan ELF yang dikompilasi ditulis ke stdout.
Tidak disatukan
Dalam versi kode yang tidak diklik, Anda bisa mendapatkan ide yang lebih baik tentang apa yang terjadi. Array karakter di akhir kode golf adalah pengkodean dari ELF dan header program dalam kode yang tidak ditandai. Kode ini juga menunjukkan bagaimana setiap instruksi Brainfuck diterjemahkan ke dalam bytecode.
Memodifikasi Mandiri BrainFuck
Untuk menghemat byte, rekaman untuk kompiler saya tidak dialokasikan di
.bss
bagian atau sesuatu yang mewah seperti itu. Sebagai gantinya, rekaman itu 30.000 byte nol ditulis langsung setelah kode byte yang dikompilasi dari program Brainfuck. Mengetahui hal ini, dan mengetahui kode byte apa yang dihasilkan oleh kompiler saya berarti Anda dapat membuat atau memodifikasi kode byte saat runtime. Ilustrasi sederhana dari 'fitur' ini adalah program Brainfuck yang menetapkan nilai keluar sendiri.Program keluar dari tepi kiri kaset ke kode byte ke titik bahwa kode keluar biasanya diatur 0. Menambah byte ini menyebabkan kode keluar diatur ke 1 bukan 0 ketika program akhirnya keluar. Dengan kegigihan, ini bisa digunakan untuk melakukan pemrograman level sistem di Brainfuck.
sumber
long long int
bukanchar
. Pasti ada ruang bagi saya untuk bermain golf beberapa deklarasi variabel saya. Saya akan melihat seberapa banyak saya bisa sampai di sana dan memperbarui jawaban saya.Python, 1974 karakter
Berikut ini adalah terjemahan ke bytecode java. local 0 adalah array byte yang mewakili tape, local 1 adalah pointer data.
The
xx xx
adalah offset untuk mencapai braket yang cocok. # 2 adalahSystem.in
, # 3 adalahread()
, # 4 adalahSystem.out
, # 5 adalahwrite()
, dan # 6 adalahflush()
.Pembukaan mengalokasikan array 30000 byte dan menginisialisasi posisi pita ke 0.
Pembungkus raksasa pada akhirnya dihasilkan dengan mengkompilasi
B.java
file dummy dengan kode untuk masing-masing opcode (untuk menginduksi generasi tabel konstan yang benar dan sampah lainnya), kemudian melakukan operasi halus di atasnya.Jalankan seperti
Bongkar dengan
Saya yakin itu bisa bermain golf lagi. Aku senang itu berhasil ...
sumber
Kode rakitan x86 16-bit, 104 byte
Kode ini dari 2014, tetapi saya baru saja menemukan tugas.
sumber