... Ah maaf, tidak ada popcorn di sini, hanya POPCNT.
Tulis program atau fungsi terpendek yang mengambil angka n
dan mengeluarkan semua bilangan bulat dari 0 hingga 2 n - 1, dengan urutan jumlah 1 bit dalam representasi biner angka (popcount). Duplikat tidak diizinkan.
Urutan angka dengan popcount yang sama ditentukan implementasi.
Misalnya, untuk n = 3
, semua output ini valid:
0, 1, 2, 4, 3, 5, 6, 7
[0, 4, 1, 2, 5, 3, 6, 7]
0 4 2 1 6 5 3 7
Format input dan output ditentukan oleh implementasi untuk memungkinkan penggunaan fitur-fitur bahasa untuk menambah kode. Ada beberapa batasan pada output:
- Angka-angka harus berupa output dalam format desimal.
Output harus mengandung pemisah yang masuk akal di antara angka-angka (trailing separator diperbolehkan, tetapi tidak mengarah).
Line feed (
\n
), tab (\t
), ruang,,
,.
,;
,|
,-
,_
,/
yang separator cukup masuk akal. Saya tidak keberatan ruang tambahan untuk pencetakan cantik, tetapi jangan gunakan huruf atau angka sebagai pemisah.- Angka dan pemisah dapat dikelilingi oleh
[ ]
,{ }
atau setiap array atau notasi daftar. - Jangan cetak apa pun yang tidak disebutkan di atas.
Bonus
Lipat gandakan skor Anda dengan 0,5 jika solusi Anda dapat menghasilkan angka dengan cepat. Inti dari bonus ini adalah jika Anda mengkonversi secara langsung solusi pencetakan Anda menjadi generator, generator hanya menggunakan paling banyak memori O (n) di mana n adalah jumlah bit seperti yang didefinisikan di atas. (Anda tidak harus benar-benar mengubah solusi Anda menjadi generator). Perhatikan bahwa sementara saya memaksakan n <= 28, memori yang diperlukan untuk menyimpan semua angka masih tumbuh secara eksponensial, dan solusi pengurutan yang naif akan memakan setidaknya 4 GB memori pada n = 28.
Harap tambahkan beberapa penjelasan sederhana tentang cara kerja solusi Anda sebelum mengklaim bonus ini.
Jawaban:
Pyth, 9 byte
o
rder olehs
um dari representasi basis 2 (jN2
) pada rentang (U
) dari2 ^ Q
.(
Q
=eval(input())
).Coba di sini.
sumber
Python 2, 75 * 0.5 = 37.5
Berulang-ulang menghasilkan tertinggi berikutnya
v
dengan POPCOUNT yang sama dengan algoritma bit- twiddling ini .Sebenarnya, ternyata lebih mudah untuk menghasilkan mereka dalam mengurangi jumlah pop, kemudian mencetak komplemen untuk membuatnya meningkat. Dengan begitu, lalu
v
meluap2**n
, kita cukup menghapus semua kecualin
bit dengan&N
manaN=2**n-1
, dan itu memberi angka popcount terkecil satu lebih rendah. Dengan begitu, kita bisa melakukan satu loop. Mungkin ada solusi yang lebih baik yang secara langsung menemukan angka lebih rendah berikutnya dengan POPCOUNT yang sama.Karena masalah fencepost, kita perlu memulainya
v=2**(n+1)-1
sehingga operasi menghasilkanv=N-1
pada loop pertama.Output untuk
4
:sumber
console.log()
vsprint
). Mungkin tipuannya terlalu berat.v=N-~N
J, 19 karakter, tidak ada bonus.
2 ^ y
- Dua pangkat dariy
.i. 2 ^ y
- bilangan bulat dari0
hingga(2 ^ y) - 1
.#: i. 2 ^ y
- masing-masing bilangan bulat ini diwakili dalam basis dua.+/"1 #: i. 2 ^ y
- jumlah masing-masing representasi(i. 2 ^ y) /: +/"1 #: i. 2 ^ y
- vektori. 2 ^ y
diurutkan berdasarkan urutan item dari vektor sebelumnya, jawaban kami.sumber
Python, 63 karakter
sumber
C 179 * 0,5 = 89,5
EDIT: 157 * 0,5 = 78,5
EDIT: 132 * 0,5 = 66
atau sedikit lebih bagus diformat:
Apa itu?
menghitung angka terakhir untuk ditampilkan (pow (2, n) - 1)
loop luar mengulangi jumlah bit (jadi 0 hingga n-1) sedangkan loop dalam hanya dihitung dari 0 hingga m
Pada x86 ada instruksi POPCNT yang dapat digunakan untuk menghitung bit yang diset. GCC dan kompiler yang kompatibel dapat mendukung fungsi __builtin_popcount yang pada dasarnya mengkompilasi instruksi tersebut.
sumber
CJam, 13 byte
Implementasi yang cukup mudah.
Cara kerjanya :
Cobalah online di sini
sumber
Mathematica,
5046.
sumber
JavaScript (ES6) 41 (82 * 0,5)
Cara paling sederhana, bermain golf
Tidak disatukan
Uji di Firefox / konsol FireBug
sumber
Bash + coreutils, 66
Satu untuk Anda mulai:
sumber
sort
membutuhkan waktu lama. Dengan n = 28,sort
perlu mengurutkan 2 ^ 28 baris / ~ 13GB data.Haskell, (87 * 0,5) = 43,5
Contoh penggunaan:,
f 4
yang menghasilkan[0,1,2,4,8,3,5,9,6,10,12,7,11,13,14,15]
Cara kerjanya: tidak menyortir atau berulang kali mengulangi [0..2 ^ n-1] dan mencari angka yang mengandung i 1s.
Fungsi
#
helper mengambil dua parametera
danb
dan membangun daftar setiap angka yang terdiri daria
1s danb
0s. Fungsi utamaf
panggilan#
untuk setiap kombinasi daria
dan dib
manaa+b
saman
, dimulai dengan no 1s dann
0s untuk memiliki nomor-nomor secara berurutan. Berkat kemalasan Haskell, semua daftar itu tidak harus dibangun sepenuhnya dalam memori.sumber
++
ina#b
berarti bahwa sisi kiri (yang bisa jadi besar) perlu diproduksi seluruhnya dan kemudian disalin sebelum item pertama dalam hasil diproduksi, sehingga melanggar persyaratan untuk bonus?Ruby 47 chars
Mirip seperti Python dari @KeithRandall:
sumber
Mathematica, 26
Contoh:
sumber
Perl, 64/2 = 32
Lakukan iterate selama rentang
[0..2^n-1]
n + 1
waktu. Di setiap iterasi, cetak hanya angka-angka yang memiliki jumlah 1 bit sama dengan variabel iterasi ($i
). Bit dihitung dengan menghitung1
's (y/1//
) dalam jumlah yang dikonversi ke string biner dengansprintf
.Ujilah aku .
Perl, 63
Pendekatan penyortiran:
sumber
Java 8, 205
sumber
C ++ 11, 117 karakter:
Tidak Disatukan:
Penjelasan:
Buat satu set int, int pasang. Int pertama adalah jumlah bit, yang kedua adalah angka. Pasangan membandingkan diri mereka sendiri berdasarkan parameter pertama mereka, sehingga himpunan diurutkan berdasarkan jumlah bit.
sumber