交互ビットスミアリング


12

前書き

この課題では、整数のバイナリ表現の末尾のゼロをに設定する必要があります010101…。これは例を使用して説明するのが最適です。

整数を指定する400と、最初のステップはそれをバイナリに変換することです:

110010000

ご覧のとおり、5番目のビットは最下位1ビットであるため、そこから開始して下位ゼロを次のように置き換え0101ます。

110010101

最後に、それを10進数に変換します。 405

チャレンジ

正の整数が返されると、上記で定義されたプロセスの対応する結果値が出力されます。

ルール

  • このシーケンスは、少なくとも1 1ビットの整数に対してのみ定義されるため、入力は常に≥1になります
  • 代わりに、入力を文字列、数字のリスト(10進数)として受け取ることができます
  • 無効な入力を処理する必要はありません

テストケース

中間ステップを含むいくつかのテストケースを以下に示します(これらを印刷/返却する必要はありません)。

In -> … -> … -> Out
1 -> 1 -> 1 -> 1
2 -> 10 -> 10 -> 2
3 -> 11 -> 11 -> 3
4 -> 100 -> 101 -> 5
24 -> 11000 -> 11010 -> 26
29 -> 11101 -> 11101 -> 29
32 -> 100000 -> 101010 -> 42
192 -> 11000000 -> 11010101 -> 213
400 -> 110010000 -> 110010101 -> 405
298 -> 100101010 -> 100101010 -> 298

32ビット整数を想定できますか?
アーナルド

@アーナルド:もちろん!
ბიმო

9
ゴルフのアイデア:n入力を分割する最大の2の累乗である場合、答えは単に(input) + ceil((2^n - 2)/3)
ジョンファンミン

回答:


12

Python 3、20バイト

lambda n:(n&-n)//3+n

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

説明

192例として取り上げます。そのバイナリ形式は11000000であり、それをに変換する必要があり11010101ます。

10101番号に追加する必要があることに注意してください。これは幾何級数(4^0 + 4^1 + 4^2)であり、として閉じた形をしてい(4^3-1)/(4-1)ます。これは、整数除算を表す4^3//3where と同じ//です。

である場合101010、それはまだ幾何級数(2×4^0 + 2×4^1 + 2×4^2)であり、2×4^3//3上記の理由によるものです。

とにかく、4^3そして2×4^3ちょうど私達がで取得され、最下位ビットになりますn&-n

の補数はnです00111111。1つ追加すると、になり01000000n=11000000少なくとも最下位の数字とのみ重複します。「補完して追加」は単なる否定であることに注意してください。


6
@ Mr.Xcoderすてきなスポーツマンシップ
リーキー

1
おそらくlambda n:(n&-n)//3+n機能しますか?渡し、すべてのサンプルのテストケースを右、が、私の直感に従って、それが有効ではないでしょうか?
ミスターXcoder

@ Mr.Xcoderそれは確かに有効です。
リーキー修道女

1
Python 2を使用してバイトを保存してみませんか?TIO
FlipTack

4
@FlipTack Iの憎悪のpython 2
漏れ修道女

8

ゼリー、5バイト

&N:3+

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

今回はLeaky Nunのアプローチのポート(少なくとも私は彼が少しそれを下にゴルフを手伝った:P)

ゼリー、7バイト

^N+4:6ạ

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

ジョン・ファン・ミンの素晴らしいアプローチを使用し、マーティン・エンダーの間接的な助けを借ります。


デニスは、編集を行った直後に、非常によく似た5バイトのソリューションを投稿し、削除しました。のようなもの&N:3|。おめでとう; ゼリーでデニスを倒した!(しかし、完全にゴルフではありません。)
wizzwizz4

@ wizzwizz4 Leakyのアプローチに小さなゴルフを提案し、それを移植することを除けば、私は本当に多くのことをしませんでした。しかしええ:-)
Mr. Xcoder

これは、私が見た最初のASCIIのみのゼリーの回答です。
MD XF

6

Wolfram言語(Mathematica)36 28 26 24バイト

@MartinEnderのおかげで-8バイト、@ Mr.Xcoderのおかげで-2バイト

#+⌊(#~BitAnd~-#)/3⌋&

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

入力の末尾のゼロの数を見つけるだけで、0sと1sの長さが1より小さい交互の数を見つけて、それを入力に追加するだけです。

そう、 400 -> 11001000 -> 110010000 + 0000 -> 110010101 + 101 -> 405

sとs nを交互にしたth番号の明示的な式は、OEISのA000975に記載されています。2つの異なる数が2進数で同じ長さで交互の数字を持つことはできないため、th数を使用できます。10n


1
2^#~IntegerExponent~2(BitXor[#,#-1]+1)/2
マーティンエンダー

@MartinEnderすごい!そして私はちょうどバイト以上削減する画分を組み合わせることができます
JungHwan分

1
24バイト#+⌊(#~BitAnd~-#)/3⌋&代わりに使用できます。
ミスターXcoder

@ Mr.Xcoder編集:)
ジョンファンミン

5

J19 18バイト

+(2|-.i.@#.-.)&.#:

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

簡単な説明

これは古い回答ですが、本質的に現在のものと非常に似ており、末尾のゼロを異なる方法でカウントするだけです。どのように機能するかを説明するリンクのコメントを参照してください。

+(2|i.@i.&1@|.)&.#:
                 #:  Convert to binary list
       i.&1@|.       Index of last 1 from right
            |.         Reverse
       i.&1            Index of first 1
    i.               Range [0, index of last 1 from right)
  2|                 That range mod 2
               &.    Convert back to decimal number
+                    Add to the input

その他の回答:

前の回答(19バイト)。

+(2|i.@i.&1@|.)&.#:

\右から左に移動するため、本来より長くなります。

+(2|#*-.#.-.)\&.(|.@#:)

1
18バイト+(2|-.i.@#.-.)&.#:
マイル

@miles mindは、そこでのベースコンバージョンで何が起こっているのかを説明していますか?ゼロと関係があるのではないかと思っていますが、よくわかりません。
コール

#.~ 後続の真理#.~ -. #:の数をカウントするため、後続のゼロの数をカウントする必要があります
マイル

@マイルああ!それは非常に賢いです。
コール

4

これは効率的な方法のように見えますが、演算子の優先順位を説明できますか?例えば、私はそれがあると評価のかどうかわかりません((!n=(n|n))&-n)/3、または!n=(((n|n)&(-n))/3)など、
MD XF

ジュリアでは、ビット演算子は算術演算子と同じ優先順位を持っているため|、like +&likeになり*ます。したがって、n|n&-n÷3はとして解析されn | ((n&-n) ÷3)ます。
デニス

3

JavaScript(ES6)、40 39バイト

入力を32ビット整数として受け取ります。

n=>n|((n&=-n)&(m=0xAAAAAAAA)?m:m/2)&--n

テストケース


2

05AB1E13 8 5バイト

Xcoder氏JungHwan Min のきちんとしたフォーミュラのおかげで5バイト節約Xcoder氏の
おかげでさらに3 バイト節約

(&3÷+

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

説明

(      # negate input
 &     # AND with input
  3÷   # integer divide by 3
    +  # add to input

1
たぶん価値が移植Mathematicaの答えはあなたを与えることを言及8つのバイトを
氏Xcoder

@ Mr.Xcoder:ああ、それはきちんとした式だ。
エミニャ

1
05ab1eにはビット単位のANDがありますか?もしそうなら、(<bitwise and here>3÷+〜5バイトで動作するはずです。
ミスターXcoder

2

R71 58バイト

-6バイトのNofPのおかげ

function(n){n=n%/%(x=2^(0:31))%%2
n[!cumsum(n)]=1:0
n%*%x}

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

入力が32ビット整数であると仮定します。doubleとにかくRには符号付き32ビット整数(整数がオーバーフローしたときのキャスト)のみがあり、64ビットまたは符号なし整数はありません。


toを変換しwhich.max(n):1-165バイトのソリューション!cumsum(n)を取得できます
NofP 19

@NofPありがとう!いい考えだ。
ジュゼッペ

2

brainfuck、120バイト

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

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

現在のセルの値で開始し、出力値のセルで終了します。明らかに255を超える数値では動作しません。これは一般的なBrainfuckのセル制限ですが、無限のセルサイズを想定している場合は動作します。


1

PowerShell、168バイト

param($n)$a=($c=[convert])::ToString($n,2);if(($x=[regex]::Match($a,'0+$').index)-gt0){$c::ToInt32(-join($a[0..($x-1)]+($a[$x..$a.length]|%{(0,1)[$i++%2]})),2)}else{$n}

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

痛い。バイナリスライシングと配列スライシングとの間の変換は、実際にはPowerShellの強みではありません。

入力$nを数値として受け取ります。すぐにconvertそれをバイナリベース2に保存し、に保存し$aます。次に、if / elseコンストラクトがあります。if節は、文字列()の最後のregex Match1に対して0sがより大きい位置(つまり、バイナリ文字列の開始)にあるかどうかをテストします。存在する場合は、何か対処する必要があります。数値を出力するだけです。'0+$'index0else

内でifx最初の最初の数字をスライス+し、残りの数字と配列連結します。ただし、残りの桁については、それらをループして、代わりに選択するために使用して、0または1出力$i++%2を選択します。これ010101...により0、最後にs ではなくパターンが取得されます。次に-join、それを文字列$cに戻し、Int32from baseに逆変換し2ます。

どちらの場合でも、数値はパイプラインに残り、出力は暗黙的です。


1

APL + WIN、43バイト

p←+/^\⌽~n←((⌊1+2⍟n)⍴2)⊤n←⎕⋄2⊥((-p)↓n),p⍴0 1

画面入力のプロンプト









1

JavaScript ES6, 13 bytes

n=>(n&-n)/3|n

f = 
n=>(n&-n)/3|n
;
console.log (f(8));
console.log (f(243));
console.log (f(1048576));
console.log (f(33554432));




0

Jelly, 13 bytes

BŒgṪµ2Ḷṁ×CḄ+³

Try it online!

Explanation

Take 24 as an example input.

BŒgṪµ2Ḷṁ×CḄ+³
B                Binary representation of the input → 11000
 Œg              Group runs of equal length → [[1,1],[0,0,0]]
   Ṫ             Tail → [0,0,0]
    µ            New monadic link
     2Ḷ          [0,1] constant
       ṁ         Mold [0,1] to the shape of [0,0,0] → [0,1,0]
        ×        Multiply [0,1,0] by...
         C       1-[0,0,0]. If last bit(s) of the original input are 1 this will add nothing to the original input
          Ḅ      Convert to decimal from binary → 2
           +³    Add this with the original input → 26
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.