Tulis quine bahasa assembly yang sesingkat mungkin .
Gunakan ISA yang Anda inginkan, kecuali jika ada print-quine
instruksi atau yang setara. Contohnya termasuk x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM, dll.
Anda dapat menautkan ke _printf
fungsi pustaka standar C (atau setara Java untuk bytecode JVM) untuk I / O.
Panjang akan dinilai berdasarkan jumlah instruksi dan ukuran segmen data. Solusi harus mengandung setidaknya dua instruksi.
Quine harus mencetak kode rakitan , bukan kode rakitan mesin.
Jawaban:
x86 Linux, AT&T sintaks: 244
(Saya kompilasi dengan ini
gcc -nostartfiles -lc quine.S -o quine
:)sumber
JVM Bytecode Assembly (via Jasmin ) - 952
960990Sedihnya, Jasmin tidak mengizinkan banyak trik bagus seperti yang
ilasm
diizinkan Microsoft . Tetapi JVM memiliki total enamdup
instruksi berbeda yang melakukan segala macam hal menyenangkan. Menyusun ulang item pada tumpukan adalah sesuatu .NET sepertinya tidak mendukung.Bagaimanapun, saya kira tidak satu pun dari dua entri saya adalah pesaing serius untuk kode terpendek tapi saya kira sulit untuk membuatnya lebih pendek. Karena itu hanya untuk kelengkapan :-)
Versi yang dikomentari dengan info tentang apa yang ada di tumpukan:
Sejarah:
ldc
lebih pendek daribipush
atauiconst_*
.sumber
gas untuk x86 Linux (89 byte, tujuh instruksi)
Secara teknis, ini curang.
Simpan dalam nama file
a
dan kumpulkan dengan perintah berikut untuk membuat executable bernamaa.out
.Arahan
.incbin
mencakup file kata demi kata di lokasi saat ini. Jika Anda menggunakan ini untuk memasukkan kode sumber itu sendiri, Anda mendapatkan quine yang bagus.sumber
Windows .COM Format: 307 karakter
Merakit, menggunakan A86, hingga 51 byte. Tidak memerlukan pustaka eksternal selain dari fungsi DOS Int21 AH = 9 (tulis string ke stdout).
sumber
NASM, 223 byte
Mengalahkan jawaban yang diterima!
sumber
.NET CIL - 623
669691723727Satu baris, tidak ada garis putus di akhir.
Versi pertama yang diformat dan dikomentari (meskipun bukan quine lagi) - tidak mungkin saya menyimpang banyak dari konsep umum:
Sejarah :
dup
lebih pendek dari menulisldloc.1
setiap saat.ldloc.1
dapat ditulisldloc 1
untuk membuat token terakhir menjadi huruf. Bytecode yang dihasilkan cenderung lebih besar, tapi ini tentang kode assembler jadi saya tidak peduli :-)object[]
sebagai variabel lokal; Saya bisa melakukan semua itu di stack secara langsung. Bagus.sumber
gas untuk Linux x86,
184176 byteBangun dengan
gcc -m32 -o a.out quine.S
. (Ini-m32
opsional jika OS Anda sudah 32-bit.)Diedit untuk menambahkan: Jika kita memodifikasi aturan agar diizinkan
puts
dipanggil,printf
maka itu dapat dilakukan dalam182174 byte:(Perhatikan bahwa yang ini, tidak seperti yang sebelumnya, memiliki baris baru yang mengakhiri.)
sumber
printf
untuk mengalahkan argumennya di stack. Secara teknis tidak aman hanyacall
dengan sekali lagi dan mengharapkan args yang sama, tetapi bekerja dalam praktik karena gcc / clang tidak pernah menggunakan slot args sebagai ruang awal, AFAIK.printf
dari_start
(misalnya dalam biner statis), jadi itu adalah argumen yang baik untuk menulis amain
bukan a_start
. Jawaban ini menjelaskan berbagai cara menghubungkan libc dari binari statis atau dinamis. (Dalam biner dinamis Linux, tautan dinamis akan menjalankan fungsi inisialisasi glibc, sehingga Anda dapat menggunakanprintf
dari_start
titik masuk, tetapi itu tidak terjadi pada cygwin IIRC.)ASM yang dapat di-boot, 660 byte
Awalnya oleh jdiez17 , bermain golf dengan benar.
sumber
x86-64, Sistem V AMD64 ABI, GASM: 432
sumber
xor eax,eax
sama sekali jika Anda tidak peduli dengan status keluar dari program Anda. Itu masih mencetak sendiri, bahkan jika itu keluar dengan status tidak nol. Anda juga dapat menggunakanpush
bukanpushq
. Sebenarnya, mengapa Anda bahkan membuat bingkai stack sama sekali? Jatuhkanpush rbp
/mov rsp, rbp
danleave
. Anda juga bisa menggunakan nama label yang lebih pendek..Cs
adalah 3 karakter ketika 1 akan baik-baik saja..att_syntax noprefix
mungkin tidak membayar untuk dirinya sendiri lagi..intel_syntax noprefix
akan membiarkan Anda menjatuhkan enam$
awalan itu juga. tapi mungkin masih belum sepadan. (Anda bisa menggunakanlea ecx,.Cs
sintaks intelmov ecx,offset .Cs
)TAL
Untuk menjalankannya, panggil
::tcl::unsuppoted::assemble
dengan kode sebagai argumen.Tcl 8.6 saja.
sumber
80x86 TASM, 561 byte
sumber