Buat program yang menghitung berat hamming dari string. Pemenang adalah program dengan bobot hamming terendah.
Aturan:
- Hamming weight untuk karakter ASCII didefinisikan sebagai jumlah total bit yang diset
1
dalam representasi binernya. - Asumsikan pengkodean input adalah ASCII 7-bit, melewati mekanisme input apa pun yang normal untuk bahasa Anda (mis. Stdin, args, dll.)
- Keluarkan hasilnya, sebagai angka, ke stdout atau apa pun mekanisme keluaran default / normal yang digunakan bahasa Anda.
- Seharusnya tidak perlu dikatakan, tetapi Anda harus dapat benar-benar menjalankan program, dalam kehidupan nyata, agar itu menjadi solusi yang valid.
- Winner adalah solusi yang kodenya memiliki bobot hamming terendah.
Maaf, tidak ada solusi di spasi putih untuk yang satu ini!Ok, Anda bisa kode di whitespace sekarang saya sudah beres aturan :)
Contoh per karakter:
char | binary | weight
-----+----------+-------
a | 01100001 | 3
x | 01111000 | 4
? | 00111111 | 6
\x00 | 00000000 | 0
\x7F | 01111111 | 7
code-golf
binary
number-theory
Polinomial
sumber
sumber
0x20
/ ASCII 32 sebagai rujukan, bukankah berat dengunganhello world
10 daripada 11?hello world
11? Hanya 10 karakter yang berbeda dari satu spasi. Juga - berat program Hamming tampaknya hanya panjangnya, tidak termasuk ruang. Tidak jauh berbeda dengan golf kode normal.~
DANo
.Jawaban:
J (33)
Satu lebih rendah dari 34!
Sangat terilhami oleh jawaban ini , tetapi bobot hamming satu lebih rendah.
sumber
J, berat 34
Penggunaan - tempatkan string yang akan diukur dalam tanda kutip di akhir:
Atau, mengambil input dari keyboard (berat 54):
sumber
J , 39
Ini adalah fungsi yang mengambil satu argumen. (Atau ganti
]
dengan string secara langsung; seperti yang dicatat Gareth, yang menurunkan biayanya menjadi 34.)sumber
Python, 189
sumber
print(sum(bin(ord(A)).count('1')for A in input()))
,, memiliki skor 180.QBasic,
322311286264Jenis alat yang tepat untuk pekerjaan itu, tentu saja masih menyebalkan.
sumber
Unary 0
Anda semua tahu itu akan datang. Pertama program BrainFuck:
Saya menambahkan baris baru untuk membuatnya "dapat dibaca" tetapi memiliki berat Hamming 4066. Ia bekerja dengan berulang kali mendapatkan hasil bagi / sisa dari string input dan menambahkan semua sisanya. Tentu saja jika Anda menjalankannya sendiri Anda mendapatkan: 226 (4066% 256) (secara teknis \ xe2) jadi jelas itu mengatur dirinya sendiri pemenangnya.
Sekarang kita mengubahnya menjadi Unary dan dapatkan
Kami menggunakan implementasi unary dengan karakter NULL \ x00 untuk '0' dan boom, dengan bobot 0.
Pertanyaan bonus : Untuk karakter ASCII apa
c
Anda dapat menjalankan program ini pada string yang terdiri dariN
reposisi dan mengeluarkannya dari karakter tersebut. (EG string 32 spasi memberi ruang). Nilai-nilaiN
pekerjaan apa (baik jumlah mereka yang tak terbatas akan berfungsi, atau tidak ada yang mau).sumber
main(){ bignum Unarynum = 0; int c; while(EOF!=(c=readchar())){ Unarynum++; } return Unarynum; }
Tidak masalah sama sekali apa yang Anda pilih untuk menjadi karakter Unary Anda (asalkan bukan EOF).C, berat
322263256Apakah berat hamming dari hamming weight dihitung?
Kebanyakan digunakan teknik golf standar.
Satu loop menghitung berat (menggeser ke kanan dan menambahkan sampai nol) dan memindai string (memajukan pointer ketika nol tercapai).
Dengan asumsi
D
diinisialisasi ke 2 (parameter tunggal).Optimal berat spesifik Hamming:
1.
ABDH
, dengan bobot 2 masing-masing, digunakan untuk nama.2.
*++H
lebih disukai daripadaH[1]
.sumber
main(D,H,A)char*A,**H;{for(A=*++H;*A;A+=!(*A/=2))if(*A%2)printf("@");}
@
angka dalam sistem unary. Saya pikir itu hanya menggunakan0
..0
. Tetapi jika Anda ingin pergi ini, cara,printf("@"+*a%2)
lebih pendek.Golfscript
847258(Terima kasih kepada Howard dan Peter Taylor untuk bantuan mereka)
Input: string input harus berada di tumpukan (dilewatkan sebagai argumen baris perintah, atau cukup ditempatkan di tumpukan).
Jika Anda menjalankannya dari baris perintah, pastikan Anda menggunakan
echo -n
, jika tidak maka baris tambahan juga akan dihitung.Output: mencetak nilai bobot hamming ke konsol
Program ini dapat diuji di sini .
sumber
BASE
alih-alihbase
. Pembaruan: Baru diperiksa,BASE
tidak berfungsi. Solusi yang bagus :)TEST
/test
komentar Anda :) Tetapi tidak berhasil.{...}2*
dengan mendaftar2base~
terlebih dahulu. Skor turun menjadi 72.;
sebelum string yang Anda ganti dengan stdin, jadi itu(;
tidak perlu. Lalu pengamatan Howard membuatnya menjadi 65.Perl, 80 (22 karakter)
Dilakukan dan dilakukan:
Atau inilah versi alternatif dengan berat 77 (21 karakter):
Saya tidak terlalu suka versi itu, karena outputnya menghilangkan baris terakhir.
Untuk menghitung bobot, saya mengasumsikan bahwa saya menghitung karakter dengan cara biasa (tidak termasuk
perl -e
/-E
, tetapi termasuk karakter opsi lainnya). Jika karena alasan tertentu orang mengeluh tentang hal ini, maka yang terbaik yang dapat saya lakukan tanpa opsi adalah 90 (26 karakter):Penggunaan sampel:
Ledakan.
sumber
Pyth - 15
Penafian: Jawaban ini tidak memenuhi syarat untuk menang karena Pyth lebih muda dari tantangan ini.
Menggunakan
.B
untuk representasi biner dan menghitung jumlah"1"
.Mengambil input dalam string untuk menghemat
z
versusQ
.Cobalah online di sini .
sumber
Scala 231
Kode selftesting:
dengan modifikasi selftesting.
sumber
@
dan ruang, yang tidak Anda gunakan) setidaknya memiliki bobot 2.Jawa, berat
931774499454Saya pikir ini adalah satu-satunya jawaban saat ini dengan berat lebih dari 300.
Mengharapkan input sebagai argumen baris perintah.
sumber
GNU
sed -r
, 467 +1(+1 untuk penggunaan
-r
- atau seharusnya +4?)Output sebagai nilai unary per baris sumber; untuk mengkonversi ke total desimal, redirect output ke
| tr -d "\n" | wc -c
. Menghitung semua karakter ASCII yang dapat dicetak (32-126), plus linefeed (10).Sulit untuk menghindari daftar semua karakter, tetapi kita dapat mengurangi ini mengamati bahwa huruf kecil memiliki berat Hamming satu lebih dari huruf besar yang sesuai. Kami lebih suka baris baru (skor 2) daripada titik koma (skor 5) sebagai pemisah pernyataan; kami lebih suka
@
(skor 1) atau!
(skor 2) lebih dari/
(skor 5) sebagai pembatas pola.Catatan - untuk mendapatkan set karakter yang tepat, saya membuat tabel ini dari yang masuk
man ascii
, diurutkan berdasarkan berat. Cukup tambahkan skor tepat dan di bawah ini untuk mendapatkan bobot keseluruhan dari setiap karakter:Ini mungkin terbukti bermanfaat bagi orang lain.
sumber
Julia 262
268Versi modifikasi menggunakan fungsi 'count_ones' yang praktis untuk menghemat 6 (262)
Versi lama tanpa fungsi bawaan satu penghitungan (268)
Menggunakan argumen baris perintah untuk input.
sumber
CJam 52 atau 48
Jika input belum ada di stack (52)
Jika input ada di tumpukan (48)
Sebagai contoh
sumber
Julia, HW 199
Dengan
atau dengan langsung memasukkan string:
Versi ungolfed (HW 411) terlihat seperti ini:
Dan untuk bersenang-senang, ini adalah versi yang dioptimalkan (Hamming Weight 231 ) dari bakerg's mengambil masalah:
dengan
sumber
HPPPL (Bahasa Pemrograman Utama HP), 74
Kalkulator grafik HP Prime memiliki fungsi hamdist () bawaan. Berat hamming masing-masing karakter sama dengan jarak hamming dari 0.
ASC (string) membuat array nilai ASCII dari setiap karakter dalam sebuah string.
hamdist (value, 0) menghitung jarak hamming dari 0 untuk setiap nilai ASCII
jumlah () jumlah semua nilai.
Menghitung bobot hamming dari kode sumbernya sendiri:
sumber
05AB1E , berat 17 (4 byte )
Cobalah secara online atau verifikasi beberapa kasus uji lagi .
Penjelasan:
sumber
Perl 6 , 102
Cobalah online!
Meskipun ini bukan kode golf, solusi terpendek tampaknya juga memiliki bobot hamming terkecil ...
sumber