Tulis beberapa pernyataan yang akan menghitung jumlah yang dalam bilangan bulat enam belas bit yang tidak ditandatangani.
Misalnya, jika inputnya adalah 1337
, maka hasilnya adalah 6
karena 1337
sebagai angka biner enam belas bit 0000010100111001
, yang berisi enam angka .
Jawaban:
80386 Kode Mesin, 4 byte
yang mengambil bilangan bulat
cx
dan mengeluarkan hitunganax
, dan setara dengan:Dan berikut adalah solusi
1110 byte yang tidak menggunakan POPCNT:yang setara dengan:
sumber
ax
dancx
denganeax
danecx
mengubahnya menjadi 32-bit. Bytecode sama untuk keduanya.Python 2, 17 byte
The
bin
built-in kembali integer dikonversi ke string biner. Kami kemudian menghitung1
digit:sumber
J (5 karakter)
J tidak memiliki tipe eksplisit. Ini melakukan hal yang benar untuk semua bilangan bulat.
+/
jumlah@
dari#:
representasi dasar duasumber
C, 21
Anda mengatakan "tulis beberapa pernyataan" (bukan "fungsi") jadi saya berasumsi nomornya disertakan
x
dan angka 1 dikembalikann
. Jika saya tidak perlu menginisialisasi,n
saya dapat menyimpan 3 byte.Ini adalah adaptasi dari ekspresi terkenal
x&x-1
untuk menguji apakah sesuatu adalah kekuatan 2 (salah jika ya, benar jika tidak.)Ini dia beraksi pada nomor 1337 dari pertanyaan. Perhatikan bahwa mengurangi 1 membalik 1 bit paling tidak signifikan dan semua nol ke kanan.
EDIT: untuk kelengkapan, inilah algoritma naif, yang satu byte lebih panjang (dan sedikit lebih lambat.)
sumber
{}
. Ini adalah tugas yang sangat sederhana sehingga saya tidak perlu heran jika seseorang telah melakukannya.for(n=0;x;x/=2)n+=x&1;
Jelly , tidak bersaing
Jawaban ini tidak bersaing, karena bahasa tersebut dibuat setelah tantangan diposting.
2 byte:
Jelly adalah bahasa baru yang ditulis oleh @Dennis, dengan sintaksis mirip J.
Coba di sini .
sumber
Pyth, 4 byte
Program ini mengambil nomor yang berat hammingnya dapat ditemukan di STDIN.
sumber
Julia,
292719 byteIni menciptakan fungsi anonim yang menerima satu argumen
n
,. Untuk menggunakannya, tetapkan ke sesuatu sepertif=n->...
dan menyebutnya sepertif(1337)
.The
digits()
fungsi, saat dipanggil dengan 2 argumen, mengembalikan array angka dari input di dasar diberikan. Jadidigits(n, 2)
mengembalikan digit biner darin
. Ambil jumlah array dan Anda memiliki jumlah yang dalam representasi binern
.sumber
count_ones
CJam, 6 byte
Cobalah online di sini
sumber
Joe , 4 byte
Ini adalah fungsi anonim.
Ba
memberikan representasi biner dari angka dan/+
menjumlahkannya.sumber
R, 24 byte
scan()
membaca input dari stdin.intToBits()
mengambil integer dan mengembalikan vektor tipe yangraw
berisi nol dan representasi biner dari input.intToBits(scan())>0
mengembalikan vektor logis di mana setiap elemen adalahTRUE
jika elemen vektor biner yang sesuai adalah 1 (karena semua elemen adalah 0 atau 1 dan 1> 0), jika tidakFALSE
.Dalam R, Anda dapat menjumlahkan vektor logis untuk mendapatkan jumlah
TRUE
elemen, jadi menjumlahkan vektor logis seperti di atas memberi kita apa yang kita inginkan.Catatan yang
sum()
tidak dapat menanganiraw
input secara langsung, oleh karena itu solusinya menggunakan logika.sumber
sum(intToBits(scan()))
akan sama?sum()
tidak dapat mengambil input tiperaw
, dari mana kembaliintToBits()
.Ruby, 18 byte
n.to_s(2).count'1'
sumber
n.to_s(2).count ?1
juga bekerja, tetapi memiliki panjang yang samaKeempat,
4849 byteJika fungsi aktual diperlukan maka baris kedua menjadi
dan Anda menyebutnya dengan "1337 c". Kata-kata kontrol Forth yang relatif verbose membuat ini sulit (sebenarnya, mereka membuat banyak ini sulit).
Sunting: Versi saya sebelumnya tidak menangani angka negatif dengan benar.
sumber
Mathematica,
2218 byteTerima kasih kepada alephalpha untuk mengingatkan saya pada
DigitCount
.sumber
ES6 (
342221 byte):Ini adalah fungsi rekursif sederhana yang dapat disingkat lebih sedikit. Hanya perlu sedikit dan berjalan sendiri lagi:
Cobalah di http://www.es6fiddle.net/imt5ilve/ (Anda memerlukannya
var
karena'use strict';
).Aku tidak percaya aku telah mengalahkan Fish !!!
Yang tua:
ES5 (39 byte):
Kedua fungsi dapat dengan mudah disesuaikan dengan ES5:
Yang lama:
@ user1455003 memberi saya ide yang sangat bagus, yang 'memicu' yang terkecil:
Saya telah mengadaptasinya ke ES6 dan membuatnya rekursif untuk mempersingkat banyak!
sumber
> <> (Ikan) , 24 byte + 2 = 26
Program hanya mengulangi mod 2, kurangi dan bagi sampai jumlah input menjadi nol, lalu cetak jumlah mod 2s.
Uji dengan
-v
bendera, missumber
-v
bendera masih berfungsi.)PHP (38 byte):
Ini menggunakan pendekatan yang sama dengan jawaban ES6 saya
Ini adalah kode lengkap, Anda hanya perlu memasukkannya ke dalam file dan mengaksesnya melalui browser, dengan parameter
n=<number>
.PHP <4.2 (32 byte):
Ini sedikit lebih pendek:
Ini hanya berfungsi dengan baik pada PHP <4.2 karena arahan
register_globals
diatur keOff
default dari PHP4.2 hingga PHP5.4 (yang telah dihapus saat itu).Jika Anda membuat
php.ini
file denganregister_globals=On
, ini akan berfungsi.Untuk menggunakan kode, akses file menggunakan browser, dengan POST atau GET.
@ViniciusMonteiro 's saran (38/45 bytes):
Dia memberikan 2 saran yang sangat bagus yang memiliki fungsi penggunaan yang sangat menarik
array_sum
:38 byte:
45 byte:
Ini adalah ide yang sangat bagus dan dapat dipersingkat lebih lama, menjadi 36 byte:
sumber
<?=substr_count(decbin(1337),"1");
(34 byte)<?=substr_count(decbin(1337),1);
. Itu adalah total 32 byte. Mengingat kode ini cukup berbeda, bukankah Anda ingin mempostingnya sebagai jawaban Anda sendiri? Saya yakin akan mengungguli itu!<?=substr_count(decbin($argv[1]),1);
(atau$_GET[n]
; 36 byte)C #, 45 byte
https://dotnetfiddle.net/kJDgOY
sumber
b-48
bahkan lebih pendek, AFAIKJapt, 3 byte (tidak kompetitif)
Coba di sini.
sumber
¢o1 l
akan bekerja juga. Pendekatan lain yang menarik adalah-¢¬r-0
;¢¬
membagi menjadi array angka biner,r-0
mengurangi dengan mengurangi, mulai dari 0, dan-
meniadakan hasilnya, menjadikannya positif.¢¬x
.lilin lebah ,
3127 byteJawaban tidak bersaing. Lilin lebah lebih baru dari tantangan ini.
Solusi ini menggunakan cara Brian Kherigan untuk menghitung bit yang ditetapkan dari situs web "Bit Twiddling Hacks".
itu hanya berjalan melalui loop, menambah jumlah bit, sementara iterasi
number=number&(number-1)
sampainumber = 0
. Solusinya hanya melewati loop sesering ada bit yang ditetapkan.Saya bisa mencukur 4 byte dengan mengatur ulang beberapa instruksi. Kode sumber dan penjelasan diperbarui:
Penjelasan:
Klon repositori GitHub saya yang berisi juru bahasa lilin lebah, spesifikasi bahasa, dan contoh-contoh.
sumber
Java, 17 byte
Bekerja untuk
byte
,short
,char
, danint
. Gunakan sebagai lambda.Tes di sini
Tanpa menggunakan built-in:
42 byte
Tes di sini
sumber
Klip , 6
2 cara:
Ini adalah terjemahan langsung dari persyaratan: hitungan yang ada di representasi angka-2 basis.
Metode lain, yang mengambil jumlah digit dari representasi basis-2.
sumber
Oktaf, 18
Contoh:
sumber
GML (Game Maker Language), 21 byte
sumber
C # 39 byte
sumber
Perl, 21
sumber
PowerShell (51 byte)
Penjelasan:
[convert]::ToString($s,2)
menghasilkan representasi string biner dari$s
.[char[]]
melemparkannya sebagai array char dan memungkinkan kita untuk menghitung setiap char.|%{"+$_"}
menambahkan setiap karakter dengan tanda +"$()"
secara implisit memanggil.ToString()
sub ekspresi yang dihasilkan|iex
menjumlahkan string yang disalurkan (mis. "+1 +0 +1 +1 +0 +1 +0 +0" = 4)sumber
-join
operator sebaris dan implisit.ToString()
untuk mencapai 45 byte dengan[char[]][convert]::ToString($s,2)-join'+'|iex
... ATAU, sebagai pendekatan yang berbeda gunakan-replace
operator sebaris untuk mencapai 43 byte dengan([convert]::ToString($s,2)-replace0).length
Clojure, 42 byte
Membaca dari kanan ke kiri, mengonversi ke string biner, mengonversi ke urutan karakter, memfilter
1
s dan menghitung berapa banyak yang Anda miliki.Diedit dengan bantuan dari Sieg
sumber
#(count(filter #{\1}(Integer/toString% 2)))
#(count(filter #{\1}(Integer/toString % 2)))
CompilerException java.lang.IllegalArgumentException: No matching method: toString_PERCENT_
Integer/toString
. Tapi itu berhasil sedetik yang lalu.Haskell 42 karakter
mendeklarasikan penggunaan fungsi
f :: Integer -> Integer
dari interpreter interaktif sebagai
f <number>
atau menambahkan barismain=print$f <number>
ke akhir file.sumber
rem n 2
s alih-alih membangun daftar itu dan dengan menggunakandiv
alih-alihquot
:t 0=0
t n=t(div n 2)+rem n 2
- tidakf
lagi.Matlab, 13 byte
de2bi
membuat vektor nol dan yang mewakili angka biner, dansum
hanya mengembalikan jumlah semua entri.sumber
𝔼𝕊𝕄𝕚𝕟, 4 karakter / 11 byte (tidak kompetitif)
Try it here (Firefox only).
Penjelasan
Mengonversi input ke biner, membelah karakter, dan mendapatkan jumlah array yang dihasilkan.
sumber