Kadang-kadang, saat bermain golf, seseorang harus mewakili sejumlah besar kode mereka. Menulisnya apa adanya dapat secara signifikan meningkatkan byte-count.
Apa 1 tips umum yang Anda miliki untuk mewakili angka panjang secara ringkas dalam kode?
Silakan kirim satu tip per jawaban.
1 Dengan umum , maksud saya tip yang dapat diterapkan ke lebih dari satu bahasa. Untuk kiat khusus bahasa, poskan di utas masing-masing.
Jawaban:
Carilah nomor khusus
Beberapa bahasa memiliki fungsi bawaan untuk kuadrat, eksponensial dengan basis 2, perdana ke- n , faktorial, atau prosedur lain yang dapat menghasilkan angka besar. Periksa apakah nomor Anda termasuk dalam kategori mana pun.
Dan jika tidak, mungkin saja angka yang lebih besar cocok untuk keperluan Anda dan dapat digunakan sebagai gantinya.
sumber
1.01e6
iterasi sudah cukup,1e7
hemat 3 byte dengan mengorbankan waktu berjalan.Gunakan operator boolean bitwise
Beberapa bahasa memiliki bitwise AND, OR, XOR, dan kadang-kadang TIDAK.
Mengekspresikan angka besar tertentu sebagai kombinasi bitwise dari hasil eksponensial atau shift kiri dan nomor lain dapat membuat Anda tepat angka yang Anda butuhkan. Ini biasanya hanya sepadan jika jumlahnya menjadi cukup besar.
Sebagai contoh,
2147483722
adalah 10 byte, tetapi2<<30^74
(2 ^ 31 bitwise-XORed dengan 74) hanya 8.sumber
bc
.). Dan XOR tidak pernah lebih bermanfaat daripada+
dan-
: dalam hal ini, xor dan add memberikan hasil yang sama, tetapi dalam semua kasus ada beberapa integer yang dapat ditambahkan atau dikurangi untuk menghasilkan hasil yang sama seperti xor dengan integer, dan addend adalah tidak lebih besar dan terkadang lebih pendek.1e9^2e9
.9<<49^7<<19
menggunakan penambahan, bukan xor?1286561280
dalam JavaScript dan Perl (dan mungkin bahasa lain), dan itu ekspresi yang lebih pendek untuk menghasilkan nilai itu daripada menggunakan+
atau setara-
.Gunakan String untuk angka berulang
Untuk bilangan yang sangat berulang, Anda bisa menggunakan string dan melemparkannya ke Integer. Misalnya, dalam JavaScript
sumber
1e100/9
dalam hal ini.Gunakan Notasi Ilmiah
Notasi ilmiah dapat menghemat byte jika nomor panjang. Sebagai contoh:
sumber
3564e-8
dalam kasus itu?.00003564
, yang juga satu byte lebih pendek lagi.Cari nomor lain untuk digunakan
Ini mungkin terdengar seperti bukan jawaban, tetapi tidak selalu jelas bahwa angka yang lebih besar dapat dihitung dengan kode yang lebih pendek. Contoh yang saya ingat adalah Keluaran salinan googol dari string , di mana jawaban yang jelas membutuhkan komputasi 10 100 . Ternyata, menghitung kelipatan 10 100 mengarah ke jawaban yang sama benarnya, tetapi dalam beberapa bahasa, jawaban yang lebih pendek. Jawaban Dennis di sana menggunakan 100 100 , saya sendiri menggunakan 250 255 .
sumber
es
jika Anda hanya membutuhkan sejumlah besar tetapi tidak peduli nilainya (atau selalu sama).Kompresi Dasar
Kode dekompresi basis bisa sangat kompleks, tetapi jika Anda memiliki jumlah yang sangat besar kadang-kadang dapat membantu untuk mengompresnya di beberapa basis yang lebih tinggi dari 10.
Ini juga membantu bahwa dalam beberapa bahasa, kode kompresi dasar sangat sederhana. Sebagai contoh, PHP memiliki
base64_decode(_)
, Python memilikiint(_,36)
, JavaScriptparseInt(_,36)
, dan banyak bahasa golf memiliki built-in dekompresi dasar. Misalnya, dalam CJam:Ini mengandung yang tidak patut dicetak. Cobalah online!
Ini menghasilkan:
sumber
Gunakan pecahan eksponensial untuk angka berulang yang besar
Katakanlah Anda ingin menghasilkan angka yang terbuat dari 100 1. Anda dapat menggunakan
int("1"*100)
,,+"1".repeat(100)
dll. Tetapi Anda juga dapat memanfaatkan fakta bahwa itu sangat dekatIni bekerja paling baik untuk angka yang sangat berulang, seperti yang terbuat dari satu digit. Beberapa digit berulang juga bekerja dengan cukup baik:
Kadang-kadang Anda akan menemukan beberapa pola aneh lainnya yang juga dapat direpresentasikan dengan cukup singkat dalam metode ini. Jika kebetulan Anda membutuhkan
int("123456790"*11)
, misalnya:Namun berhati-hatilah: angka-angka seperti
int("1234567890"*10)
tidak memiliki representasi yang mudah.sumber
Gunakan Bitwise Left Shift untuk eksponensial 2
Meskipun, ada banyak bahasa yang mendukung operator untuk eksponensial, beberapa tidak. Dan yang tidak, biasanya memerlukan fungsi panggilan (atau metode Kelas / Objek), yang dapat menelan biaya beberapa byte.
Tetapi Anda dapat menghemat beberapa byte saat Anda perlu menaikkan 2 ke daya n dengan menggunakan operator Bitwise Left Shift
<<
sebagai1<<n
. Perhatikan bahwa ini hanya akan menghemat byte jika n lebih besar atau sama dengan 17. Namun, ini akan selalu menghemat byte jika n dinamis. Beberapa contoh:sumber
8<<9 // 4096
sehingga kita dapat memperoleh hingga99<<61
6 byte, yang sama dengan6,917,529,027,641,081,856
menghemat 13 byte!Teorema Sisa Tiongkok
Jika bilangan bulat besar yang sewenang-wenang sering muncul, atau representasi bilangan bulat besar dalam bahasa pemrograman target menghabiskan terlalu banyak byte, Anda dapat mempertimbangkan menggunakan Teorema Sisa Bahasa Cina.
Pilih beberapa bilangan bulat relatif prima m i > = 2, dan Anda dapat mengekspresikan angka besar dari 0 hingga lcm (m 1 , m 2 , ..., m i ) -1
Misalnya, saya memilih 2, 3, 5, 11, 79, 83, 89, 97, maka saya dapat mengungkapkan angka kurang dari 18680171730 secara unik. 10000000000 (1e10) dapat dinyatakan sebagai 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97) yang tidak perlu dinyatakan sebagai kelas / struct Big Integer khusus yang mungkin menghemat beberapa byte dalam beberapa bahasa pemrograman.
Penambahan dan substraksi dapat dilakukan secara langsung menggunakan representasi ini. Contoh:
sumber
Gunakan String Padding (jika memungkinkan)
Jika sejumlah besar menyertakan digit berulang di awal atau akhir, Anda mungkin dapat menyimpan byte dengan menggunakan salah satu metode padding bahasa Anda untuk membangun string nomor yang Anda cari, yang kemudian dapat Anda konversi menjadi bilangan bulat.
Contoh
Untuk menghasilkan angka
1111111111111111111111112
(25 byte) dalam JavaScript (ES8):sumber
Gunakan Eksponen
Jika bahasa Anda memiliki operator eksponen, Anda mungkin dapat menggunakannya untuk menghasilkan, jika bukan angka yang Anda inginkan, setidaknya angka yang dapat Anda lakukan dengan perhitungan sederhana atau 2 angka untuk sampai pada nomor Anda. Bahkan tanpa operator, Anda mungkin masih bisa menyimpan byte dengan fungsi atau metode bawaan.
Contoh
The bilangan bulat aman maksimum dalam JavaScript adalah
9007199254740991
, yang merupakan 16 digit. Dalam ES7, ini dapat dihitung dengan 7 byte berikut:Persamaan dalam ES6 dan sebelumnya, sementara panjang yang sama dengan bilangan bulat itu sendiri dalam contoh ini, menunjukkan bahwa menggunakan metode yang lebih verbose mungkin tidak perlu biaya byte.
Meskipun demikian, hal di atas dapat bekerja lebih pendek jika, misalnya, Anda telah memiliki
Math
alias karakter tunggal di tempat lain dalam kode Anda.sumber
Gunakan pecahan sebagai pengganti float
Contoh:
1./3
sebagai pengganti0.333333333
sumber