次の1スパース2進数を見つける


27

正の整数Nは、バイナリ表現の2つの連続する1の間に少なくともK 0 がある場合、K疎です。

したがって、1010101の数値は1のスパースですが、101101はそうではありません。

あなたの仕事は、与えられた入力番号の次の1スパース番号を見つけることです。たとえば、入力が12(0b1100)の場合、出力は16(0b10000)であり、入力が18(0b10010)の場合、出力は20(0b10100)です。

最小のプログラムまたは関数(バイト単位)が勝ちます!標準の抜け穴は許可されていません。


「次の最高」または「絶対差が最小」などの「次」
FUZxxl

「次の最高」のように「次」。
-articuno

どの範囲の入力を処理する必要がありますか?
mbomb007

負の数である必要はないと仮定します。
mbomb007

@articuno関数を作成できますか、それとも完全なプログラムである必要がありますか?関数はかなり標準です。
mbomb007

回答:



9

CJam、14 11バイト

DigitalTraumaのおかげで3バイト節約されました。

l~{)___+&}g

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

説明

l~          "Read and eval input.";
  {      }g "Do while...";
   )_       "Increment and duplicate (call this x).";
     __+    "Get two more copies and add them to get x and 2x on the stack.";
        &   "Take their bitwise AND. This is non-zero is as long as x's base-2
             representation contains '11'.";

これにより、プログラムの最後に自動的に印刷されるスタックの最後の番号が残ります。


8

Python 2、44バイト

これは、nを読み取り、答えを出力する完全なPythonプログラムです。読みやすさのサブコンペティションでは非常にうまくいくと思います。

n=input()+1
while'11'in bin(n):n+=1
print n

テスト結果:

$ echo 12 | python soln.py 
16
$ echo 18 | python soln.py 
20

6

Pyth、12 11バイト

f!}`11.BThQ

オンラインそれを試してみてください。Pythコンパイラ/エグゼキュータ

               implicit: Q = input()            
f        hQ    find the first integer T >= Q + 1, 
               that satisfies the condition:
 !}`11.BT         "11" is not in the binary representation of T

1
あなたは回して文字を保存することができます"11"`11
-orlp

@orlpありがとう、これに気付いたはずです。
ジャクベ

5

Mathematica、41 30バイト

MartinBüttnerのおかげで11バイト節約されました。

#+1//.i_/;BitAnd[i,2i]>0:>i+1&

3
説明を追加してください。
mbomb007

4

Perl、31

#!perl -p
sprintf("%b",++$_)=~/11/&&redo

または、コマンドラインから:

 perl -pe'sprintf("%b",++$_)=~/11/&&redo' <<<"18"

4

APL、18バイト

1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2}

これは、単項関数に評価されます。ここで試してみてください。使用法:

   1∘+⍣{~∨/2∧/⍺⊤⍨⍺⍴2} 12
16

説明

1∘+                    ⍝ Increment the input ⍺
   ⍣{            }     ⍝ until
     ~∨/               ⍝ none of
        2∧/            ⍝ the adjacent coordinates contain 1 1 in
           ⍺⊤⍨⍺⍴2      ⍝ the length-⍺ binary representation of ⍺.

4

J、20文字

単項動詞。ルールに従うように修正。

(+1 1+./@E.#:)^:_@>:

説明

まず、これはスペースを含む動詞であり、次に少しゴルフが少なくなっています。

(+ 1 1 +./@E. #:)^:_@>:
[: (] + [: +./ 1 1 E. #:)^:_ >:

読む:

    ]                             The argument
      +                           plus
        [: +./                    the or-reduction of
               1 1 E.             the 1 1 interval membership in
                      #:          the base-2 representation of the argument,
[: (                    )^:_      that to the power limit of
                             >:   the incremented argument

引数に、引数1 1のベース2表現における間隔メンバーシップのOR 縮小、つまり増分された引数に適用される電力制限が適用されます。

1 1入力のbase-2表現で発生するかどうかを基本的に計算します。もしそうなら、入力を増やします。これは電力制限の下に置かれます。つまり、結果が変わらなくなるまで適用されます。


素晴らしいアルゴリズム!APL:と同じ長さです{⍵+∨/2∧/⍵⊤⍨⍵⍴2}⍣=
ズガルブ

@randomraああ、なるほど。
FUZxxl

4

Javascript、25 19

1スパースの2進数の場合x&2*x == 0

f=x=>x++&2*x?f(x):x

3

JavaScript(ES6)、39 43

正規表現なし、文字列なし、再帰的:

R=(n,x=3)=>x%4>2?R(++n,n):x?R(n,x>>1):n

反復バージョン:

F=n=>{for(x=3;x%4>2?x=++n:x>>=1;);return n}

それは非常に単純で、右シフトを使用して11のシーケンスを見つけるだけです。見つけたら、次の番号にスキップします。再帰バージョンは、反復バージョンから直接派生します。

ゴルフをしていない、より明白。ゴルフの最も難しい部分は、内側と外側のループをマージすることです(開始時にxを3に初期化する必要があります)

F = n=>{
  do {
    ++n; // next number
    for(x = n; x != 0; x >>= 1) {
      // loop to find 11 in any position
      if ((x & 3) == 3) { // least 2 bits == 11
        break;
      }
    }
  } while (x != 0) // if 11 was found,early exit from inner loop and x != 0
  return n
}

これ%4>2は数論からの魔術のように見えます、説明してください|| リンクを提供しますか?
ジェイコブ

@Jacob(x%4> 2)は単純に((x&3)== 3)ですが、演算子の優先順位がJSであるため、2つの括弧を避ける
-edc65

思ったよりシンプル。これで、バージョン化されていないバージョンが明確になりました。ありがとう!
ジェイコブ

3

Python 2、37バイト

f=input()+1
while f&2*f:f+=1
print f

x & 2*x == 01スパース数のロジックを使用しました。
@Nickと@CarpetPythonに感謝します。


なぜ下票なのですか?これは完璧に機能し、ゴルフも上手です。
-ETHproductions

PPCGへようこそ、ところで、いい最初の答えです!サイトでの課題に答え続けることをお勧めします:
ETHproductions

2

JavaScript、75 66 62バイト

9バイトを節約してくれたMartinBüttnerと4バイトでPietu1998に感謝します!

function n(a){for(a++;/11/.test(a.toString(2));a++);return a;}

動作方法:現在の数値が1スパースでない限り、forループを開始しますa + 1。1である場合、ループは中断され、現在の数値を返します。数値が1スパースかどうかを確認するには、その数値をバイナリに変換し、が含まれていないかどうかを確認します11

ゴルフされていないコード:

function nextOneSparseNumber(num) {
    for (num++; /11/.test(num.toString(2)); num++);
    return num;
}

2

ジュリア、40バイト

n->(while contains(bin(n+=1),"11")end;n)

これにより、入力として単一の整数を受け入れ、次に高い1スパース整数を返す匿名関数が作成されます。それを呼び出すには、名前を付けて、例えばf=n->...、そしてdoをf(12)

Ungolfed +説明:

function f(n)

    # While the string representation of n+1 in binary contains "11",
    # increment n. Once it doesn't, we've got the answer!

    while contains(bin(n += 1), "11")
    end

    return(n)
end

例:

julia> f(12)
16

julia> f(16)
20

いつものように提案や質問を歓迎します!


2

> <>(魚)、31 + 3 = 34バイト

1+:>:  4%:3(?v~~
;n~^?-1:,2-%2<

使用法:

>python fish.py onesparse.fish -v 12
16

-vフラグ用に3バイトが追加されました。


1

JavaScript(ECMAScript 6)、40

再帰によって:

g=x=>/11/.test((++x).toString(2))?g(x):x

JavaScript、56

矢印関数なしでも同じです。

function f(x){return/11/.test((++x).toString(2))?f(x):x}

1

Scala、65バイト

(n:Int)=>{var m=n+1;while(m.toBinaryString.contains("11"))m+=1;m}

(名前付き関数が必要な場合、ソリューションは69バイトになります)


1

Python、39 33バイト

ここで試してください:http : //repl.it/gpu/2

ラムダ形式(ゴルフのxnorに感謝):

f=lambda x:1+x&x/2and f(x+1)or-~x

標準関数の構文は、ラムダよりも短いことが判明しました!

def f(x):x+=1;return x*(x&x*2<1)or f(x)

ラムダ1を33バイトに短縮できますf=lambda x:1+x&x/2and f(x+1)or-~x。違いは常に0のビットでx/2ある(x+1)/2ため、左ではなく右にビットシフトすると、代わりに使用できることがわかりますx+1。ただし、仕様にはプログラムが必要です。
xnor

私は尋ねました、そして、彼は我々が機能をすることができると言いました。ほとんどの答えはすでにあります。
mbomb007


0

ルビー、44

->(i){loop{i+=1;break if i.to_s(2)!~/11/};i}

かなり基本的です。無限ループとバイナリ表現をテストするための正規表現を持つラムダ。loopインデックス番号が得られることを望みます。


@ mbomb007完了しました。先端をありがとう。
最大

0

Matlab(77 74バイト)

m=input('');for N=m+1:2*m
if ~any(regexp(dec2bin(N),'11'))
break
end
end
N

ノート:

  • これは、試験番号に十分であるm+12*mここで、m入力されます。
  • ~any(x)あるtrue場合にはxすべてゼロが含まれている場合はx空であります

0

C(32バイト)

f(int x){return 2*++x&x?f(x):x;}

他の多くの答えと同じアルゴリズムの再帰的な実装。


0

Perl、16バイト

組み合わせるとx&2*x、様々な答え(と思うからニックのと最初の)nutkiさん redo:利回り

perl -pe'++$_&2*$_&&redo'

Strawberry 5.26でテスト済み。



0

ゼリー、7 バイト

‘&Ḥ¬Ɗ1#

正の整数を出力する単一の非負の整数を受け入れる完全なプログラム(単項リンクとして、単一の正の整数を含むリストを生成します)。

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

どうやって?

で開始しv=n+1、インクリメントし、vすべてのビットを1桁上にシフトし、ビット単位のANDでシフトしvてから、論理NOTを実行して、vそのような番号が見つかるまで1スパースかどうかをテストします。

‘&Ḥ¬Ɗ1# - Main Link: n   e.g. 12
‘       - increment           13
     1# - 1-find (start with that as v and increment until 1 match is found) using:
    Ɗ   -   last three links as a dyad:
  Ḥ     -   double v
 &      -   (v) bit-wise AND (with that)
   ¬    -   logical NOT (0->1 else 1)
        - implicit print (a single item list prints as just the item would)

0

スタックス、5 バイト

╦>ù╤x

実行してデバッグする

この手順を使用して動作します。入力はスタックの先頭から始まります。

  • 増分して2回コピーします。
  • スタックの上部を半分にします。
  • スタックのビット単位および上位2つの要素。
  • 結果が真実(ゼロ以外)の場合、プログラム全体を繰り返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.