入力
入力は単一の正の整数です n
出力
出力のn
最上位ビットはに設定されてい0
ます。
テストケース
1 -> 0
2 -> 0
10 -> 2
16 -> 0
100 -> 36
267 -> 11
350 -> 94
500 -> 244
たとえば350
、バイナリでは101011110
です。その最上位ビット(すなわち、左端の設定1
にビットを)0
それが変身001011110
10進数に相当する94
、出力。これはOEIS A053645です。
入力は単一の正の整数です n
出力のn
最上位ビットはに設定されてい0
ます。
1 -> 0
2 -> 0
10 -> 2
16 -> 0
100 -> 36
267 -> 11
350 -> 94
500 -> 244
たとえば350
、バイナリでは101011110
です。その最上位ビット(すなわち、左端の設定1
にビットを)0
それが変身001011110
10進数に相当する94
、出力。これはOEIS A053645です。
回答:
i<=n
てn/i
ために-1バイト。これは私のゴルフではありません。他の誰かがあなたの投稿に編集しようとしましたが、ゴルフの投稿の編集はコミュニティのルールに従って受け入れられないため、ロールバックしました。
.²óo-
整数の最上位ビットを除去し、Nはから距離発見に相当するNの最高整数乗に2よりも低いNを。
したがって、式N-2 floor(log 2 N)を使用しました。
.²
-2を底とする対数。ó
-整数へのフロア。o
- 2以上の結果乗。-
-違い。1
ます!
BḊḄ
BḊḄ Main Link
B Convert to binary
Ḋ Dequeue; remove the first element
Ḅ Convert from binary
Ḅ
とḊ
2バイトのコードポイントは?これにより、全体のサイズが5バイトに変更されます。
main(i){scanf("%d",&i);return i&~(1<<31-__builtin_clz(i));}
このgccの答えは、整数のビット演算と算術演算のみを使用します。ここに対数はありません!0の入力で問題が発生する可能性があり、完全に移植性がありません。
このサイトでの最初の回答ですので、フィードバックと改善をお願いします。確かにビット単位の表現を学ぶのは楽しかったです。
B0T(XB
Cinaskiのおかげで2バイト節約されました。参照インデックスの代わりに割り当てインデックスに切り替えると、2バイト短くなりました。
% Grab input implicitly: 267
B % Convert to binary: [1 0 0 0 0 1 0 1 1]
0T( % Set the first value to 0: [0 0 0 0 0 1 0 1 1]
XB % Convert to decimal: 11
4L
のではなく[2J]
。別の楽しい6バイト:tZlcW-
(MATLABでのみ機能し、TIO / Octaveでは機能しません)
n->n^1<<(int)Math.log2(n)
が機能し、おそらく38バイトよりも短くなります。それがhighestOneBit
適切に機能しなかった場合、それは私の2番目の(まだテストされていない)アイデアでした。好奇心から、あなたの解決策は何だった
n->n^1<<(int)(Math.log(n)/Math.log(2))
理由Math.log2
は、Javaには存在しないからです。; PのみMath.log
、Math.log10
およびMath.loglp
利用可能です。
Math.log2
実は存在しません...私の悪い。見る?ある素敵なメソッド(highestOneBit
)がありますが、別のメソッド()はありませんMath.log2
。Javaは奇妙です;-)
ḋtḋ
説明:
-- implicit input, e.g. 350
ḋ -- convert number to list of binary digits (TNum -> [TNum]): [1,0,1,0,1,1,1,1,0]
t -- remove first element: [0,1,0,1,1,1,1,0]
ḋ -- convert list of binary digits to number ([TNum] -> TNum): 94
lambda n:n-2**len(bin(n))/8
lambda n:n-2**len(bin(n))/8 # Lambda Function: takes `n` as an argument
lambda n: # Declaration of Lambda Function
len(bin(n)) # Number of bits + 2
2** # 2 ** this ^
/8 # Divide by 8 because of the extra characters in the binary representation
n- # Subtract this from the original
2**len(bin(n))/8
スペルも可能1<<len(bin(n))-3
で、2と3の両方で機能します(バイトは保存/追加されません)。
ovsのおかげで2バイト節約
a=>a^1<<Math.log2(a)
a=>'0b'+a.toString`2`.slice`1`^0
.slice`1`^0
するの.slice(1)^0
でしょうか、笑
暗黙のプレフィックス機能。
2⊥1↓2∘⊥⍣¯1
2∘⊥
…base-2からデコード
…… ⍣¯1
負の1回(つまりbase-2でエンコード)
1↓
最初のビットを落とす
2⊥
base-2からデコード
-7バイトはVenteroのおかげです。-historyratのおかげで2バイト。
->n{/./=~'%b'%n;$'.to_i 2}
->n{n.to_s(2)[1..-1].to_i 2}
->n{/./=~'%b'%n;$'.to_i 2}
(ソースと同じ場合は、追加時に宛先レジスタを省略できます)
clz x1,x0
add x1,1
lsl x0,x1
lsr x0,x1
ret
shr
/ shl
/ ret
を理解せず、代わりにlsr
/ lsl
/のようなものを望んでいbx lr
ます。
./-l
o@i
. Duplicate an implicit zero at the bottom of the stack. Does nothing.
/ Switch to Ordinal mode, move SE.
i Read all input as a string.
l Convert to lower case (does nothing, because the input doesn't contain letters).
i Try reading all input again, pushes an empty string.
/ Switch to Cardinal mode, move W.
. Duplicate. Since we're in Cardinal mode, this tries to duplicate an integer.
To get an integer, the empty string is discarded implicitly and the input is
converted to the integer value it represents. Therefore, at the end of this,
we get two copies of the integer value that was input.
l Clear lower bits. This sets all bits except the MSB to zero.
- Subtract. By subtracting the MSB from the input, we set it to zero. We could
also use XOR here.
/ Switch to Ordinal, move NW (and immediately reflect to SW).
o Implicitly convert the result to a string and print it.
/ Switch to Ordinal, move S.
@ Terminate the program.
^2p¢ÊÉ
^2p¢ÊÉ
¢ Get binary form of input
Ê Get length of that
É Subtract 1
2p Raise 2 to the power of that
^ XOR with the input
1
が失敗する可能性がある場合:4バイト¢Ån2
説明:入力バイナリー(¢
)を取得し、最初の文字(Å
)を切り取り、バイナリーとして解析して数値(n2
)に戻します。
{2b()b}
説明:
{ } Block: 267
2b Binary: [1 0 0 0 0 1 0 1 1]
( Pop: [0 0 0 0 1 0 1 1] 1
) Increment: [0 0 0 0 1 0 1 1] 2
b Base convert: 11
MSB(常に1)を再利用して、削除する必要がないようにします。そのトリックなしの同等物は{2b1>2b}
またはになり{2b(;2b}
ます。
^(^1|\1\1)*1
単項の入出力(テストスイートには便宜上、10進数から10進数への変換が含まれています)。
これは単項式で非常に簡単です。必要なのは、入力から最大の2のべき乗を削除することだけです。2のべき乗といくつかの前方参照を一致させることができます。実際には2 n -1の形式の値を照合する方が簡単なので、それを行い、1を個別に照合します。
^(^1|\1\1)*1
グループは、最初に1
1つと一致して1
物事を開始するか、最後の反復で2回一致します。それが一致するように1
、そして2
、その後、4
というように。これらは加算されるため、常に2のべき乗の不足分になります。これは1
最後に修正します。
後続の改行のため、一致は入力から単に削除されます。
function(x)x-2^(log2(x)%/%1)
2 ^ floor(log2(x))
Rで非常に冗長なベース変換を実行するのではなく、最も重要なビットを計算するのが最も簡単です。
n->n-2^logint(n,2)
代替ソリューション:
n->n-2^exponent(n)
n->n-2^logint(n,2)
?2番目のバージョンは、私のバージョンのPARI / GPでも、tio.runで使用されるバージョンでもサポートされていません。それは新しい機能ですか?
exponent
昨日追加されたこのチャレンジと比較して、私がチェックしたばかりの@JeppeStigNielsen が5日前に追加されました。:)
-5
@ IanM_Matrix1のおかげでバイト
=BIN2DEC(MID(DEC2BIN(A1),2,99))
面白くも何とも。
10
明らかに次のようになります0
:D