매직 팝 카운트 번호


25

32 비트 부호없는 정수 의 세트 비트 수를 계산 하는 유명한 까다로운 알고리즘 이 있습니다 .

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

나는 여기서 설명하지 않을 것이다. 그러나 512 비트 정수에 대해 비슷한 코드를 상상해보십시오! 16 진 상수는 크며 예쁜 패턴을 형성합니다. 당신의 작업은 단순히이 정확한 출력인쇄하는 것입니다 :

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

후행 공백은 없습니다. 단 하나의 후행 줄 바꿈은 선택 사항입니다.

이것은 이므로 가장 짧은 답변 (바이트)이 이깁니다.


우리는 (0x0x0x0x0x0x0x0x0x와 같은) 입력을 할 수 있습니까?
ouflak

@ouflak 번호 ———
Lynn

답변:


3

05AB1E , 26 22 21 바이트

05AB1E는 CP-1252 인코딩을 사용합니다 .

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

온라인으로 사용해보십시오!

설명

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

개선 될 수있는 다른 버전

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

파이썬 2, 52 49 46 바이트

k 번째 숫자는로 주어진다 2**512/(2**2**k + 1). 이것은 512 비트 숫자를위한 것이므로 패턴을 다른 너비로 확장하는 것은 쉽지 않습니다.

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

Dennis 덕분에 3 바이트가 절약되었습니다.
xnor 덕분에 3 바이트가 절약되었습니다.


2
임의 정밀도 정수의 장점 ...
ETHproductions

좋은. 이것은 몇 바이트를 절약합니다.
Dennis

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

1
그것은 :) 투표 리드 파이썬을보고 내 마음을 따뜻하게
토비아스 Kienzler에게

4
@ TuukkaX 비트 트위들 링 해킹에 대한 많은 경험이 있습니다. 나는 Wolfram Alpha를 많이 사용하여 합계 등을 단순화했습니다. 그러나 기본적으로 나는 패턴을 만든 01010101, 00010001, 00000001, 다음으로 그 곱한 1, 11, 1111올바른 바이너리 패턴을 얻을합니다. 예를 들어, 01010101당신은 수행하여 승 일정 폭의 공식을 얻을 수 있습니다 sum 2^(2*k) for k = 0, w/2 - 1및 그것의에서 발견 (2**w - 1)/3.
orlp

7

PHP, 111 (110) 108 바이트

@ user59178 덕분에 1 바이트가 절약되었습니다.

<?=($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 비트 패턴은 무엇입니까? :디


1
당신은 사용하여 바이트를 저장할 수 있습니다 $x<65보다는 $i++<7. 이번에는 그것을 테스트했습니다.
user59178

6

레티 나 , 43 바이트

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

온라인으로 사용해보십시오!

설명

이것은 일반적으로 덜 사용되는 :옵션을 많이 사용 하므로 중간 결과를 인쇄 할 수 있습니다. 전체 출력을 작성하는 것보다 한 줄을 수정하는 것이 훨씬 짧기 때문입니다.

:`
0x128$*5

이것은 빈 입력을 0x뒤에 128 5s 로 바꾸고 그것을 인쇄하여 첫 번째 줄을 생성합니다.

:`5
3

이것은 5s를 3s로 바꾸어 두 번째 줄을 생성하고 인쇄합니다.

;{:`33
0f

이 마지막 특수 맡았다 라인이며 매 2 개 회전 3에들 0f세 번째 줄을 생성 할 수 있습니다. 또한 마지막 두 단계 ( {)를 통해 루프를 시작합니다 . 그러나이 단계는 첫 번째 반복 후에 현재 상태를 인쇄하는 것 외에는 아무 것도 수행하지 않습니다. ;억압 프로그램의 끝에서의 출력은 마지막 행을 중복되지 않도록한다.

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

이 대체는 이제 fs와 0s 의 다른 모든 쌍을 교체하여 각 행을 다음 행으로 변환합니다 . "다른 모든 쌍"조건은의 앞에 0을 일치시켜 적용 f되므로 일치하는 항목이 겹칠 수 없으므로 연속 쌍을 일치시킬 수 없습니다.


6

Vim, 32 바이트

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

난 단지 수동으로 첫째를 작성해야 5하고 3, 그리고 매크로가 실행될 때마다 "비트 수를 두 배로", 나머지는 처리합니다. 매크로의 단계 순서는 약간 이상하지만 (새 f줄을 만들고 , 블록 단위로 복사하고, 시각적 블록 크기를 재사용 0하여 f줄 에 넣습니다 ), 내가 찾은 가장 빠른 변형입니다.


5

Pyth, 26 바이트

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

내 파이썬 답변의 포트.


5

J, 46 34 바이트

나는 이것을 골프로 만들고 있지만이 아기는 46 바이트를 유지하고 싶어한다 . 마일 덕분에 -12 바이트!

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

온라인으로 사용해보십시오! :디

결과

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

이 답을 위해서, 나는 랭크 정의에 0 1사용하기 위해 랭크를 가진 동사가 (이상적으로) 필요 했습니다 u"v. 그러나 마일 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 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│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│_ _ _│
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

여기 당신은 각각의 순위와 동사의 문자열 표현의 무리를 참조하십시오. 이것은 내가 그것을 생성하는 데 사용한 스크립트입니다.


순위 0 _가 있는 동사가 여기에 좋습니다. 당신은 34 바이트로 단축 할 수'0x',"1'5','3','0f'(128$#)"{~2^i.7
마일

@ 마일리지. 나는 그것을 시도 생각 ... 쿨! 그리고 J의 자동 행 채우기 기능을 잊어 버렸습니다. 다시 감사합니다!
Conor O'Brien

4

실제로 , 25 바이트

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

온라인으로 사용해보십시오!

이 용액을 사용한다는 사실 f(n) = 2**512//(2**2**n + 1)( //값 compure 초가 됨 부문이다).

설명:

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

자바 스크립트 (파이어 폭스 30 +), 139 (113) 112 92 83 80 바이트

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

마지막으로 재귀 적 스위트 스폿을 치십시오 .map.

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

.replace 또한 83 바이트입니다.

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

선행 줄 바꿈이 허용 된 경우 80 바이트입니다.

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


3

풍선 껌 , 65 바이트

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                                       .

필수 풍선 껌 답변.


3

하스켈, 84 72 바이트

@orlp의 답변 포팅 :

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

의 힘이없는 94 바이트 대안 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 Control.Monad는 REPL에 로드해야합니다 . 결정된.

3

PowerShell v2 +, 68 바이트

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

PowerShell에는 사용하지 않고 임의의 정밀 정수가 없습니다. [bigint] 호출 16 진수로 쉽게 변환 할 수 없으므로 대신 문자열 기반의 문제로 처리합니다.

첫 번째 줄의 핸들은 반복 53단지에 문자열 곱셈을 수행하여 128문자와를 시침0x 하고 앞면에 를 입력하여 .

다음 행은에서 $a=17반복되며 각 반복은 다른 문자열을 출력합니다. 다시 우리는 한 0x전면에 압정으로 고정, 우리는 적절한 수의를 구성하는 중간에 문자열 곱셈을하고있는 0f함께 연결된 다음의 문자열 곱셈하고 문자의 해당 번호로 아웃. $a여기서는 루프 카운터가 아닌 변수를 사용 $_하므로 올바르게 확장 할 수 있습니다 (그렇지 않으면 루프를 반복해야합니다)1,2,4,8,16,32,64|%{...} 를 더 길게해야합니다).

결과 문자열은 파이프 라인에 남아 있으며, Write-Output프로그램을 완료 할 때 요소 사이에 줄 바꿈이있는 암시 적 출력이 발생합니다.


3

V , 43 바이트

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

온라인으로 사용해보십시오!

이것은 V 답변에 필요한 가장 긴 압축 정규식 중 하나를 사용합니다. 읽을 수있는 정규 표현식에 대한 바이트를 추가하고 인쇄 할 수없는 이스케이프 문자를 다음과 같이 변경하는 더 읽기 쉬운 버전입니다.<esc>

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

설명 (판독 가능 버전 사용) :

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

자바 스크립트 (ES6), 74 72 70 바이트

선택적 후행 줄 바꿈을 포함합니다.

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



2

배치, 216 바이트

@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 바이트

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

TryItOnline!

인쇄 할 수없는 항목 :

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

결국 4 초가 나를 괴롭 히고 있지만 줄 끝에 실패 @w하는 @q데 의존하기 때문에 @w도 실패합니다. q를 32 번 실행하고 나중에 줄을 엉망으로 만드는지 보려고 할 수 있습니다.


2

C, 146 바이트

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

언 골프 드 :

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





1

C #, 168 바이트

()={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 바이트

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

실행 및 디버깅

포장을 풀고 포장을 풀고 주석을 달았습니다.

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

이것을 실행


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.