Sihirli popcount numaraları


25

Bir var ayarlanan bit sayısını saymak için ünlü zor algoritma 32 bit işaretsiz tamsayı:

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;
}

Burada açıklamayacağım. Ancak 512 bit tamsayılar için benzer bir kod hayal edin! Onaltılık sabitler çok büyük olur ve güzel bir desen oluşturur. Göreviniz bu tam çıktıyı basmaktır :

0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Sondaki boşluk yok, lütfen - sondaki tek satır yeni bir isteğe bağlıdır.

Bu , bu yüzden en kısa cevap (bayt cinsinden) kazanır.


Girdi kabul edilir mi (0x0x0x0x0x0x0x0x0x gibi bir şey gibi)?
ouflak

@ouflak No. ———
Lynn

Yanıtlar:


3

05AB1E , 26 22 21 bayt

05AB1E, CP-1252 kodlamasını kullanır .

9F„0x0NÍo×9ooNoo>÷hJ,

Çevrimiçi deneyin!

açıklama

9F                      # for N in [0 ... 8]
  „0x                   # push the string "0x"
     0NÍo×              # push 2**(N-2) zeroes
          9oo           # 2**2**9
                 ÷      # //
             Noo>       # (2**2**N+1)
                  h     # converted to base-16
                   J    # join everything to string
                    ,   # print with a newline

Geliştirilebilecek diğer sürümler

9F9ooNoo>÷h¾6o×J7o£R…0xÿ,
9F9ooNoo>÷h0žy×ìR7o£R…0xÿ,
9FX0No×1No×JCh7o×1K7o£…0xÿ,
8ÝovX0y×1y×JCh7o×1K7o£…0xÿ,
9F1NoÅ0D>)˜JCh1K7o×7o£…0xÿ,

21

Python 2, 52 49 46 bayt

Kth numarası ile verilir 2**512/(2**2**k + 1). Bu 512 bitlik bir sayı içindir, bu nedenle deseni farklı genişliklere genişletmek önemsizdir.

l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9

Dennis sayesinde 3 bayt kurtarıldı.
Xnor sayesinde 3 bayt kaydedildi.


2
İsteğe bağlı hassas tam sayıların avantajları ...
ETHproductions

Güzel. Bu birkaç byte kazandırır.
Dennis,

Kare kalmaya daha kısa:l=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9
xnor 5

1
Python'u oy liderliğinde görmek kalbimi ısıtıyor :)
Tobias Kienzler

4
@TuukkaX Sadece biraz titreyen kesmekle ilgili deneyimlerim var. Toplamları ve benzerlerini basitleştirmek için Wolfram Alpha'yı çok kullandım. Ama temelde ben desen yapılmış 01010101, 00010001, 00000001, ve o zamana kadar bu çarpılır 1, 11, 1111doğru ikili desenleri elde etmek. Mesela 01010101belli bir genişlik için w formülünü elde ederek sum 2^(2*k) for k = 0, w/2 - 1öğrenebilirsiniz (2**w - 1)/3.
orlp

7

PHP, 111 110 108 bayt

@ User59178 sayesinde bir bayt kaydedildi.

<?=($p=str_pad)("0x",130,5).$p($s="\n0x",131,3);for($x=1;$x<65;$x*=2)echo($p($s,131,$p(0,$x,0).$p(f,$x,f)));

1024 bitlerin kalıbı nedir? : D


1
Kullanmak $x<65yerine bir bayt kaydedebilirsiniz $i++<7. Bu sefer onu ve her şeyi test ettim.
user59178,

6

Retina , 43 bayt

:`
0x128$*5
:`5
3
;{:`33
0f
0(f+)(0+)
0$2$1

Çevrimiçi deneyin!

açıklama

Bu, :ara sonuçları yazdırmanıza olanak tanıyan genellikle kullanılmayan seçeneği çok kullanır , çünkü tek bir satırı değiştirmek, çıktıyı oluşturmaktan çok daha kısadır.

:`
0x128$*5

Bu boş girişi 0x128 5s ile değiştirir ve ilk satırı oluşturmak için yazdırır.

:`5
3

Bu , ikinci çizgiyi oluşturmak için s'yi 5s ile değiştirir 3ve onu da basar.

;{:`33
0f

Bu son özel kasalı çizgidir ve üçüncü çizgiyi oluşturmak için her iki 3saniyede bir dönüşür 0f. Bu aynı zamanda son iki aşamada bir döngü başlatır ( {). Bununla birlikte, bu aşama mevcut durumu yazdırmak dışında ilk yinelemeden sonra hiçbir şey yapmaz. ;Bastırır programın en sonunda çıkış son satırı çoğaltarak önlemek için.

0(f+)(0+)
0$2$1

Bu ikame, şimdi her diğer fs ve 0s çiftlerini değiştirerek her satırı bir sonrakine dönüştürmektedir . "Her diğer çift" koşulu, önünde bir sıfır eşleştirilerek uygulanır; bu f, eşleşmeler üst üste gelemediğinden ardışık çiftleri eşleştirmeyi imkansız kılar.


6

Vim, 32 bayt

i5<CR>3<Esc>qqYpVrf$<C-V>{yPG1vr0q6@q<C-V>{I0x<Esc>

Ben yalnızca el ilk yazmaya gerek 5ve 3, ve makro onu her çalıştığında "bit sayısını iki katına", gerisini halleder. Makro adımların sırası garip biraz (yeni yapmaktır f, çizgi, blok odaklı kopyasını koymak için görsel blok boyutunu yeniden 0olduğundan da fhat), ancak bulduğum en hızlı varyantı var.


5

Pyth, 26 bayt

V9%"0x%0128x"/^2 512h^2^2N

Python cevabımın limanı.


5

J, 46 34 bayt

Bunu golf oynamaya çalışıyorum ama bu bebek 46 byte kalmayı seviyor ... Artık değil! Kilometrelerce -12 bayt!

'0x',"1'5','3','0f'(128$#)"{~2^i.7

Çevrimiçi deneyin! : D

Sonuç

   '0x',"1'5','3','0f'(128$#)"{~2^i.7
0x55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
0x33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f
0x00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
0x0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff
0x00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff00000000ffffffff
0x0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff
0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000ffffffffffffffffffffffffffffffff
0x0000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff

Bu cevap için, (ideal olarak) rütbe tanımında 0 1kullanmak için rütbeli bir fiile ihtiyacım vardı u"v; ancak miller bunun 0 _eldeki görev için yeterli olduğunu gözlemledi .

┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│= │< │<.│<:│> │>.│>:│+ │+.│+:│* │*.│*:│_ 0 0│_ 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│0 0 0│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│- │-.│-:│% │%.│%:│^ │^.│$ │$.│$:│~.│~:│0 0 0│0 _ _│0 _ _│0 0 0│2 _ 2│0 0 0│0 0 0│0 0 0│_ 1 _│_ _ _│_ _ _│_ 0 0│_ 0 0│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│| │|.│, │,.│,:│; │;:│# │#.│#:│! │/:│\:│0 0 0│_ 1 _│_ _ _│_ _ _│_ _ _│_ _ _│1 _ _│_ 1 _│1 1 1│_ 1 0│0 0 0│_ _ _│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│[ │[:│] │{ │{.│{:│}.│}:│".│":│? │?.│a │_ _ _│_ _ _│_ _ _│1 0 _│_ 1 _│_ 0 0│_ 1 _│_ 0 0│1 _ _│_ 1 _│0 0 0│_ 0 0│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│A │A.│b │C │C.│d │D │e │e.│E │E.│f │H │_ _ _│1 0 _│_ _ _│_ _ _│1 1 _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│0 _ _│_ _ _│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│i │i.│i:│I │I.│j │j.│L │L.│M │o │o.│p │_ _ _│1 _ _│0 _ _│_ _ _│1 _ _│_ _ _│0 0 0│_ _ _│_ 0 0│_ _ _│_ _ _│0 0 0│_ _ _│
├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│p.│p:│q │q:│r │r.│s │s:│S │t │T │u:│x:│1 1 0│0 _ _│_ _ _│0 0 0│_ _ _│0 0 0│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

Burada, fiillerin dize ile temsil ettikleri sıraları ile görüyorsunuz. Bu onu oluşturmak için kullandığım senaryo.


0 _Burada bir rütbe ile fiil iyidir. '0x',"1'5','3','0f'(128$#)"{~2^i.7
mil

@miles Huh. Bunu denedim sandım ... harika! ve J'nin otomatik satır doldurma özelliğini unuttum, tekrar teşekkürler!
Conor O'Brien,

4

Aslında , 25 bayt

9r`╙╙u9╙╙\#"0x%0128x"%`Mi

Çevrimiçi deneyin!

Bu çözüm , değerleri ölçmek için f(n) = 2**512//(2**2**n + 1)( //döşeli bölme nerede) gerçeğini kullanır .

Açıklama:

9r`╙╙u9╙╙\#"0x%0128x"%`Mi
9r`╙╙u9╙╙\#"0x%0128x"%`M   for n in range(1, 10):
      9╙╙\                   2**2**9//
   ╙╙u                                (2**2**n + 1)
          #"0x%0128x"%       pad with zeroes to 128 digits, prefix with "0x"
                        i  flatten and implicitly print

4

JavaScript (Firefox 30+), 139 113 112 92 83 80 bayt

_=>[for(x of"970123456")(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)].join`
`

Sonunda özyinelemeli tatlı noktaya vurmak :-) 3-byte tasarruf için kullanışlı bir züppe dize anlama kullanır .map:

_=>[..."970123456"].map(x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)).join`
`

.replace ayrıca 83 bayttır:

_=>"970123456".replace(/./g,x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):'0x')(128)+`
`)

Önde gelen bir yeni satıra izin verildiyse, bu 80 bayt olur:

_=>"970123456".replace(/./g,x=>(f=y=>y--?f(y)+(x>6?x-4:y>>x&1&&'f'):`
0x`)(128))


3

Bubblegum , 65 bayt

00000000: c5cb 4501 0441 1043 d17b d4fc 254b d110  ..E..A.C.{..%K..
00000010: f7cb 9761 9e7a 8d45 e451 4ce4 564c 04d7  ...a.z.E.QL.VL..
00000020: 2e11 b02b 8f08 80df aa5e 11fe fc77 762c  ...+.....^...wv,
00000030: 428b 5b8e ae8b 30c1 13b6 ce8b b091 377a  B.[...0.......7z
00000040: 01                                       .

Zorunlu Bubblegum cevap.


3

Haskell, 84 72 bayt

@ Orlp kullanıcısının yanıtı:

import Text.Printf
mapM(\n->printf"0x%0128x\n"$div(2^2^9)$2^2^n+1)[0..8]

Gücü olmayan 94 bayt alternatifler Text.Printf:

import Data.List
mapM(putStrLn.("0x"++))$transpose$("53"++).reverse<$>sequence(["0f"]<*[1..7])

r=[0..127]
mapM(putStrLn.("0x"++))$('5'<$r):('3'<$r):[["0f"!!mod(div x(2^y))2|x<-r]|y<-[0..6]]

@nimi whoops, REPL’e yüklenmiş olmalı Control.Monad. Sabit.
Angs

3

PowerShell v2 +, 68 bayt

5,3|%{"0x"+"$_"*128}
($a=1)..7|%{"0x"+('0'*$a+'f'*$a)*(128/($a*=2))}

PowerShell, [bigint]çağrıları kullanmadan rastgele kesinlik sağlayan tam sayılara sahip değildir ve bunlar onaltılık sayıya kolayca dönüştürülemez, bu yüzden bunun yerine string tabanlı bir mücadele olarak görüyoruz.

İlk satır, tekrarlamayı 5ve 3sadece 128karakterlere bir dize çarpımı yaparak 0xve cepheyi atarak giderir .

Sonraki satır döngüler $a=1için 7başka dize çıktısı her yineleme. Yine var 0xön tacked ve biz uygun sayıda oluşturmak için orta dize çarpma yapıyoruz 0ve fbirlikte birleştirilmiş ve daha sonra dize çarpma yapıyor o karakterlerin uygun sayıya out. $aBurada değişken sayacı kullandığımızı ve döngü sayacını kullanmayacağımızı unutmayın $_, bu nedenle doğru ölçeklendirebiliriz (aksi halde 1,2,4,8,16,32,64|%{...}daha uzun olan gibi döngü yapmamız gerekir ).

Elde edilen dizgiler boru hattında bırakılır ve örtük bir şekilde çıktı Write-Output, öğeler tamamlandığında yeni bir satırla program tamamlandığında gerçekleşir.


3

V , 43 bayt

64i0fòYpÓ¨¨0«©¨f«©©û2}/²²³³òdd{3ÄÒ5jÒ3Îi0x

Çevrimiçi deneyin!

Bu, bir V cevabında ihtiyacım olan en uzun sıkıştırılmış regex'lerden birini kullanıyor. İşte okunabilir regex'ler için bir bayt eklediğim ve yazdırılamayan kaçış karakterini değiştirdiğim daha okunabilir sürüm<esc>

64i0f<esc>òYpÓö((0+)(f+)){2}/²²³³òdd{3ÄÒ5jÒ3Îi0x

Açıklama (okunabilir versiyonu kullanarak):

64i0f<esc>                                          " Insert 64 "0f"s and escape to normal mode
          ò                      ò                  " Recursively:
           Yp                                       "   Duplicate this line
             Ó                                      "   Substitute:
              ö                                     "     (Optionally Turn the readable version on)
               ((0+)(f+))                           "     One or more '0's followed by one or more 'f's
                         {2}                        "     Repeated twice
                            /                       "   With:
                             ²²                     "     The second capture group twice (the '0's)
                               ³³                   "     Followed by the third capture group twice (the 'f's)
                                                    "   Once the search is not found, the loop will break
                                  dd                " Delete a line (because we have one too many)
                                    {               " Move to the first line
                                     3Ä             " Make three copies of this line
                                       Ò5           " Replace the first one with '5's
                                         jÒ3        " Move down a line and replace the second with '3's
                                            Î       " On every line:
                                             i0x    "   Insert a '0x'

3

JavaScript (ES6), 74 72 70 bayt

İsteğe bağlı izleyen yeni satırı içerir.

f=(i=1152)=>i--?f(i)+(i&127?'':`
0x`)+('53'[y=i>>7]||i&1<<y-2&&'f'):''



2

Toplu iş, 216 bayt

@echo off
set s=5
call:c
set s=3
call:c
set a=0
set b=f
for /l %%i in (1,1,7)do call:l %%i
exit/b
:l
set s=%a%%b%
:c
for /l %%j in (0%1,1,6)do call set s=%%s%%%%s%%
echo 0x%s%
set a=%a%%a%
set b=%b%%b%

2

Vim 72 bayt

i0x128a5Ypll128r3o0x64a0fa0Ypqqffdt0fft0p@qq@qqwYp@qq@w@w@w@w:%s/0$

TryItOnline!

Unprintables:

i0x^[128a5^[Ypll128r3o0x^[64a0f^[a0^[Ypqqffdt0fft0p@qq@qqwYp@qq@w@w@w@w:%s/0$

Sondaki 4 @wler beni rahatsız ediyor, ancak @qbir satırın sonunda başarısızlığa güvendiğim için, @w de başarısız oluyor. Sadece 32 kez koşmayı ve sonraki satırları karıştırıp karıştırmayacağını görmeyi deneyebilirim.


2

C, 146 bayt

#define F for(i=0;++i<129;)s[i+1]=
#define P ;puts(s);
i,j;f(){char s[131]={'0','x'};F'5'P F'3'P for(j=1;(j*=2)<129;){F(i-1)%j<j/2?'0':'f'P}}

Ungolfed:

#define F for(i=0;++i<129;)s[i+1]=
#define P ;puts(s);
i,j;f(){
  char s[131]={'0','x'};
  F'5'P
  F'3'P
  for(j=1;(j*=2)<129;){
    F(i-1)%j<j/2?'0':'f'P 
  }
}


2

brainfuck , 211 bayt

+++++++>++>>-[>>>>+<<++<+<-----]>--->>++++++++++>++<<<<<<[->----[>+++<--]>-->.<.++++++++[->>>>.<<<<]>>>.>--[<]<<]+<[->>----[>+++<--]>-->.<.++++++++[<<[>+>->.<<<-]>[<+>>->>.<<<-]>]>>>.<<<<[-<+>]<[->++<]>[-<+>]<<]

Çevrimiçi deneyin!


1
Bazı farklı döngü kontrolleri ile 197 bayt . xJeneratörün artık döngünün dışına çıkarılabileceğinden eminim
Jo King



1

C #, 168 bayt

()={string R="",o="0",f="f";for(int i=0,j;i<9;i++){R+="0x";if(i>2){o+=o;f+=f;}for(j=0;j<128;){R+=i<1?"5":i<2?"3":o+f;j+=i>1?(int)Math.Pow(2,i-1):1;}R+="\n";}return R;};

1

Stax , 19 bayt

⌡hÅék╝94"ºé♪╛#V┐5í╒

Koş ve hata ayıkla

Ambalajsız, ağzı açılmış ve yorumlanmış gibi görünüyor.

512r        [0..511]
{:Brm       convert each to bits and reverse each
M           transpose matrix, filling missing elements in rectangle with zero
m           map over each element of array, using the rest of the program.  outputs implicitly.
  4/        split bits into groups of 4
  {:b|Hm    convert each 4-bit binary number to single digit hex string
  .0xp      print "0x" without newline

Bunu çalıştır


1

/// , 193 bayt

/*/\/\///X/
0x*F/5555*G/FFFF*T/3333*U/TTTT*o/0f0f*1/oooo*t/00ff*2/tttt*g/0000*h/ffff*4/ghgh*6/gghh*7/gggg*8/hhhh*9/7788/0xGGGGGGGGXUUUUUUUUX11111111X22222222X44444444X66666666X78787878X99X77988

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.