折りたたみ番号


37

与えられた数は、それが折りたたみ数であるかどうかを決定します。

折り畳み式の数値は、バイナリ表現を取り、それを半分に「折り畳む」場合に、数値の前半と後半の数字を逆にしたXNOR乗算の結果を取得する数値です。ゼロ。

数値の2進数の桁数が奇数の場合、その中間桁は1でなければならず、折り畳み時に無視されます。

それは少し混乱するかもしれないので、私はいくつかの例を挙げます:

178

178のバイナリ表現は

10110010

これを折り畳むには、まず半分に分割します

1011 0010

後半を逆にします

1011
0100

そして、2つの半分をXNORします。

0000

これはゼロなので、これは折りたたみ数です。

1644

1644のバイナリ表現は

11001101100

これを折り畳むには、まず半分に分割します

11001 1 01100

中央のビットは1なので、破棄します。

11001 01100

後半を逆にします

11001
00110

そして、2つの半分をXNORします。

00000

これはゼロなので、これは折りたたみ数です。

4254

4254のバイナリ表現は

1000010011110

これを折り畳むには、まず半分に分割します

100001 0 011110

中間ビットは0であるため、これはフォールディング数ではありません。

仕事

あなたの仕事は、正の数を取り、数が折り畳まれている場合は真実を返し、そうでない場合は偽りを返すことです。これはコードゴルフですので、バイト数を減らしてください。

テストケース

以下は、最初の99個の折りたたみ番号です。

[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]

4は折り畳み式の数字ではありませんか?
アドナン

1
@Adnan中間ビットは0ですので、いいえ。(。それは、このようなサードしかし加工した例を持つ価値があるかもしれません)18に対して同じ行く
マーティン・エンダー

@MartinEnderああ、私はその部分を見逃した。ありがとう:)
アドナン

1
なぜ中央の数字は1でなければならないのですか(奇数桁のバイナリ#s)?それはarbitrary意的でしたか、それとも理由がありましたか?
greyShift

3
@timrxdは、反対の数字を加算して数字を折りたたむ場合、数字が中央にある場合、すべて1の文字列を取得します。中央にゼロがある場合、結果はゼロで終わります。
ウィートウィザード

回答:


12

ゼリー、9 バイト

Bœs2µḢ^UȦ

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

Bœs2µḢ^UȦ  Main link. Argument: n

B          Binary; convert n to base 2.
 œs2       Evenly split 2; split the base 2 array into chunks of equal-ish length.
           For an odd amount of digits, the middle digit will form part of the
           first chunk.
    µ      Begin a new, monadic chain. Argument: [A, B] (first and second half)
     Ḣ     Head; remove and yield A.
       U   Upend; reverse the digits in [B].
      ^    Perform vectorized bitwise XOR of the results to both sides.
           If A is longer than B, the last digit will remain untouched.
           n is a folding number iff the result contains only 1's.
        Ȧ  Octave-style all; yield 1 iff the result does not contain a 0.

私はそれを試してみました、まあ:)
ジョナサンアラン

9

05AB1E13 12バイト

コード:

bS2ä`R0¸«s^P

CP-1252エンコードを使用します。オンラインでお試しください!

説明:

まず、を使用して数値をバイナリに変換しbます。164411001101100になります。これを2つに分割します。たとえば、11001101100は次のようになります。

[1, 1, 0, 0, 1, 1]
[0, 1, 1, 0, 0]

不均等なビット数がある場合、最初の部分は余分なビットを受け取ります。R最後の文字列を逆送りし、を使用してゼロを追加します0¸«。この理由は、中間ビットが11 XOR 0 = 1および0 XOR 0 = 0)の場合にのみ、真の結果を提供するためです。中間ビットがない場合、05AB1Eは最後のビット(追加されたゼロ)を無視します。

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0]

最後に行う必要があるのは、要素ごとにXORを実行し、結果の積を取得することです。1つの要素が多すぎる場合、プログラムは最後の要素を除外します([1, 0, 0] XOR [0, 1] = [1, 1])例:

[1, 1, 0, 0, 1, 1]
[0, 0, 1, 1, 0, 0] XOR

になる:

[1, 1, 1, 1, 1, 1]

そして、その積は1であり、これは真実です。


非常に素晴らしい!あまりにも悪いsが必要です。
エミグナ

@Emignaええ、私はそれをしばらく修正する必要があります。これにより、他のコマンドのインスピレーションも得られました:p
Adnan

ああ、私は途中で05AB1Eを初めて試しましたが、これはかなり大変でした。bÐg;ôリフレッシュしてあなたがそれを釘付けにするのを見る前に私が得た限りでした。素晴らしい答え、私が学ぶのを助けます!
魔法のタコUr

@carusocomputingありがとう!05AB1Eに興味のある新しい人たちを見るのはいつでも素晴らしいことです。質問がある場合は、いつでもこのチャットルームで質問できます。
アドナン

やばい!これは別の質問でした!私は「スーパーフォールディング」の質問でした。私もその解決策に答えを広げようとしましたが、反復はさらに困難です。
魔法のタコUr

9

Java 7、152 145 142138 134バイト

boolean f(Long a){byte[]b=a.toString(a,2).getBytes();int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;for(;i<l/2;)z*=b[i]-b[l-++i];return z!=0;}

パリンドロームの場合と同様に文字列をループし、ゼロを探します。繰り返し乗算することで追跡を続けるため、最後にゼロでないことを確認するだけです。

スクロールバーなし:

boolean f(Long a){
    byte[]b=a.toString(a,2).getBytes();
    int i=0,l=b.length,z=l%2<1?1:b[l/2]-48;
    for(;i<l/2;)
        z*=b[i]-b[l-++i];
    return z!=0;
}

しかし、確実にゴルフを打つことができる」あなたの現在の答えがもっとゴルフを打つことができるとは思わないが、間違っていることを証明したい。+1(追記:未使用のパーツには2つの閉じ括弧が含まれています。)
ケビンクルーイッセン

byte[]b=(a+"").getBytes();はより短くchar[]b=a.toString(a,2).toCharArray();、まだ動作しているようです(-12バイト)。
ケビンCruijssen

1
@KevinCruijssenこれはバイナリ文字列のAFAICTではgetBytesありませんが、char []で動作する可能性があると思います。ありがとう:)
Geobits

@KevinCruijssenええ、それを理解し、コメントを削除しました> _ <。
魔法のタコUr

@Geobits:このメソッドは真実または偽の値を返すことができるためz、int(0偽の場合、真実の他の場合)として返すことができます-数バイト節約できます。
shooqie

9

JavaScript(ES6)、61 57 52バイト

再帰的に計算します:

(bit(N) XOR bit(0)) AND (bit(N-1) XOR bit(1)) AND (bit(N-2) XOR bit(2)) etc.

ここNで、入力で設定された最上位ビットのランクです。

入力のビット数が奇数の場合、中間ビットは未定義pop()空の配列で返される値)とXOR され、変更されません。そのため、0中間ビットは出力をクリアし、1中間ビットは他の操作の結果を変更しません。これは、フォールディング数のチャレンジ定義と一致しています。

f=(n,[a,...b]=n.toString(2))=>a?(a^b.pop())&f(n,b):1

// testing integers in [1 .. 99]
for(var i = 1; i < 100; i++) {
  f(i) && console.log(i);
}


いいね!これが中間ビットをどのように考慮に入れるか説明できますか?
ETHproductions

@ETHproductions-もちろん。それについてのメモを追加しました。
アーナルド

9

Python 2、57バイト

s=bin(input())[2:]
while''<s!='1':s[-1]==s[0]<_;s=s[1:-1]

終了コードを介した出力:Falseyの場合はエラー、Truthyの場合はエラーなし。

入力をバイナリに変換します。最初と最後の文字が等しくないかどうかをチェックし、それらの文字を削除した後、これを保持して繰り返します。

s[-1]==s[0]<_最初の文字と最後の文字が等しくない場合、名前の割り当てられていない変数を評価しようとすることにより、比較はエラーになります_。それらが等しい場合、不等式のチェーンは代わりに短絡されます。の真ん中の要素に到達する1と、whileループはOKとして特別な場合に終了します。

私は、純粋に算術的なアプローチはf=lambda n,r=0:...f(n/2,2*r+~n%2)...、反転して反転された端から2進数を切り落とすような再帰で短くなり、中心まで等しいかどうかを検出するnと思われます。ただし、先行ゼロと中央には微妙な点があります。r1


8

Python 2、94 79 72 67バイト

F=lambda s:s in'1'or(s[0]!=s[-1])*F(s[1:-1])
lambda n:F(bin(n)[2:])

@xnorのおかげで12バイト節約

2行目に名前のない関数を定義します。

説明(いくつかの空白が追加されています):

F = lambda s:                                        # We define a function, F, which takes one argument, the string s, which returns the following:
             s in'1'                                 # Gives true if s is '' or s is '1', the first case is a base case and the second is for the middle bit case.
                     or(s[0] != s[-1])               # Or the first and last are different
                                      * F(s[1:-1])   # And check if s, without the first and last element is also foldable.
lambda n: F(bin(n)[:-2])                             # The main function, which calls F with the argument in binary form.

ここで試してみてください!


4
s==''or s=='1'可能性がありますs in'1'
-xnor

ああそう類似した-偉大な心...
ジョナサン・アラン

1
and演算することができます*。また、f無名にすることもできます。
-xnor

6

Haskell、89 88 86バイト

f n|n<2=[n]|1>0=mod n 2:f(div n 2)
g n=elem(product$zipWith(+)(f n)$reverse$f n)[1,2]

ビット表現とその逆をビットごとに合計し、積をとることによって機能します。1または2の場合、数値はフォールディング数です(フォールドする偶数ビットがある場合は1、奇数ビットがある場合は2、中央に1があります)。


5

Python 2、100 99 95 94バイト

これは少し長い感じがしますが、私はそれで働き続けます:) 1数値が折りたたまれるかどうかを印刷し0ます。

a=bin(input())[2:]
b=len(a)
print(a[b/2]>=`b%2`)*all(c!=d for c,d in zip(a[:b/2],a[:~b/2:-1]))

ここでテストしてください!

1バイト保存のWheat Wizardに感謝します:)

5バイトのセーブをしてくれたRodに感謝します!:)


あなたは置き換えることができb-1~b
小麦ウィザード

@WheatWizard素晴らしい、ありがとう!
カーデ

あなたは置き換えることができ[1,a[b]>'0'][len(a)%2](a[b]>=`len(a)%2`)
ロッド

またe=len(a)、変更するために追加してb=e/2 `e%2、1バイトを節約できます。そして、両方のPythonの答えは結び付けられますc:
ロッド

2
@Rod Awesome:D今を除いて、他の答えは私を押しつぶしている;)
ケード



4

Perl、46バイト

+1を含む -p

STDINの番号で実行

folding.pl <<< 178

folding.pl

#!/usr/bin/perl -p
$_=($_=sprintf"%b",$_)<s%.%!/\G1$/^$&^chop%eg

これが機能するのはperlのバグだと思います。内部$_は、変更後、一致位置の更新を取得できません。このプログラムでは、マッチ位置は実際に$_


良いですね。私にできることは59ですperl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/':: /
ダダ

4

Brachylog、16バイト

ḃḍ{↔|h1&b↔}ᵗz₂≠ᵐ

オンラインではまったく機能しません...

入力変数を介して入力を受け取り、成功または失敗を介して出力します。これはz₂4月30日から言語に依存しているに大きく依存していますが、TIOにプルするように依頼するのを忘れていたため、当面は言語のローカルインストールでのみ機能します。いずれにせよ、おそらくあまりにも素朴なアプローチでしょう。

                    The input
ḃ                   's binary representation
 ḍ                  split in half
  {       }ᵗ        with its second half
   ↔|               either reversed, or
     h1             if it starts with 1
       &b           relieved of its first element
         ↔          and then reversed
              ≠     has no duplicate elements
            z  ᵐ    in any pair of elements zipped from the two halves
             ₂      which are equal in length.

Brachylog(TIO上)、19バイト

ḃḍ{↔|h1&b↔}ᵗlᵛ↖Lz≠ᵐ

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

lᵛ↖Lz機能的にはz₂(他の場所で変数Lを使用しない場合)と同等ですが、3バイト長くなります。


3

Python 2、76 71 69バイト

-5(@Dennisのおかげでバイト''中に存在する'1'ので、交換、in('','1')in'1'
-2(使用乗算、@xnorおかげバイト(...)*の代わりにand

f=lambda n:f(bin(n)[2:])if n<''else n in'1'or(n[0]!=n[-1])*f(n[1:-1])

イデオネ

再帰関数は、最初の呼び出し時にn数値であるため、空の文字列より小さいと評価されif n<''、で、関数が再度呼び出されますがn、バイナリ文字列にキャストされます。末尾は空の文字列(偶数ビット長)または中間ビットで、空またはaに対してtrueを返します'1'。途中で、不等式(XORと同等)の外側のビットをテストし、内側のビットで再帰しますn[1:-1]


1
n in'1'うまくいくと思う。
デニス

華麗な、私は''に存在するとは思わないでしょう'blah'が、はい、そうです:)
ジョナサンアラン

1
and演算することができます*
-xnor

3

Python 2、63バイト

s=bin(input())[2:]
while s[0]!=s[-1]:s=s[1:-1]or'1'
print'1'==s

印刷TrueまたはFalses最初と最後の文字のバイナリ表現を取り、それらが等しくない限り繰り返し削除します。残っているのが空の文字列なのか、中央の文字列なのかを確認し1ます。これは、結果がに変換さ'''1'、等しいかどうかを確認することで行われ'1'ます。これにより、空の文字列のインデックスエラーも回避されます。


3

PowerShell v2 +、143バイト

2つの可能なアプローチ、両方とも同じバイト数。

方法1:

param($n)if($n-eq1){$n++}$o=1;0..(($b=($n=[convert]::ToString($n,2)).length-1)/2-!($b%2))|%{$o*=$n[$_]-ne$n[$b-$_]};$o*(+"$($n[$b/2])",1)[$b%2]

入力を受け取り$n、それはだ場合-eqにUAL 1(このアルゴリズムのための特別なケース)、それをインクリメントします。$outputを設定1(つまり、真理を仮定)0してから[convert]、バイナリにedされた入力番号の中間点までループします。-!($b%2)奇数の長さの2進数を考慮してください。

繰り返しごとに、現在の数字$n[$_]をendから同じ長さの数字と比較し$n[$b-$_]、ブール値の結果を乗算します(これらすべてを$o基本的に実行し-andます)。ループが完了したら、中間の2進数を潜在的に考慮する必要があります。これは、最後の疑似3進数です(配列のインデックス付き$b%2)。1か、0パイプライン上に残され、出力が暗黙的です。


方法2:

param($n)for($n=[convert]::ToString($n,2);$n.Length-gt2){if($n[0]-ne$n[-1]){$n=$n[1..($n.Length-2)]}else{0;exit}}($n-join'+'|iex)-eq1-or$n-eq10

入力を受け取り、同じプロセスを[convert]数値からバイナリに実行します。バイナリ文字列のがeater han であるfor限り、ループ状態になります。ループに入っているときに、最初と最後の数字がot qualである場合、それらの2桁を切り取り、に再格納します。それ以外の場合は、およびを出力します。私たちは蚊帳の外だしたら、我々はどちらか持っている(の配列を、、、、または)、または2のためのバイナリ文字列、または3 。したがって、これらの2つの可能性をテストする必要があります。最初に、結果と一緒に評価して、それが.length-gt2$n[0]$n[-1]-ne$n$n0exit11,00,11,10,01011-join $n+1(これは、アレイについても同様である11,00,1されるが、$falseアレイ用0,0及び1,1又は文字列10又は11)。の残りの半分はual (つまり、の入力)-orかどうかをテストしています。そのブール値はパイプラインに残り、出力は暗黙的です。$n-eq102



2

MATL、16バイト

tBn2/kW&\hBZ}P=~

Truthyはすべての配列です。ここで真実/偽の基準を確認してください。

オンラインでお試しください!または、最初の20個のテストケースを確認します。

説明

1644例として入力を使用してみましょう。

t     % Imolicitly take input. Duplicate
      %   STACK: 1644, 1644
Bn    % Number of digits of binary expansion
      %   STACK: 1644, 11
2/k   % Divide by 2 and round down
      %   STACK: 1644, 5
W     % 2 raised to that
      %   STACK: 1644, 32
&\    % Divmod
      %   STACK: 12, 51
h     % Concatenate horizontally
      %   STACK: [12 51]
B     % Binary expansion. Each numnber gives a row, left-padded with zeros if needed
      %   STACK: [0 0 1 1 0 0; 1 1 0 0 1 1]
Z}    % Split into rows
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
P     % Reverse
      %   STACK: [0 0 1 1 0 0], [1 1 0 0 1 1]
=~    % True for entries that have different elements
      %   STACK: [1 1 1 1 1 1]
      % Implicitly display

2

PHP、101バイト

for($r=1;$i<($l=strlen($b=decbin($argv[1])))>>1;)$r*=$b[$i]^1^$b[$l-++$i]^1;$r*=$l%2?$b[$i]:1;echo$r;

またはログ付き

for($r=1,$s=log($n=$argv[1],2)^0;2*$i<$s;)$r*=($n>>$i)%2^($n>>$s-$i++)%2;$s%2?:$r*=($n>>$i)%2;echo$r;

配列付き108バイト

for($r=1,$a=str_split(decbin($argv[1]));$a;)$r*=array_pop($a)!=($a?array_shift($a):0);$r*=$a?$a[0]:1;echo$r;

真の値<10000

1,2,6,10,12,22,28,38,42,52,56,78,90,108,120,142,150,170,178,204,212,232,240,286,310,346,370,412,436,472,496,542,558,598,614,666,682,722,738,796,812,852,868,920,936,976,992,1086,1134,1206,1254,1338,1386,1458,1506,1596,1644,1716,1764,1848,1896,1968,2016,2110,2142,2222,2254,2358,2390,2470,2502,2618,2650,2730,2762,2866,2898,2978,3010,3132,3164,3244,3276,3380,3412,3492,3524,3640,3672,3752,3784,3888,3920,4000,4032,4222,4318,4462,4558,4726,4822,4966,5062,5242,5338,5482,5578,5746,5842,5986,6082,6268,6364,6508,6604,6772,6868,7012,7108,7288,7384,7528,7624,7792,7888,8032,8128,8318,8382,8542,8606,8814,8878,9038,9102,9334,9398,9558,9622,9830,9894

2

ジュリア、66バイト

c(s)=s==""||s=="1"||(s[1]!=s[end]&&c(s[2:end-1]))
f(x)=c(bin(x))

私の最初のゴルフ!同じ長さのPythonソリューションと同じように機能しますが、言語によるわずかな違いがあります(ただし、自分で考え出したのですが...)。

説明:

c(s) = s == "" || # Base case, we compared all the digits from 
                  # both halves.
       s == "1" || # We compared everything but left a 1 in the middle
       (s[1] != s[end] &&  # First digit neq last digit (XNOR gives 0).
        c(s[2:end-1]))     # AND the XNOR condition is satisfied for the  
                           # 2nd to 2nd to last digit substring.
f(x) = c(bin(x))  # Instead of a string f takes an integer now.

2

C、223 201 189 194 178のバイト

i,j,m,l,r;f(n){for(m=j=1,i=n;i/=2;++j);for(l=r=i=0;i<j/2;i++)r|=n&m?1<<j/2-i-1:0,m*=2;i=(j&1&&n&m)?i+1:(j&1)?l=r:i;n>>=i;for(m=1;i<j;i++)l|=n&m,m*=2;return !(~(l^r)&(1<<j/2)-1);}

総当たりアルゴリズム。どれだけゴルフできるか見てみましょう。

より良いテスト設定のバグ修正...

 main()
 {
    int t, s, u, testSet[] = 
    {
    1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120,
    142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370,
    412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738,
    796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206,
    1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848,
    1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470,
    2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132,
    3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752,
    3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558
    };


    for (u=s=0,t=1;t<=4558;t++)
    {
        if (f(t))
        {
          u++;            
          if (testSet[s++]!=t)
              printf("BAD VALUE %d %d\n", testSet[s-1], t);
        }
    }

    printf("%d == %d Success\n", u,
           sizeof(testSet)/sizeof(testSet[0]));

}

2

MATL、13バイト

BttP=<~5Ms2<*

Truthyはすべての配列です。ここで真実/偽の基準を確認してください。

オンラインでお試しください!または、最初の20個のテストケースを確認します。

説明

1644例として入力を使用する:

B     % Implicit input. Convert to binary
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0]
t     % Duplicate
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [1 1 0 0 1 1 0 1 1 0 0]
tP=   % Element-wise compare each entry with that of the reversed array
      %   STACK: [1 1 0 0 1 1 0 1 1 0 0], [0 0 0 0 0 1 0 0 0 0 0]
<~    % True (1) if matching entries are equal or greater
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
5M    % Push array of equality comparisons again
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], [0 0 0 0 0 1 0 0 0 0 0]
s     % Sum of array
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
2<    % True (1) if less than 2
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1], 1
*     % Multiply
      %   STACK: [1 1 1 1 1 1 1 1 1 1 1]
      % Implicitly display

1

JavaScript、71バイト

(i,n=i.toString(2))=>/^(1*)2?\1$/.test(+n+ +n.split``.reverse().join``)

無名関数を定義します。

この方法は最短ではないかもしれませんが、私が知る限り、それはユニークです。バイナリの数値をそれ自体に逆順に追加し、10進数として扱い、正規表現を使用して結果が有効かどうかを確認します。


1

網膜、92バイト

バイトカウントはISO 8859-1エンコードを前提としています。

.+
$*
+`(1+)\1
${1}0
01
1
^((.)*?)1??((?<-2>.)*$.*)
$1¶$3
O$^`.(?=.*¶)

T`01`10`^.*
^(.*)¶\1

オンラインで試す

単項に変換します。それをバイナリに変換します。数字を半分に切り、1もしあれば中間を削除します。前半を逆にします。その1と0を切り替えます。両方が等しい場合に一致します。


1

網膜、71 70 60バイト

.+
$*
+`^(1*)\1(1?)\b
$1 $.2
+`^ (.)(.*) (?!\1).$
$2
^( 1)?$

私はおそらくRetinaについて学ぶべきことがまだたくさんあります(例えば、再帰的な正規表現?)。説明:ステップ1は、10進数から単項に変換します。ステップ2は、単項から擬似バイナリに変換します。ステップ3は、両端が一致しない限り、両端から数字を削除します。ステップ4は、必要に応じて、オプションの最終中央1と一致します。編集:@ mbomb007のおかげで1バイトを保存しました。単項からバイナリへの変換を改善することで10バイトを節約しました。


最初の行は.*または.+です。
mbomb007

1

パイソン2、61の 59バイト

シフトを乗算に変換するために2バイトを保存する

m=n=input()
i=0
while m:i*=2;i+=m&1;m/=2
print(n+i+1)&(n+i)

0折り畳み式の数値と非折り畳み式の何かを返します。ビット調整手法を使用します。


0

C、65 63バイト

シフトを乗算に変換するための2バイト

i,m;
f(n){
 m=n;i=0;
 while(m)i*=2,i+=m&1,m/=2;
 return(n+i+1)&(n+i);
}

空白はすでにバイトカウントから除外されており、折り畳み数の場合は0を返し、非折り畳みの場合はその他を返します。ビット調整手法を使用します。


0

k、77バイト

{X:2 0N#X@&:|\X:0b\:x;c:#:'X;$[(~*X 1)|(=). c;~|/(=).(::;|:)@'(-&/ c)#'X;0b]}

説明として、への翻訳 q

{X:2 0N#X where maxs X:0b vs x;
  c:count each X;
  $[(not first last X)or(=). c;
    not any(=).(::;reverse)@'(neg min c)#'X;0b]
  };
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.