マジックポップカウント数


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 No. ———
Lynn

回答:


3

05AB1E26 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

Pythonの2、52の 49 46バイト

k番目の数値はで与えられ2**512/(2**2**k + 1)ます。これは512ビットの数値用であるため、パターンを異なる幅に拡張するのは簡単です。

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

デニスのおかげで3バイト節約されました。
xnorのおかげで3バイト節約されました。


2
任意精度の整数の利点...
ETHproductions

いいね これにより、数バイト節約できます。
デニス

スクエア化を維持するためのl=2;exec"print'0x%0128x'%(2**512/-~l);l*=l;"*9
短縮

1
Pythonが投票リーダーになっているのを見ると心が温まります。)
トビアスキンツラー

4
@TuukkaXちょっとしたハックの経験がたくさんあります。合計などを単純化するために、Wolfram Alphaを頻繁に使用しました。しかし、基本的に私は、パターンを作った010101010001000100000001、、その後によってそれらを掛け1111111正しいバイナリパターンを取得します。たとえば01010101、特定の幅wの式を取得するには、その式をsum 2^(2*k) for k = 0, w/2 - 1調べて調べ(2**w - 1)/3ます。
orlp 16

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ビットのパターンは何ですか?:D


1
$x<65ではなくを使用してバイトを保存できます$i++<7。今回、私はそれとすべてをテストしました。
user59178 16

6

網膜、43バイト

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

オンラインでお試しください!

説明

これは、:出力全体を作成するよりも1行を変更する方がはるかに短いため、中間結果を印刷できる一般的に使用されないオプションを多く使用します。

:`
0x128$*5

これにより、空の入力が0x128に置き換えられ、5出力されて最初の行が生成されます。

:`5
3

これは、2番目の行を生成するために5sを3sに置き換えて印刷します。

;{:`33
0f

これは最後の特別な場合の行であり、2 3秒ごと0fに3番目の行を生成するように変わります。これにより、最後の2つのステージ({)でループが開始されます。ただし、この段階では、最初の反復の後、現在の状態を出力する以外は何もしません。;最後の行の重複を避けるために、プログラムの最後に出力を抑制します。

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

この置換は、fsと0sの他のすべてのペアを交換することにより、各行を次の行に変換します。「他のすべてのペア」条件は、の前にゼロを一致さfせることによって実施されます。これにより、一致が重複できないため、連続するペアを一致させることができなくなります。


6

Vim、32バイト

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

最初の5とを手動で記述するだけ3で、残りの処理はマクロが行い、実行するたびに「ビットカウントを2倍にします」。マクロのステップの順序は少し奇妙です(新しいf行を作成し、ブロックごとにコピーし、視覚的なブロックサイズを再利用0してf行にs を入れます)が、これは私が見つけた最速のバリアントです。


5

Pyth、26バイト

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

Pythonの回答のポート。


5

J、46 34バイト

私はこれをゴルフに取り組んでいますが、この赤ちゃんは46バイトに留まるのが好きです...もうありません!マイルのおかげで-12バイト!

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

オンラインでお試しください!:D

結果

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

この答えには、ランク0 1u"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
マイル

@miles Huh。私はそれを試したと思った...クール!Jの自動行入力機能を忘れてしまいました。ありがとうございます!
コナーオブライエン

4

実際には、25バイト

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

オンラインでお試しください!

このソリューションf(n) = 2**512//(2**2**n + 1)//は、値を計算するために(ここではフロア分割)という事実を使用しています。

説明:

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バイト

_=>[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

Haskell、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.MonadREPLに読み込まれている必要があります。一定。
アンズ16

3

PowerShell v2 +、68バイト

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

PowerShellは使用せずに任意の精度の整数を持っていません [bigint]、呼び出しがありません。また、16進数に簡単に変換できないため、代わりに文字列ベースのチャレンジとして扱います。

最初の行は繰り返し5を処理し3、文字列の乗算を行うだけで128文字0x先頭に追加します。

次の行はから$a=1までループし7、各反復は別の文字列を出力します。再び、我々はしている0xフロントにタック、我々は適切な数を構築するために途中で文字列の乗算をやっている0し、f一緒に連結し、その後の文字列乗算やってその文字の適切な数にアウト。$aここではループカウンターではなく変数を使用していることに注意してください$_で、適切にスケーリングできることに(そうでない場合1,2,4,8,16,32,64|%{...}は、より長いのようにループする必要があります)。

結果の文字列はパイプラインに残り、暗黙的な出力Write-Outputはプログラムの完了時に発生し、要素間に改行が付きます。


3

V、43バイト

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

オンラインでお試しください!

これは、私がこれまでV回答で必要としてきた最長の圧縮正規表現の1つを使用します。読みやすい正規表現のバイトを追加し、印刷できないエスケープ文字を<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'



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$

@w最後の4 秒は私を悩ませていますが@q、行末で失敗するのを頼りにしているため、@ wも失敗します。32回qを実行して、後の行が台無しになるかどうかを確認してみます。


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


2

brainfuck、211バイト

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

オンラインでお試しください!


1
いくつかの異なるループチェックを通じて197バイトxジェネレーターをループの外側に移動できると確信しています
Jo King



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

スタックス、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.