Ada algoritma rumit yang terkenal untuk menghitung jumlah bit yang ditetapkan dalam integer 32-bit unsigned:
int popcount(unsigned x) {
x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x & 0x0F0F0F0F) + ((x >> 4) & 0x0F0F0F0F);
x = (x & 0x00FF00FF) + ((x >> 8) & 0x00FF00FF);
x = (x & 0x0000FFFF) + ((x >>16) & 0x0000FFFF);
return x;
}
Saya tidak akan menjelaskannya di sini. Tapi bayangkan kode serupa untuk bilangan bulat 512-bit! Konstanta heksadesimal akan besar, dan membentuk pola yang cantik. Tugas Anda hanyalah untuk mencetak hasil yang persis seperti ini :
0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
Tolong, tidak ada spasi tambahan - meskipun satu baris tambahan baru opsional.
Ini adalah kode-golf , jadi jawaban tersingkat (dalam byte) menang.
Jawaban:
05AB1E ,
262221 byte05AB1E menggunakan pengkodean CP-1252 .
Cobalah online!
Penjelasan
Versi lain yang mungkin ditingkatkan
sumber
Python 2,
524946 byteNomor k diberikan oleh
2**512/(2**2**k + 1)
. Ini untuk nomor 512 bit, jadi sepele untuk memperluas pola ke lebar yang berbeda.3 byte disimpan berkat Dennis.
3 byte disimpan berkat xnor.
sumber
l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9
01010101
,00010001
,00000001
, dan kemudian dikalikan tersebut dengan1
,11
,1111
untuk mendapatkan pola biner yang benar. Misalnya01010101
Anda bisa mendapatkan rumus untuk lebar tertentu dengan melakukansum 2^(2*k) for k = 0, w/2 - 1
dan mencari tahu itu(2**w - 1)/3
.PHP,
111110108 byteSatu byte disimpan berkat @ user59178.
Apa pola untuk 1024 bit? : D
sumber
$x<65
daripada$i++<7
. Kali ini saya mengujinya dan semuanya.Retina , 43 byte
Cobalah online!
Penjelasan
Ini membuat banyak penggunaan
:
opsi yang umumnya kurang digunakan yang memungkinkan Anda mencetak hasil antara, karena jauh lebih pendek untuk memodifikasi satu baris daripada untuk membangun seluruh output.Ini menggantikan input kosong dengan
0x
diikuti oleh 1285
s dan mencetaknya untuk menghasilkan baris pertama.Yang ini menggantikan
5
s dengan3
s untuk menghasilkan baris kedua dan mencetaknya juga.Ini adalah baris khusus-cased terakhir dan mengubah setiap dua
3
menjadi0f
untuk menghasilkan baris ketiga. Ini juga memulai perulangan melalui dua tahap terakhir ({
). Namun, tahap ini tidak akan melakukan apa pun setelah iterasi pertama kecuali mencetak keadaan saat ini. The;
menekan output pada akhir program untuk menghindari duplikasi baris terakhir.Substitusi ini sekarang mengubah setiap baris ke baris berikutnya, dengan menukar setiap pasangan
f
s dan0
s lainnya. Kondisi "setiap pasangan lain" diberlakukan dengan mencocokkan nol di depanf
, yang membuat tidak mungkin untuk mencocokkan pasangan berturut-turut karena pertandingan tidak dapat tumpang tindih.sumber
Vim, 32 byte
i5<CR>3<Esc>qqYpVrf$<C-V>{yPG1vr0q6@q<C-V>{I0x<Esc>
Saya hanya perlu secara manual menulis yang pertama
5
dan3
, dan makro menangani sisanya, "menggandakan jumlah bit" setiap kali berjalan. Urutan langkah-langkah di makro agak aneh (buatf
baris baru , salin blok-bijaksana, gunakan kembali ukuran blok visual untuk menempatkan0
s dif
baris), tapi itu varian tercepat yang saya temukan.sumber
Pyth, 26 byte
Port jawaban Python saya.
sumber
J,
4634 byteSaya sedang berusaha bermain golf ini, tetapi bayi ini suka tinggal di 46 byte ...Tidak lagi! -12 bytes terima kasih kepada mil!Cobalah online! : D
Hasil
Untuk jawaban ini, saya membutuhkan (idealnya) kata kerja dengan peringkat
0 1
sehingga dapat menggunakannya dalamu"v
definisi peringkat; Namun, mil mengamati bahwa0 _
itu cukup untuk tugas yang dihadapi.Di sini Anda melihat sekelompok representasi string kata kerja dengan peringkatnya masing-masing. Ini adalah skrip yang saya gunakan untuk menghasilkannya.
sumber
0 _
baik-baik saja di sini. Anda dapat mempersingkatnya menjadi 34 byte dengan'0x',"1'5','3','0f'(128$#)"{~2^i.7
Sebenarnya , 25 byte
Cobalah online!
Solusi ini menggunakan fakta bahwa
f(n) = 2**512//(2**2**n + 1)
(di mana//
pembagian lantai) untuk menyesuaikan nilai.Penjelasan:
sumber
JavaScript (Firefox 30+),
139113112928380 byteAkhirnya tekan sweet spot rekursif :-) Menggunakan pemahaman string berguna-keren untuk menghemat 3 byte lebih
.map
:.replace
juga 83 byte:Jika baris baru terkemuka diizinkan, ini juga akan menjadi 80 byte:
sumber
Python 2 , 60 byte
Cobalah online!
sumber
Bubblegum, 65 bytes
Obligatory Bubblegum answer.
sumber
Haskell,
8472 bytesPorting @orlp's answer:
94 byte alternatives without the power of
Text.Printf
:sumber
Control.Monad
in the REPL. Fixed.PowerShell v2+, 68 bytes
PowerShell doesn't have arbitrary precision integers without using
[bigint]
calls, and those can't be easily converted to hexadecimal, so we're instead treating this as a string-based challenge.The first line handles the repeating
5
and3
by just doing a string multiplication out to128
characters and tacking a0x
on the front.The next line loops from
$a=1
to7
, each iteration outputting another string. Again we have the0x
tacked onto the front, and we're doing string multiplication in the middle to construct the appropriate number of0
andf
concatenated together, and then doing string multiplication of that out to the appropriate number of characters. Note we're using variable$a
here, and not the loop counter$_
, so we can properly scale (otherwise we'd need to loop like1,2,4,8,16,32,64|%{...}
, which is longer).The resulting strings are left on the pipeline, and output via implicit
Write-Output
happens at program completion, with a newline between elements.sumber
V, 43 bytes
Try it online!
This uses one of the longest compressed regexes I've ever needed in a V answer. Here is the more readable version, where I added a byte for readable regexes, and changed the unprintable escape character to
<esc>
Explanation (using the readable version):
sumber
JavaScript (ES6),
747270 bytesIncludes the optional trailing newline.
Show code snippet
sumber
Pyth -
3130 bytesTo get pattern except for the
3
's and5
's it cumulative reduces, each time doubling the chunks.Try it online here.
sumber
Batch, 216 bytes
sumber
Vim 72 bytes
TryItOnline!
Unprintables:
4
@w
s pada akhirnya mengganggu saya, tetapi karena saya mengandalkan@q
gagal pada akhir baris, gagal juga @ w. Saya mungkin mencoba menjalankan q 32 kali dan melihat apakah itu mengacaukan baris kemudian.sumber
C, 146 byte
Tidak Disatukan:
sumber
brainfuck , 211 byte
Cobalah online!
sumber
x
generator dapat dipindahkan di luar loop sekarangGNU sed 4.2.2 , 77
Cobalah online.
sumber
Ruby ,
66 6045 byteCobalah online!
Ide dicuri dari orlp
sumber
C#, 168 bytes
sumber
Stax, 19 bytes
Run and debug it
Unpacked, ungolfed, and commented, it looks like this.
Run this one
sumber
///, 193 bytes
Try it online!
sumber