Tugas Anda adalah untuk menulis sebuah program non-kosong / fungsi count byte L , yang, ketika diulang M kali, cek apakah positif yang diberikan bilangan bulat N adalah sama dengan L × M .
Anda harus, secara teori, mendukung jumlah pengulangan yang sewenang-wenang (nilai bilangan bulat positif sewenang-wenang dari M ), tetapi tidak apa-apa jika, karena keterbatasan bahasa, ia tidak dapat bekerja pada ambang batas tertentu. Membaca kode sumber program Anda atau mengakses informasi tentang hal itu dilarang keras .
Untuk memberikan output, Anda harus memilih nilai yang konsisten untuk salah satu negara (baik jujur atau salah) dan menggunakan yang lain (tidak harus konsisten) kemungkinan hasil untuk negara lain ( Diskusi ).
Jawaban Anda akan dinilai berdasarkan panjang program awal Anda L (dalam byte), dengan lebih sedikit byte yang lebih baik.
Contoh
Katakanlah program (awal) Anda ABCDE
. Kemudian:
ABCDE
(1 pengulangan) harus memeriksa apakah input sama dengan 5 .ABCDEABCDE
(2 pengulangan) harus memeriksa apakah input sama dengan 10 .ABCDEABCDEABCDE
(3 pengulangan) harus memeriksa apakah input sama dengan 15 . Dll ...
Skor kode sampel ini adalah 5 , karena sumber awal adalah 5 byte.
sumber
L
setelahM
waktu itu sendiri harus kembali apakah inputnyaN
sama denganL*M
?Jawaban:
Jelly , 1 byte
Output adalah 0 untuk pertandingan, bukan nol untuk pertandingan.
Cobalah online!
Bagaimana itu bekerja
Ini memanfaatkan format output yang terlalu liberal. Pengulangan
’
M kali hanya mengurangi input M kali, sehingga hasilnya akan nol jika dan hanya jika inputnya adalah LM , di mana L = 1 .sumber
Haskell, 8 byte
Cobalah online!
Seperti banyak jawaban lain, ia mengembalikan 0 untuk benar dan non-0 untuk falsy dengan berulang kali mengurangi panjang kode dari nomor input.
sumber
Retina ,
2120 byteCobalah online! Cukup ulangi bagian di jendela Kode untuk melihat bagaimana menangani kelipatan.
Memberikan
0
bilangan bulat multipel dan positif yang benar untuk yang lainnya.Penjelasan
Mari kita lihat satu-satunya program:
Ini mengubah angka desimal menjadi unary (menggunakan
_
sebagai digit unary).Jika string kosong (yang tidak dapat terjadi pada titik ini, karena input dijamin positif), kami menggantinya dengan satu
_
.Sekarang kita menyingkirkan 20 garis bawah pertama. Jika inputnya adalah
20
, ini menghasilkan string kosong.Dan akhirnya kami menghitung jumlah garis bawah pada hasilnya, yaitu nol jika inputnya
20
.Sekarang apa yang terjadi ketika kita mengulangi kode sumber. Karena kita tidak memasukkan umpan baris ketika bergabung dengan program, baris pertama akan langsung di akhir baris terakhir, kita mendapatkan ini ketika menggandakan program:
Sekarang alih-alih menghitung garis bawah, kita berakhir dengan tahap berikut:
Tahap ini tidak melakukan apa-apa, karena tidak ada lagi digit dalam string yang bekerja pada titik ini, sehingga regex tidak dapat cocok.
Sekarang tahap ini menjadi relevan. Jika inputnya adalah kelipatan 20, string telah dikosongkan oleh salinan kode sumber sebelumnya. Dalam hal ini, kami mengubahnya menjadi garis bawah tunggal, yang kami tahu tidak akan pernah bisa diubah menjadi string kosong lagi oleh program kami. Dengan cara ini kita memastikan bahwa hanya para M beberapa th diterima (dan tidak semua kelipatan hingga M th).
Kami menghapus 20 garis bawah pertama sekali lagi. Jadi, pengulangan M dari kode sumber akan menghapus 20M garis bawah dari string, jika memungkinkan.
Dan ketika kita sampai pada akhir program, kita masih menghitung garis bawah sehingga input yang valid memberikan nol.
sumber
x86 fragmen kode mesin 32-bit, 1 byte
Input dalam EAX, output dalam EAX: 0 untuk true, non-nol untuk false. (Juga membiarkan flag ZF disetel ke true, tidak disetel untuk false, jadi Anda bisa
je was_equal
). Sebagai "bonus", Anda tidak perlu khawatir tentang pembungkus; 32-bit x86 hanya dapat mengatasi memori 4GiB, jadi Anda tidak dapat membuat M cukup besar untuk membungkus semua jalan dan menemukan1 == 2**32 + 1
atau sesuatu.Untuk membuat fungsi yang dapat dipanggil, tambahkan
0xC3
ret
instruksi setelah mengulangi0x48
M kali. (Tidak dihitung dalam jumlah total, karena banyak bahasa hanya perlu mengulangi fungsi tubuh, atau ekspresi, untuk dapat bersaing).Calleable dari GNU C dengan atribut fungsi atribut x86
__attribute__((regparm(1))) int checkeqM(int eax);
GNU Cregparm
, seperti-mregparm
, menggunakan EAX untuk melewati integer arg pertama.Sebagai contoh, program lengkap ini mengambil 2 args, dan JITs M menyalin instruksi + a
ret
ke dalam buffer, dan kemudian menyebutnya sebagai fungsi. (Membutuhkan tumpukan yang dapat dieksekusi; kompilasi dengangcc -O3 -m32 -z execstack
)executable non-PIE dimuat lebih rendah dalam memori virtual; dapat melakukan malloc berdekatan yang lebih besar.
Perhatikan bahwa GNU C tidak mendukung objek ukuran lebih besar dari
ptrdiff_t
(ditandatangani 32-bit), tapimalloc
danmemset
melakukan masih bekerja, sehingga program ini berhasil.ARM jempol kode mesin, 2 byte
Arg pertama
r0
dan nilai kembalir0
adalah konvensi panggilan ARM standar. Ini juga menetapkan bendera (s
akhiran). Fakta menyenangkan; versi non -flag-settingsub
adalah instruksi lebar 32-bit.Instruksi pengembalian yang perlu Anda tambahkan adalah
bx lr
.Fragmen kode mesin AArch64, 4 byte
Bekerja untuk bilangan bulat 64-bit. Input / output dalam
x0
, sesuai dengan konvensi panggilan standar.int64_t foo(uint64_t);
AArch64 tidak memiliki mode Jempol (belum), jadi 1 instruksi adalah yang terbaik yang bisa kita lakukan.
sumber
__builtin___clear_cache
hanya diperlukan karena Anda menjalankan memori yang Anda dapatkanmalloc
. Jika Anda mendapatkan memori darimmap
sebaliknya, optimasi tidak terjadi.V , 16 (atau 1) byte
Jawaban membosankan:
satu byte.
Jawaban yang kurang membosankan:
Cobalah online!
Hexdump:
Saya benar-benar menulis ini sekitar 5 menit setelah tantangan keluar. Butuh waktu 30 menit untuk menambal tumpukan kode spageti yang mengerikan ini yang saya sebut bahasa .
sumber
Perl 5
-p
, 6 byteCobalah online!
gunakan
0
untuk samasumber
-p
solusi Perl 6 yang valid .Brachylog , 2 byte
Cobalah online!
sumber
Python 3 , 27 byte
Cobalah online!
Kode diulang dua kali:
Cobalah online!
sumber
Brain-Flak , 24 byte
Cobalah online!
Kembali
0
untuk yang sama dan yang lainnya tidak sama.Bagaimana itu bekerja:
Kali ini kode dijalankan
n
akan mengurangin * 24
dari input, memberikan 0 hanya ketika input =n*24
.sumber
Stax , 1 byte
Cobalah online!
sumber
TI-Basic (83 series), 4 byte
Membawa input
Ans
: misalnya, Anda dapat mengetik17:prgmCODEGOLF
untuk menjalankan ini dengan input17
. Mencetak (dan mengembalikanAns
) nilai0
jika input sama dengan L × M , dan nilai bukan nol sebaliknya.Perhatikan bahwa
:
ini adalah bagian dari kode, jadi jika Anda memasukkan ini ke dalam editor program, Anda akan melihatjika Anda memasukkannya sekali dan
jika Anda memasukkannya tiga kali.
sumber
Haskell , 12 byte
Cobalah online!
Keluaran
0
untuk truey dan beberapa integer non-nol untuk falsy.Solusi alternatif, 12 byte
Cobalah online!
sumber
Befunge-98 , 15 byte
Cobalah online!
Coba dua kali lipat!
Menggunakan 0 untuk sama dan apa pun untuk tidak setara.
Penjelasan:
Kode ini berulang kali akan terlihat seperti ini:
]
belok kanan. Mengirim IP ke bawah.>
bergerak ke timur. Mengirimkan IP dengan benar.f
tekan tombol 16.v
pindah ke selatan. Mengirim IP ke bawah. Jika ini yang terakhir, lakukan langkah 8.]
belok kanan. Kirim IP yang tersisa.+
Menambahkan. Tambahkan 16 ke atas tumpukan.v
pindah ke selatan. Mengirim IP ke bawah. Goto langkah 2.<
bergerak ke barat. Kirim IP kiri.#
melewatkan. melompati]
dan membungkus sampai akhir.+
Menambahkan. Tambahkan 16 ke atas tumpukan.&
memasukkan. Dorong nomor dari pengguna.-
mengurangi. dapatkan perbedaan jumlah yang sedang kita kerjakan dan inputnya..
mencetak. Cetak hasilnya.@
akhir.sumber
Pure Bash , 15
Input diberikan sebagai parameter baris perintah. Output sebagai kode keluar shell -
1
untuk TRUE dan0
untuk FALSE.sumber
Arang , 13 byte
Cobalah online! Berdasarkan jawaban saya untuk saya gandakan sumbernya, Anda gandakan hasilnya! Penjelasan:
Mengatur keluaran
1
untuk kebenaran dan0
kepalsuan. Pengulangan berikutnya membandingkan masukan terhadap13
,26
,39
,52
dll tapi setiap kali jawabannya adalah overprinted sehingga hanya jawaban akhir terlihat.sumber
JavaScript ES6, 32 Bytes
jika benar 0 dan salah seperti yang lain, 31 byte
sumber
MIPS, 4 byte
Digunakan
$a0
sebagai argumen dan mengembalikan nilai.MIPS, 8 byte (menggunakan konvensi panggilan MIPS)
x86, 5 byte
Ini adalah jawaban x86 pertama saya, jadi kami menerima umpan balik. Gunakan _fastcall convention dengan ecx sebagai argumen pertama.
Peter Cordes memiliki solusi 1 byte di komentar.
Komentar Brainfuck : Bagian yang sulit adalah mendapatkan brainfuck untuk mengembalikan nilai tunggal. Kalau tidak, sesuatu seperti ini akan mudah.
sumber
sub $4, %al
/mov %al, %dl
. Atau masih kembali dalam AL / EAX dan kemudian Anda mendapatkan solusi Dennis, dengandec %eax
(1 byte dalam mode 32-bit). Dan ya, konvensi panggilan kustom tidak masalah untuk ASM Asm, bukan hanya "asm yang mudah dipanggil dari C"; kode asli yang ditulis dalam asm memang menggunakan konvensi pemanggilan kustom di mana ia membantu, jadi ini benar-benar dapat dibenarkan.r0
yang juga merupakan retval, jadi Thumbsub r0, #2
adalah 2 byte.ret
di akhir blok ulang sebelum Anda bisa memanggil mereka. Biasanya saya memasukkan jumlahret
dalam byte untuk jawaban x86 asm saya. Tapi saya pikir membengkokkan aturan di sini hanya untuk fungsi tubuh masuk akal, kalau tidak banyak bahasa tidak bisa bersaing sama sekali.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
adalah 4 byte, dan mengikuti konvensi _fastcall. Menggunakan penyandian pendek AL, imm8 dan xchg-dengan-eax sering bermanfaat untuk kode golf.objdump -drwC -Mintel
untuk mendapatkan hexdump dari byte kode mesin.add r32, imm8
juga 3 byte: opcode + ModR / M + imm8. Semua instruksi yang dapat menggunakan imm32 memiliki opcode alternatif yang membutuhkan imm8 yang diperpanjang. Lihat felixcloutier.com/x86/ADD.html misalnya; semua instruksi ALU "klasik" (tetapi bukan MOV) yang berasal dari 8086 memiliki semua penyandian, termasuk yang AL / AX / EAX khusus tanpa modr / m, cukup op + imm8 / 16/32. Jawaban ini memiliki contohOktaf: 23 byte
Jika N = L * M, ekspresi kembali
0+i
(yaitu bilangan imajiner murni), jika tidak, ekspresi menghasilkan bilangan kompleks dengan komponen nyata.Untuk hasil yang sedikit lebih bagus dengan biaya byte tambahan:
Jika N = L * M ekspresi kembali
-1
, sebaliknya angka positif.Demo:
PS, Anda bisa mendapatkan hasil yang sama dengan
+24;if N==ans;-1;end;ans
tetapi bytecount samasumber
Lua,
5646 byteMenghasilkan 0 (tanpa baris tambahan) jika sama dan tidak ada atau serangkaian angka negatif (dengan nol sebelumnya dalam beberapa kasus) jika tidak sama.
Sendiri: Cobalah online!
Berulang kali beberapa kali: Cobalah online!
Penjelasan
Pada iterasi pertama (ketika
a
belum didefinisikan dan karena itunil
), setela
ke nomor yang diambil dari input, jika tidak dengan sendirinya. Dalam kedua kasus, 46 kemudian dikurangi daria
.Ini hanya mencetak
a
jika kurang dari (untuk menangani kasus di mana input lebih besar dari total panjang) atau sama dengan nol, dan string kosong sebaliknya.-10 byte untuk mengingat bahwa Lua melakukan konversi antara angka dan string secara otomatis. Aduh.
sumber
JavaScript (ES6), 47 byte
Ini menggunakan teknik yang sama dengan Benoit Esnard dalam jawaban ini (dari saya gandakan sumbernya, Anda gandakan hasilnya! ).
Mencetak 0 jika n = 47 * M , atau nilai bukan nol sebaliknya.
Demo untuk M = 1
Demo untuk M = 2
sumber
Brain-Flak , 24 byte
Cobalah online!
Cukup kurangi 24 dari input. Output
0
untuk true dan lainnya untuk false.Brain-Flak , 68 byte
Cobalah online!
Yang ini lebih canggih itu output
1
untuk benar dan0
salah.sumber