1が複数回実行される数値


30

仕事

バイナリ表現に1、少なくとも1つで区切られた2つ以上の実行が含まれるように、数値のセットを見つけます0

たとえば、4ビット長の数値の場合:

 0 0000        (no ones)
 1 0001        (only one run)
 2 0010        (only one run)
 3 0011        (only one run)
 4 0100        (only one run)
 5 0101 Valid
 6 0110        (only one run)
 7 0111        (only one run)
 8 1000        (only one run)
 9 1001 Valid
10 1010 Valid
11 1011 Valid
12 1100        (only one run)
13 1101 Valid
14 1110        (only one run)
15 1111        (only one run)

入力

範囲内の何らかの入力を介してアプリケーションに提供される整数3 .. 32。これは、カウントアップする最大ビット数を表します。

の入力はn、数字を調べる必要があることを示します。0 .. 2n-1

出力

基準を満たすすべての番号の区切り(選択)リスト。番号は数字順に表示されます。追加の末尾の区切り文字を使用できます。データ構造のエンクロージャー([]および同様のもの)も使用できます。

Input: 3
Output: 5

Input: 4
Output: 5, 9, 10, 11, 13

Input: 5
Output: 5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29

これは -バイト数が最小の答えが勝ちです。


n = 5で23を逃したと思います。
xnor

@xnorあなたは正しいです。ありがとう、そしてうん、それはまたそれをA094695と同等ではないようにする。うーん oeis.org/A101082oeis.org/A166934

@VTCAKAVSMoACEはい。1がされている場合は\n区切りと入れて\n、最後の行に、その後,で区切られ,すぎて許容されるべきである末尾。更新しました。

1
入力は次のようなリスト形式にできます[1, 2, 3]か?
kirbyfan64sos

@ kirbyfan64sosはい。更新しました。

回答:


7

Pyth、12バイト

f<2r.BT8U^2Q

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

アイディア

正の数のバイナリ表現は常に1秒の実行で始まり、場合によっては、0秒と1秒の交互の実行が続きます。少なくとも3つの別個の実行がある場合、そのうちの2つは1秒の実行であることが保証されます。

コード

              (implicit) Store the evaluated input in Q.
         ^2Q  Calculate 2**Q.
f       U     Filter; for each T in [0, ..., 2**Q-1]:
    .BT         Compute T's binary representation.
   r   8        Perform run-length encoding.
                This returns a list of character/run-length pairs.
 <2             Discard the trailing two pairs.
                This returns a non-empty array if there are more than 2 runs.
              Keep T if the array was truthy (non-empty).

22

Python、48

lambda n:[i for i in range(2**n)if'01'in bin(i)]

私はこれを非常によく考えていました。バイナリ展開にが含まれているかどうかを確認するだけです'01'

1つの実行が2つあるためには、右側の実行の前にが必要0です。実行が1つだけの場合、先頭に0「」はないため、それは起こりません。


古い答え:

lambda n:[i for i in range(2**n)if len(set(bin(i).split('0')))>2]

Pythonバイナリ表現はここで非常にうまく機能します。2進数はのように記述されbin(9)=='0b10110'ます。'0'結果のリストの分割

  • イニシャルの左側、0連続する2つの間0、および最終の右側の空の文字列0
  • b1つ以上の先行する文字が続く文字
  • 1先行していないの実行

最初の2つのカテゴリが常に存在するが、実行がある場合、最後の1にのみ存在する1「大手が含まれていないS '1'、及びその複数の実行があります場合にのみ1さんは。そのため、リストに2個別の要素以上が含まれているかどうかを確認するだけで十分です。

Python 3.5は{*_}、の代わりに展開することで2文字を節約しset(_)ます。


/01/代わりに使用するアイデアをありがとう/10+1/Perlでそれを利用しました
msh210

13

ルビー、44 40 38文字

取り消し線44はまだ規則的44です;(

->n{(0..2**n).select{|x|/01/=~'%b'%x}}

整数を受け取り、配列を返す匿名関数(実際にはproc)。

正規表現を使用し/10+1/ます:a 1、少なくとも1つ0、次に別1@histocrat 01は、文字列のどこかにある場合、その前にどこかにある必要がある1ことを指摘します。


1
ここでは、フォーマット文字列の使用が少し短くなります/10+1/=~'%b'%x。また、複数回実行されることはない0..2**nため、包括的range()を使用して文字を保存できます2**n
-histocrat

@histocratええと、文字列と正規表現の順序をで反転できるとは思いませんでした=~。ありがとう!
ドアノブ

1
待ってください、実際には正規表現/01/も同様に機能します。がある場合01、どこかに左に1がなければなりません。
-histocrat

@histocratああ、それは賢い!それは2文字を節約します。
ドアノブ

7

ジュリア、43 41バイト

n->filter(i->ismatch(r"01",bin(i)),1:2^n)

これにより、整数を受け入れて配列を返す名前のない関数が作成されます。これは、Histocratsの正規表現トリック(Doorknobの答えで使用)を使用し01ます。この場合、先行する1がある場合にのみ一致します。

ゴルフをしていない:

function f(n::Int)
    # Take the integers from 1 to 2^n and filter them down to
    # only those such that the binary representation of the integer
    # matches the regex /01/.
    filter(i -> ismatch(r"01", bin(i)), 1:2^n)
end

私ではなく、組織のトリック。:)
ドアノブ

@Doorknobああ、今、あなたは両方の信用を得ます。:)
アレックスA.

6

Matlab、79 68 64 59

この考え方は、2進数を0と1の配列として解釈し、隣同士の各ペア間の絶対差を計算することです。1回の差が2回以上ある場合、明らかに2回以上の差があります。これは、先行ゼロなしで2進数を表す場合にのみ機能することに注意してください。

@(n)find(arrayfun(@(k)sum(~~diff(dec2bin(k)+0))>1,1:2^n-1))

古いバージョン:

k=1:2^input('')-1;k(arrayfun(@(k)sum(~~diff(dec2bin(k)+0))>1,k))

for k=1:2^input('')-1;if sum(~~diff(dec2bin(k)+0))>1;disp(k);end;end

for k=1:2^input('')-1;if sum(~~conv(dec2bin(k)+0,[-1,1],'v'))>1;disp(k);end;end

6

JavaScript(ES7)、89 85 72 69 62バイト

聖なる牛、JSで範囲を作成するのは簡単ではありません。おそらく、実際のforループでは短くなります。いいえ、嘘をつきました。実際には少し長いです。しかたがない。27バイトの節約で解決する必要があると思います。(7 Mwr247に感謝!)

x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]

Firefoxの最新バージョンでは正常に動作しますが、おそらく他のブラウザーでは動作しません。やってみて:

<!--                               Try the test suite below!                              --><strong id="bytecount" style="display:inline; font-size:32px; font-family:Helvetica"></strong><strong id="bytediff" style="display:inline; margin-left:10px; font-size:32px; font-family:Helvetica; color:lightgray"></strong><br><br><pre style="margin:0">Code:</pre><textarea id="textbox" style="margin-top:5px; margin-bottom:5px"></textarea><br><pre style="margin:0">Input:</pre><textarea id="inputbox" style="margin-top:5px; margin-bottom:5px">5</textarea><br><button id="testbtn">Test!</button><button id="resetbtn">Reset</button><br><p><strong id="origheader" style="font-family:Helvetica; display:none">Original Code Output:</strong><p><div id="origoutput" style="margin-left:15px"></div><p><strong id="newheader" style="font-family:Helvetica; display:none">New Code Output:</strong><p><div id="newoutput" style="margin-left:15px"></div><script type="text/javascript" id="golfsnippet">var bytecount=document.getElementById("bytecount");var bytediff=document.getElementById("bytediff");var textbox=document.getElementById("textbox");var inputbox=document.getElementById("inputbox");var testbtn=document.getElementById("testbtn");var resetbtn=document.getElementById("resetbtn");var origheader=document.getElementById("origheader");var newheader=document.getElementById("newheader");var origoutput=document.getElementById("origoutput");var newoutput=document.getElementById("newoutput");textbox.style.width=inputbox.style.width=window.innerWidth-50+"px";var _originalCode="x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]";function getOriginalCode(){if(_originalCode!=null)return _originalCode;var allScripts=document.getElementsByTagName("script");for(var i=0;i<allScripts.length;i++){var script=allScripts[i];if(script.id!="golfsnippet"){originalCode=script.textContent.trim();return originalCode}}}function getNewCode(){return textbox.value.trim()}function getInput(){try{var inputText=inputbox.value.trim();var input=eval("["+inputText+"]");return input}catch(e){return null}}function setTextbox(s){textbox.value=s;onTextboxChange()}function setOutput(output,s){output.innerHTML=s}function addOutput(output,data){output.innerHTML+='<pre style="background-color:'+(data.type=="err"?"lightcoral":"lightgray")+'">'+escape(data.content)+"</pre>"}function getByteCount(s){return(new Blob([s],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"})).size}function onTextboxChange(){var newLength=getByteCount(getNewCode());var oldLength=getByteCount(getOriginalCode());bytecount.innerHTML=newLength+" bytes";var diff=newLength-oldLength;if(diff>0){bytediff.innerHTML="(+"+diff+")";bytediff.style.color="lightcoral"}else if(diff<0){bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgreen"}else{bytediff.innerHTML="("+diff+")";bytediff.style.color="lightgray"}}function onTestBtn(evt){origheader.style.display="inline";newheader.style.display="inline";setOutput(newoutput,"");setOutput(origoutput,"");var input=getInput();if(input===null){addOutput(origoutput,{type:"err",content:"Input is malformed. Using no input."});addOutput(newoutput,{type:"err",content:"Input is malformed. Using no input."});input=[]}doInterpret(getNewCode(),input,function(data){addOutput(newoutput,data)});doInterpret(getOriginalCode(),input,function(data){addOutput(origoutput,data)});evt.stopPropagation();return false}function onResetBtn(evt){setTextbox(getOriginalCode());origheader.style.display="none";newheader.style.display="none";setOutput(origoutput,"");setOutput(newoutput,"")}function escape(s){return s.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}window.alert=function(){};window.prompt=function(){};function doInterpret(code,input,cb){var workerCode=interpret.toString()+";function stdout(s){ self.postMessage( {'type': 'out', 'content': s} ); }"+" function stderr(s){ self.postMessage( {'type': 'err', 'content': s} ); }"+" function kill(){ self.close(); }"+" self.addEventListener('message', function(msg){ interpret(msg.data.code, msg.data.input); });";var interpreter=new Worker(URL.createObjectURL(new Blob([workerCode])));interpreter.addEventListener("message",function(msg){cb(msg.data)});interpreter.postMessage({"code":code,"input":input});setTimeout(function(){interpreter.terminate()},1E4)}setTimeout(function(){getOriginalCode();textbox.addEventListener("input",onTextboxChange);testbtn.addEventListener("click",onTestBtn);resetbtn.addEventListener("click",onResetBtn);setTextbox(getOriginalCode())},100);function interpret(code,input){window={};alert=function(s){stdout(s)};window.alert=alert;console.log=alert;prompt=function(s){if(input.length<1)stderr("not enough input");else{var nextInput=input[0];input=input.slice(1);return nextInput.toString()}};window.prompt=prompt;(function(){try{var evalResult=eval(code);if(typeof evalResult=="function"){var callResult=evalResult.apply(this,input);if(typeof callResult!="undefined")stdout(callResult)}}catch(e){stderr(e.message)}})()};</script>

このページから抜粋したスニペット)

提案を歓迎します!


あなたは使用することができる.keys()代わりに、.fill()aの代わりに、i62のための鉱山を結ぶために:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Mwr247

@ Mwr247ありがとう!62歳未満でも可能だろうか... :)
ETHproductions

6

Haskell、68 61 53バイト

ダミアンからの改善

g x|x`mod`4==1=x>4|2>1=g$x`div`2
a x=filter g[1..2^x]

歴史:

これにより、バグが修正されます(==と=の切り替え、および2の累乗ではなく正方形)。trueを2> 1に、falseを1> 2に置き換えます。また、2 ^ xは常に失敗することを指摘してくれてありがとう。トーマス・クワとニミに感謝

g x|x<5=1>2|x`mod`4==1=2>1|2>1=g$x`div`2
a x=filter g[1..2^x]

元々

g x|x<5=False|x`mod`4=1==True|2>1=g$x`div`2
a x=filter g[1..(x^2-1)]

完全なプログラムである必要がある場合、

g x|x<5=False|x`mod`4==1=True|2>1=g$x`div`2
main=interact$show.a
a x=filter g[1..2^(read x)]

1
OPは名前付き関数またはプログラムの作成を指定しなかったため、ラムダは問題ありません。ところで、PPCGへようこそ!
リスト管理者

1
2 ^ xが常に失敗するので、1..(2^x-1)どちらが正しいかを意味すると思います1.. (2^x)
リルトシアスト

あなたは、定数を置き換えることができるFalseTrueして1>21<2。括弧は必要ありません2^x-1。(ところで:誤字があります:する必要があります4==1=True)。
nimi

入力ミスを修正していただきありがとうございます。私の時間は深夜でした。
アカンカ

gをgx | x mod4 == 1 = x> 4 | 2> 1 = g $ x div2に減らすことができると思います
ダミアン

5

APL、34 27バイト

{0~⍨{⍵×2<+/2≢/⍵⊤⍨⍵/2}¨⍳2*⍵}

これにより、右側の整数を受け入れて配列を返す名前のないモナド関数が作成されます。

説明:

                     }¨⍳2*⍵}  ⍝ For each integer from 1 to 2^input...
              ⍵⊤⍨⍵/2         ⍝ Get the binary representation as a vector
           2≢/                ⍝ Pairwise non-match, yielding a boolean vector
       2<+/                   ⍝ Check whether the number of trues is >2
     ⍵×                       ⍝ Yield the integer if so, otherwise 0
{0~⍨{                         ⍝ Remove the zeros from the resulting array

デニスのおかげで7バイト節約できました!


4

R、55 47バイト

(@ Alex.Aの助けを借りて)

cat(grep("10+1",R.utils::intToBin(1:2^scan())))

Rには、変換された数値を便利な方法で表示するための組み込み関数がないため、これに使用R.utils::intToBinしていますが、残りはすべて、一致した正規表現の場所を報告し、aで区切ってSTDOUTに出力しますスペース。


のデフォルトの区切り文字catはスペースだと思うので,sep=","、完全に省略して7バイト節約できます。
アレックスA.

@AlexA。ええ、だからここで9月としてスペースを使用できますか?確信がありませんでした
デビッドArenburg

1
OPがあなたの選択の区切り文字を言ったので、スペースは十分合理的だと思います。:)
アレックスA.

これには本当にcat関数が必要ですか?それなしでは、出力はタブ区切りになります。左側のカウンターはUIの一部です。ファイルに書き込む場合、これは含まれないため、出力の一部ではありません。
freekvd

@freekvdがないと、STDOUTに出力されません。このサイトの愚かなルールについての何か。
デビッドアレンバーグ

4

CJam、14

2qi#{2b2,#)},p

Dennisのおかげで3バイト短くなりました。オンラインで試す


どうでしょう2be`,2>
jimmy23013

2
2be`2>そして、2,#)うまくとして動作するはずです。また、OPは出力をリスト形式で印刷できることを明確にしました。
デニス

4

JavaScript(ES6)、69 68 67 62バイト

a=>[...Array(1<<a).keys()].filter(i=>/01/.test(i.toString(2)))

今日、塗りつぶしやマップを使用せずに配列を動的に塗りつぶす新しい短い方法を発見しました。実行x=>[...Array(x).keys()]すると、0〜xの範囲の配列が返されます。独自の範囲/値を定義する場合は、を使用してくださいx=>[...Array(x)].map((a,i)=>i)。数バイト長くなります。


4

Java、214 165 155 154 148 141 110バイト

このサブミッションは、Javaの数値のバイナリ文字列表現の先頭にゼロがないという事実を利用しています。文字列「01」が数字のバイナリ表現に現れる場合、それは数字「2」の2番目の出現をマークする必要があります。

ゴルフ:

String f(int l){String r="";for(long i=5;i<1L<<l;++i)if(Long.toString(i,2).contains("01"))r+=i+", ";return r;}

ゴルフをしていない:

public class NumbersWithMultipleRunsOfOnes {

  public static void main(String[] a) {
    // @formatter:off
    String[][] testData = new String[][] {
      { "3", "5" },
      { "4", "5, 9, 10, 11, 13" },
      { "5", "5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29" }
    };
    // @formatter:on

    for (String[] data : testData) {
      System.out.println("Input: " + data[0]);
      System.out.println("Expected: " + data[1]);
      System.out.print("Actual:   ");
      System.out.println(new NumbersWithMultipleRunsOfOnes().f(Integer.parseInt(data[0])));
      System.out.println();
    }
  }

  // Begin golf
  String f(int l) {
    String r = "";
    for (long i = 5; i < 1L << l; ++i)
      if (Long.toString(i, 2).contains("01")) r += i + ", ";
    return r;
  }
  // End golf
}

プログラム出力(末尾の区切り文字も使用できることに注意してください):

Input: 3
Expected: 5
Actual:   5, 

Input: 4
Expected: 5, 9, 10, 11, 13
Actual:   5, 9, 10, 11, 13, 

Input: 5
Expected: 5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29
Actual:   5, 9, 10, 11, 13, 17, 18, 19, 20, 21, 22, 23, 25, 26, 27, 29, 

intカウンター変数に使用しませんか?
flawr

Javaのすべての整数型は符号なしです。32ビットの正の整数を使用するには、64ビットlongが必要です。さらに、を使用するintと、数値解析を行うラッパークラスを参照するため、実際にコードのサイズが大きくなりIntegerます。スペースを節約する可能性のある場所は正規表現だと思いますが、私のテストでは、先頭と末尾が必要であることが示さ.*

ああ、しかし、私はあなたがでLongラッパーを使用できると思ったint?(まあ、この場合ではありませんが、一般的に?)
flawr

はい、でパラメータとして使用するintとに昇格しlongますLong。この場合int、符号ビットのために実際に使用する方法Integerはなく、より長いですLong。それでも、Javaのように冗長な言語から余分なスペースを絞り出す方法をいくつか見つけました。

new Long()代わりに使用できますLong.parseLong()か?
Ypnypn

4

C(gcc)111 99バイト

long i,x;main(a,b)char**b;{for(;++i<1L<<atol(b[1]);x>>ffsl(~x)-1&&printf("%ld,",i))x=i>>ffsl(i)-1;}

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

@ceilingcatのおかげで12バイト削られました!

ゴルフをしていない:

int main(int a, char **b) {
  for(long i = 0, x = 0; ++i < (1LL << atol(b[1])); ) {
    x = i >> (ffsl(i) - 1);
    if (x >> (ffsl(~x) - 1))
      printf("%ld,", i);
  }
}

関数ffsl()は、長整数に設定された最初のビットのインデックスを提供します。i = 1から2 ^ number_of_bitsまでループします。最下位の連続するすべてのゼロビットを削除するまで、右シフトに設定xiます。次に、x最も重要でない最後の連続する1ビットをすべて削除するまで右にシフトします。結果がまだゼロ以外の場合、一致が見つかりました。


2
誰かが「文字列と正規表現に変換する」というアプローチではなく、ちょっとした操作の答えをしたことが本当に好きだと言わざるを得ません。

@MichaelT原始的なビット演算のみを使用した短い解決策があるのだろうか。
リトシアスト

@ThomasKwaそれはコードチャレンジとしてやるべきことかもしれません。

面白い。また、次のようにテストを記述して、if (popcount(i ^ (i*2))>3)popcount()を一連のビット単位ANDおよびシフト操作に展開することもできます。しかし、それは非常に長いコードになります。
G. Sliepen

1
@ThomasKwa y = x |(x-1)は、すべての右端の0ビットをオンにします。次に、z = y&(y + 1)を使用して、後続の1ビットをすべてオフにします。zがゼロ以外の場合、元の数値は複数回実行されました。
アルキミスト

3

JavaScript(ES6)76

f=n=>Array(1<<n).fill().map((_,x)=>/01/.test(x.toString(2))?x+',':'').join``

//TEST
for(i=1;i<16;i++)O.innerHTML+=i+' -> '+f(i)+'\n'
<pre id=O></pre>


ノー@DLosc、結果は次のようなものになるだろう,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
edc65

3

K5、19バイト

これは、デニスのソリューションと同様の原則に沿って動作しますが、利用するビルトインが少なくなります。

{&2<+/'~0=':'+!x#2}

最初に、一連のバイナリxタプル(+!x#2)を生成し、次に、この目的のためにリストの-1番目の要素を0として扱う場合、各タプルについて、数字が前と一致しないすべてのポイントを見つけます(~0=':')。私たちのソリューションは、2が各実行カウントの合計より少ない場合です。(&2<+/')。

各中間ステップをより明確に表示します。

  4#2
2 2 2 2

  !4#2
(0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1)

  +!4#2
(0 0 0 0
 0 0 0 1
 0 0 1 0
 0 0 1 1
 0 1 0 0
 0 1 0 1
 0 1 1 0
 0 1 1 1
 1 0 0 0
 1 0 0 1
 1 0 1 0
 1 0 1 1
 1 1 0 0
 1 1 0 1
 1 1 1 0
 1 1 1 1)

  ~0=':'+!4#2
(0 0 0 0
 0 0 0 1
 0 0 1 1
 0 0 1 0
 0 1 1 0
 0 1 1 1
 0 1 0 1
 0 1 0 0
 1 1 0 0
 1 1 0 1
 1 1 1 1
 1 1 1 0
 1 0 1 0
 1 0 1 1
 1 0 0 1
 1 0 0 0)

  +/'~0=':'+!4#2
0 1 2 1 2 3 2 1 2 3 4 3 2 3 2 1

  2<+/'~0=':'+!4#2
0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0

  &2<+/'~0=':'+!4#2
5 9 10 11 13

そしてすべて一緒に:

  {&2<+/'~0=':'+!x#2}'3 4 5 
(,5
 5 9 10 11 13
 5 9 10 11 13 17 18 19 20 21 22 23 25 26 27 29)

2

ピップ、13 + 1 = 14バイト

コマンドラインから入力を受け取り、-s出力番号間のスペースにフラグを使用します。

01NTB_FI,2**a

かなり簡単です:でビルドrange(2**a)してフィルタリングしlambda _: "01" in toBinary(_)ます。私は01アイデアを独立して考え出すことにかなり満足していました。01数値リテラルとしてスキャンするため、引用符は必要ありません(数値と文字列はPipでは同じ型です)。


2

ジュリア、40バイト

n->filter(i->count_ones(i$i>>1)>2,1:2^n)

これは、他のJuliaソリューションとは多少異なるアプローチを使用します。ビット文字列で「01」を文字列検索するのではなく、数学を使用して、数値が条件を満たしているかどうかを判断します。

i$i>>1桁が0から1、または1から0に変わる場所にのみ1があります。そのためi、0回と1回の間を十分に切り替えるには、少なくとも3つが必要です。count_ones1の数を見つけて、filter十分な数がないものを削除します。


2

C ++、197 188 141バイト

注:これが書かれており、その表示されますMSVC ++ 2013を使用して試験した#includeINGは<iostream>この仕事をするために必要なCヘッダのすべてを含んでいます。また、コードは実際にはC ++ではないように見えますが、C ++を使用してコンパイルすると、より多くのCヘッダーを含めることに比べてコードサイズを削減するヘッダートリックが可能になります。

printf代わりにを使用するとcout、数バイトも節約できます。

ゴルフ:

#include<iostream>
int main(int a,char**b){char c[34];for(long i=5;i<1L<<atol(b[1]);++i){_ltoa(i,c,2);if(strstr(c,"01"))printf("%ld\n",i);}}

ゴルフをしていない:

#include <iostream>
int main(int a, char **b) {
  char c[34];
  for (long i = 5; i < 1L << atol(b[1]); ++i) {
    _ltoa(i, c, 2);
    if (strstr(c, "01"))
      printf("%ld\n", i);
  }
}

Yoiuは'\n'、std :: endlの代わりに(一般的に)使用できます。または','、任意のセパレーターが有効で、末尾のセパレーターが適切であるためです。
G.スリーペン

正規表現の代わりに、でそれを行うことができますstrstr(c,"01")
G.スリーペン

@ G.Sliepenありがとう!正直なところ、JavaソリューションをコピーしてC ++に変換しただけですが、多くの場合、シンプルなソリューションが最適です。おそらく今はJavaで同様のことをすべきでしょう。

2つの小さなエラー:1<<atol(b[1])be 1L<<atol(b[1])である必要があります。そうでない場合、その式の結果は符号付き32ビット整数になります。つまり、コードは最大2 ^ 30までしか実行されません。printfは%ld、2 ^ 31〜2 ^ 32の数字を正しく印刷するために使用する必要があります。
G.スリーペン

2

Perl 5の、55の 53 49 47 41バイト

sprintf("%b",$_)=~/01/&&say for 0..2**<>

54 52 48 46 40バイトに加えて、-Eフラグの代わりに1つ-e


の代わりに2バイトを節約するヒントについてxnorに感謝します。/01//10+1/

6バイトを節約したの代わりに使用するアドバイスをくれたDennisに感謝します。<>$ARGV[0]


2

C、84 81バイト

long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}

これは、単純なビット演算子を使用する可能性に関するこの質問に対する別のCの回答についてのコメントに基づいています。ステートメントi |(i-1)の末尾の0ビットをすべて1に切り替えることで機能します。次に、k&(k + 1)を使用して、後続の1ビットをすべて0に切り替えます。1の実行が1つしかない場合はゼロになり、それ以外の場合はゼロ以外になります。longは64ビットであると仮定しますが、代わりにint64_tを使用することで3バイトを犠牲にしてこれを修正できます。

非ゴルフ

long i,j,k;
main()
{
    for(scanf("%ld",&j);++i<1L<<j;)
    {
        k=i|(i-1);
        if((k&(k+1)) == 0)
            printf("%d ",i);
    }
}

int64_tあなたの場合にのみ定義されます#include<stdint.h>。64ビット動作を保証するにlong longは、5バイトのコストでタイプが必要です。
chqrlie

あなたが渡して未定義の振る舞いを呼び出すことを注意long iするために%dフォーマットを。また()&および|演算子には不要であることに注意してください。これを修正すると、3バイト節約できます! long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
chqrlie

@chqrlieすべての非常に良い点。ありがとうございました。
アルキミスト


1

Python 2.7、89バイト

print[i for i in range(1,2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]

これは少しゴルフができると思う。


@ mbomb007私はそれを試しましたが、うまくいきませんでした。
-Loovjo

@ mbomb007 Python 2.7を使用していますか?
-Loovjo

2.7のどのバージョンが重要ですか?repl.it(2.7.2)で実行すると動作しませんが、Ideone(2.7.10)は動作します。ただし、repl.itのバグであり、必ずしもバージョンの違いではありません。
mbomb007

プログラム0が出力に誤って印刷されます。
mbomb007

またprint[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]、2バイト短くなります。ただし、0を使用すると、の長さは同じ(89)になりますrange(1,2**input())
mbomb007

1

TI-BASIC、34 32 30バイト

TI-83 + / 84 +シリーズの計算機用。

For(X,5,e^(Ans
If log(sum(2=int(4fPart(X/2^randIntNoRep(1,Ans
Disp X
End

数値に1の2つの実行を含める10には、末尾のゼロをバイナリ表現に追加するときに2を含める必要があります。

バイナリ表現を生成してaをチェックするのではなく、10剰余4(int(4fPart()を使用して数学的にビットのペアをテスト210ます。私たちが順番を気にしないので、randIntNoRep(ある最短指数のリストを生成する方法。

log(実行回数を確認するために使用します。

  • 少なくとも2回の実行がある場合、これlog(は正であり、数値が表示されます。

  • 一度の実行がある場合、log(0である、と番号が表示されません。

  • 実行がない場合(最初にX = 2 ^ Ansで発生します)、log(ERR:DOMAINをスローし、正確なポイントで出力を停止します。

私たちは、使用e^(Ansの終了引数としてFor(ループそれは常によりも大きいのです2^Ansが、e^(それは1バイト短いですので、単一のトークンです。

N = 4の入力/出力:

4:prgmRUNSONES
               5
               9
              10
              11
              13

次に、計算機はエラーをスローします。エラー画面は次のようになります。

ERR:DOMAIN
1:Quit
2:Goto

1を押すと、ホーム画面が再び表示されます。

4:prgmRUNSONES
               5
               9
              10
              11
              13
           Error

TI計算機は、整数またはバイナリの浮動小数点数ではなく、14桁の精度ですべての数値をBCD浮動小数点数に格納します。したがって、2のべき乗による除算は2^14正確ではない場合があります。最も扱いにくい数値である3*2^30-1および2^32-1が正しく処理されることを確認しましたが、丸め誤差の可能性を排除していません。ただし、入力にエラーがあった場合は驚かされます。


32バイトをどのようにカウントしますか?私には70のように見えます(改行を含む)。
msh210

TI-BASICはトークン化されています。これらのコマンドはすべて1バイトで、他のコマンドは2バイトである独自の文字エンコードを使用します。このエンコーディングでスコアを付けることはコミュニティのコンセンサスです。詳細については、meta.codegolf.stackexchange.com / a / 4764/39328を参照してください。
リルトシアスト

かっこいい、イケてる。ありがとう。
msh210

1
  • これはflawrの答えに勝るものではありませんが、私は質問の魅力に抵抗できませんでした

matlab(90)(70)

j=input('');for l=2:j-1,a=1;for k=l:-1:2,a=a+2^k;a:a+2^(k-1)-2,end,end

実行

4

ans =

5

ans =

9    10    11

ans =

13

原理

  • 一連の数値は、結果の1のストリップの結果であり、f(n、l)= 2 ^ l + 2 ^(l + 1)+ .... 2 ^ nを意味します

間隔] f(n、l)、f(n、l)+ 2 ^(l-1)[から取られた任意の数。ここでl> 1はこの条件を検証するため、結果はこのシリーズの否定の結果です。 nの項。

x = 1

x = x + 1 =01

x = x + 2 ^ 0 =11

x = x + 1 =001

x = x + 2 ^ 1 =011

x = x + 2 ^ 0 =111

x = x + 1 =0001

x = x + 2 ^ 2 =0011

x = x + 2 ^ 1 =0111

x = x + 2 ^ 0 =0111

x = x + 1 =1111 ...

x + 1、x = x + 2 ^ n、x = x + 2 ^(n-1)... x = x + 2 ^ 0

私のプログラムは、2行ごとの範囲を出力します(存在する場合)


編集:残念ながら、それはもっとゴルフをしませんが、このアイデアを進める別のアプローチを追加したかったです

闘争の期間の後、私はこのシリーズの数学的表現を見つけることに成功しました:

2 ^ l(0 + 1 + 2 ^ 1 + ... 2 ^ k)とl + k <n

= 2 ^ l(2 ^ k-1)

スコア= 90

@(n)setdiff(0:2^n-1,arrayfun(@(x)2^mod(x,(n+1)-fix(x/(n+1)))*(2^fix(x/(n+1))-1),0:(n+1)^2))

1

C、103 102バイト

long i,x;main(int a,char**b){for(;++i<1L<<atoi(b[1]);)for(x=i;x>4&&(x%4!=1||!printf("%ld,",i));x/=2);}

G.Sliepenエントリを拡張(実際に縮小)します。01バイナリ表現のパターンに関するxnor注釈を利用しますが、標準関数と少し調整するだけです。

ゴルフされていないバージョン:

long i, x;
main(int a, char**b) {
    for (; ++i < 1L << atoi(b[1]);) {
        for (x = i; x > 4 && (x % 4 != 1 || !printf("%ld,", i)); x /= 2)
            ;
    }
}

内側のループiは、左に3ビットがある限り、右に01繰り返しシフトxすることにより、バイナリパターンをスキャンします。printfは印刷された文字数を返す0ため、never なので、内部ループテストはの後に失敗printfし、breakステートメントが不要になります。

C ++、129 128バイト

同じ考え方を採用して、C ++バリアントは次のとおりです。

#include<iostream>
long i,x;int main(int a,char**b){for(;++i<1L<<atoi(b[1]);)for(x=i;x>4&&(x%4!=1||!(std::cout<<i<<','));x/=2);}

技術的には、64ビットの動作を保証し、最大5バイトまで計算する必要がiありますが、最新のプラットフォームには64ビット整数があります。long long2^32


1

JavaScript ES6、60バイト

コード

n=>[...Array(1<<n).keys()].filter(g=x=>x>4?x%4==1|g(x>>1):0)

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

説明

[...Array(1<<n).keys()]                                          Create an array of numbers from 0 to 2^n-1
                       .filter(                                  Find the numbers which meet criteria
                               g=x=>x>4?                  :0     If x is less than or equal to four return zero (false/invalid)
                                        x>4?x%4==1|              If the binary pattern ends with 01 return one (true/valid)
                                                   g(x>>1)       Otherwise bitshift right by one and try again

0

C(並べ替え-GCCで警告付きでコンパイル)-103

これは、printf以外の種類のライブラリ関数を使用しません。これを見れば、標準に準拠したりUBを回避したりする努力がspareしみないことがわかります。

x,c;main(n,v){n--;for(;c<1<<n;c++)for(v=0;v<32;v++)if(c&1<<v){if(x&&x<v&&printf("%d ",c))break;x=v+1;}}

準拠させるには、可能な限り小さくするという精神に反するstdio.hなど、多くのことを行う必要があります。

短くするための提案があれば、教えてください。



0

Python、44バイト

さて、これはおそらくもっと短いかもしれませんが、それは私の最初のコードゴルフです:

x=1
while True:
    if '01' in bin(x):
        print(x)
    x+=1

これが質問に答えていると思います。そうでない場合は、反対票を投じないでください。それについての間違ったことを下に投稿してください。


1
を取得するために入力を取得する必要があり(input()理想的です)n2^n-1無制限にループするのではなく、にカウントアップするだけです。また、4と8ではなく、1と2のスペースをネストに使用できます。mapまたは、リスト内包表記を使用すると、コードが大幅に短縮される可能性があります。
メゴ

0

良いスコアの別の異なるMATLAB回答。

matlab 60(57)

@(n)find(mod(log2(bitcmp(1:2^n,fix(log2(1:2^n)+1))+1),1))

実行

>> @(n)find(mod(log2(bitcmp(1:2^n,fix(log2(1:2^n)+1))+1),1))

ans =

@(n)find(mod(log2(bitcmp(1:2^n,fix(log2(1:2^n)+1))+1),1))

>> ans(5)

ans =

 5     9    10    11    13    17    18    19    20    21    22    23    25    26    27    29

  • アイデアは、-(x)+1のバイナリ表現が1つの出現のみを含まない数値xを選択することです1

例:

0000111〜x = 1111、〜x + 1 =に00001は1桁= 1が含まれているため拒否されます

0100111〜x = 1011、〜x + 1 =に0111は多くの1が含まれているため、受け入れられます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.