Angka dengan beberapa kali dijalankan


30

Tugas

Temukan himpunan angka sehingga representasi biner berisi dua atau lebih proses 1dipisahkan oleh setidaknya satu 0.

Misalnya, untuk angka-angka yang panjangnya 4 bit:

 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)

Memasukkan

Integer yang disediakan untuk aplikasi melalui beberapa input dalam jangkauan 3 .. 32. Ini mewakili jumlah bit maksimum yang akan dihitung.

Masukan dari nmenunjukkan bahwa angka-angka perlu diperiksa.0 .. 2n-1

Keluaran

Daftar semua angka yang dibatasi (pilihan Anda) yang memenuhi kriteria. Angka-angka harus disajikan dalam urutan numerik. Pembatas tambahan tambahan dapat diterima. Penutup struktur data (misalnya []dan sejenisnya) juga dapat diterima.

Contoh

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

Ini adalah - jawabannya dengan jumlah byte terkecil yang menang.


Saya pikir Anda melewatkan 23 untuk n = 5.
xnor

@xnor Anda benar. Terima kasih, dan ya, itu juga membuatnya tidak setara dengan A094695. Hmm. oeis.org/A101082 vs oeis.org/A166934

@VTCAKAVSMoACE ya. Jika seseorang \nmembatasi dan menempatkan \npada baris terakhir, maka ,dibatasi dengan ,trailing juga harus dapat diterima. Diperbarui.

1
Bisakah input dalam format daftar suka [1, 2, 3]?
kirbyfan64sos

@ kirbyfan64sos ya. Diperbarui.

Jawaban:


7

Pyth, 12 byte

f<2r.BT8U^2Q

Cobalah online.

Ide

Representasi biner dari bilangan positif selalu dimulai dengan deret 1 s, mungkin diikuti oleh deret lain, bergantian 0 s dan 1 s. Jika setidaknya ada tiga run terpisah, dua di antaranya dijamin menjalankan 1 detik.

Kode

              (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)]

Saya telah terlalu memikirkan ini. Kami hanya perlu memeriksa apakah ekspansi biner berisi '01'.

Agar ada dua run yang, yang di sebelah kanan harus didahului oleh a 0. Jika hanya ada satu kali, tidak akan ada yang memimpin 0, jadi itu tidak akan terjadi.


Jawaban lama:

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

Representasi biner Python bekerja sangat baik di sini. Bilangan biner ditulis seperti bin(9)=='0b10110'. Membagi '0'hasil dalam daftar

  • Kosongkan string di sebelah kiri inisial 0, di antara dua beruntun 0, dan di sebelah kanan final0
  • Surat itu bdiikuti oleh satu atau lebih yang terkemuka
  • Jalan 1yang tidak mengarah

Dua kategori pertama selalu ada, tetapi yang terakhir hanya ada jika ada yang dijalankan 1yang tidak mengandung yang memimpin '1', dan hanya jika ada lebih dari satu yang dijalankan 1. Jadi, cukup untuk memeriksa apakah daftar tersebut mengandung lebih dari 2elemen yang berbeda.

Python 3.5 menghemat 2 karakter dengan membongkar {*_}di tempat set(_).


Terima kasih untuk ide untuk menggunakan /01/bukan /10+1/. Saya mengambil keuntungan dari itu di Perl .
msh210

13

Ruby, 44 40 38 karakter

dicoret 44 masih teratur 44; (

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

Fungsi anonim (proc, sebenarnya) yang mengambil integer dan mengembalikan array.

Menggunakan regex /10+1/: a 1, setidaknya satu 0, lalu yang lain 1. @ histokrat menunjukkan bahwa jika 01ada di mana saja dalam string, pasti ada suatu 1tempat sebelum itu.


1
Menggunakan format string adalah sedikit lebih pendek di sini: /10+1/=~'%b'%x. Selain itu, Anda dapat menyimpan karakter dengan menggunakan rentang inklusif ( 0..2**n) karena 2**ntidak akan pernah memiliki banyak proses.
histokrat

@ histokrat Huh, saya tidak pernah tahu Anda bisa membalik urutan string dan regex dengan =~. Terima kasih!
Gagang Pintu

1
Tunggu, sebenarnya regex juga /01/berfungsi. Jika ada 01, harus ada 1 ke kiri di suatu tempat.
histokrat

@ histokrat Oh, itu pintar! Itu menghemat dua karakter.
Gagang Pintu

7

Julia, 43 41 byte

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

Ini menciptakan fungsi tanpa nama yang menerima integer dan mengembalikan array. Ini menggunakan trik regex histokrat (digunakan dalam jawaban Doorknob), di mana 01hanya akan cocok jika ada 1 sebelumnya.

Tidak Disatukan:

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

trik histokrat, bukan punyaku. :)
Gagang Pintu

@ Doorknob Oh, hei, sekarang Anda berdua mendapatkan kredit. :)
Alex A.

6

Matlab, 79 68 64 59

Idenya adalah menafsirkan angka biner sebagai array angka nol dan angka, dan kemudian menghitung perbedaan absolut antara setiap pasangan tetangga. Jika kita memiliki dua kali atau lebih selisih 1, maka kita jelas memiliki dua atau lebih run. Perhatikan bahwa ini hanya berfungsi jika kita merepresentasikan angka biner tanpa angka nol di depan.

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

Versi lama:

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 byte

Sapi suci, membuat rentang di JS tidak mudah. Mungkin akan lebih pendek dengan forloop yang sebenarnya . Tidak, saya berbohong; sebenarnya sedikit lebih lama. Baiklah. Saya kira saya hanya harus puas dengan 27 byte yang disimpan. (7 terima kasih kepada Mwr247!)

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

Bekerja dengan baik di versi terbaru Firefox, tetapi mungkin tidak di peramban lain. Cobalah:

<!--                               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>

(Cuplikan diambil dari halaman ini )

Saran diterima!


Anda dapat menggunakan .keys()alih-alih .fill()dan abukannya imengikat tambang untuk 62:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Mwr247

@ Mwr247 Terima kasih! Saya ingin tahu apakah mungkin di bawah 62 ... :)
ETHproduksi

6

Haskell, 68 61 53 byte

Perbaikan dari Damien

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

Sejarah:

Ini memperbaiki bug (Beralih == dan =, dan kuadrat alih-alih kekuatan dua). Dan ganti true dengan 2> 1 dan false dengan 1> 2. Juga terima kasih untuk menunjukkan bahwa 2 ^ x selalu gagal. Terima kasih kepada Thomas Kwa dan nimi

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]

Semula

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

Jika harus program penuh,

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
Lambdas baik-baik saja, karena OP tidak menentukan penulisan fungsi atau program bernama. Omong-omong, selamat datang di PPCG!
lirtosiast

1
Saya pikir maksud Anda 1..(2^x-1)yang bisa 1.. (2^x)sejak 2 ^ x selalu gagal.
lirtosiast

Anda dapat mengganti konstanta Falsedan Truedengan 1>2dan 1<2. Tidak perlu untuk tanda kurung di sekitar 2^x-1. (BTW: Anda salah ketik: pasti 4==1=True).
nimi

Terima kasih atas koreksi kesalahan ketik. Itu larut malam di waktuku.
Akangka

Trik yang bagus! Saya pikir Anda dapat mengurangi g ke: gx | x mod4 == 1 = x> 4 | 2> 1 = g $ x div2
Damien

5

APL, 34 27 byte

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

Ini menciptakan fungsi monadik tanpa nama yang menerima integer di sebelah kanan dan mengembalikan array.

Penjelasan:

                     }¨⍳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

Disimpan 7 byte berkat Dennis!


4

R, 55 47 byte

(dengan bantuan dari @ Alex.A)

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

R tidak memiliki fungsi bawaan untuk menampilkan angka yang dikonversi dengan cara yang mudah, jadi saya menggunakan R.utils::intToBinini, sementara sisanya cukup banyak hanya melaporkan lokasi ekspresi regex yang cocok dan mencetak ke STDOUT sambil dipisahkan oleh ruang.


Saya pikir pemisah default untuk catruang, sehingga Anda bisa menghilangkan ,sep=","seluruhnya, menghemat 7 byte.
Alex A.

@AlexA. ya, jadi bisakah saya menggunakan spasi di sini sebagai September? Saya tidak yakin
David Arenburg

1
OP mengatakan pembatas pilihan Anda, jadi saya pikir ruang tampaknya cukup masuk akal. :)
Alex A.

Apakah ini benar-benar membutuhkan fungsi kucing? tanpa itu, output akan dibatasi tab. Penghitung sebelah kiri adalah bagian dari UI, jika Anda menulisnya ke file ini tidak akan dimasukkan sehingga bukan bagian dari output.
freekvd

@freekvd tanpa itu tidak akan mencetak ke STDOUT, Sesuatu tentang aturan konyol situs ini.
David Arenburg

4

CJam, 14

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

3 byte lebih pendek berkat Dennis. Cobalah online


Bagaimana 2be`,2>.
jimmy23013

2
2be`2>dan 2,#)harus bekerja juga. Juga, OP telah mengklarifikasi bahwa output dapat dicetak dalam bentuk daftar.
Dennis

4

JavaScript (ES6), 69 68 67 62 byte

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

Hari ini saya menemukan cara baru yang lebih singkat untuk mengisi array secara dinamis tanpa menggunakan isi atau peta. Melakukan x=>[...Array(x).keys()]akan mengembalikan array rentang 0 hingga x. Jika Anda ingin menentukan rentang / nilai Anda sendiri, gunakan x=>[...Array(x)].map((a,i)=>i), karena hanya beberapa byte lagi.


4

Java, 214 165 155 154 148 141 110 byte

Kiriman ini mengeksploitasi fakta bahwa representasi string biner dari angka di Jawa tidak pernah memiliki nol di depan. Jika string "01" muncul dalam representasi biner dari angka, itu harus menandai kemunculan kedua angka "1".

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;}

Tidak Disatukan:

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
}

Output program (ingat, trailing delimiter dapat diterima):

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, 

Tidak bisakah Anda menggunakan intvariabel counter?
flawr

Semua tipe integer di Java tidak ditandatangani. Untuk bekerja dengan integer positif 32 bit, diperlukan 64 bit long. Selanjutnya, menggunakan intbenar-benar akan meningkatkan ukuran kode karena mereferensikan Integerkelas pembungkus yang melakukan parsing angka. Saya pikir tempat yang mungkin untuk menghemat ruang adalah regex, tetapi pengujian saya menunjukkan saya harus memimpin dan membuntuti.*

Oh benar, tapi saya pikir Anda bisa menggunakan Longbungkusnya int? (Ya tidak dalam kasus ini tetapi umumnya?)
flawr

Ya, itu intakan dipromosikan longketika digunakan sebagai parameter dengan Long. Dalam hal ini meskipun sebenarnya tidak ada cara untuk menggunakan intbit karena tanda, dan Integerlebih lama dari Long. Namun, saya telah menemukan beberapa cara untuk memeras ruang ekstra dari bahasa yang sama verbose dengan Java.

Bisakah Anda menggunakan new Long()bukan Long.parseLong()?
Ypnypn

4

C (gcc) , 111 99 byte

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;}

Cobalah online!

12 byte dicukur berkat @ceilingcat!

Tidak Disatukan:

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);
  }
}

Fungsi ffsl () memberi Anda indeks bit pertama yang diatur dalam bilangan bulat panjang. Jadi kami beralih dari i = 1ke 2 ^ number_of_bits. Kami menetapkan xuntuk ibergeser ke kanan sampai kami telah menghapus semua bit nol berturut-turut pada ujung yang paling signifikan. Kemudian, kami menggeser ke xkanan sampai kami telah menghapus semua 1 bit berturut-turut pada akhir yang paling signifikan. Jika hasilnya masih nol, kami menemukan kecocokan.


2
Saya harus mengatakan bahwa saya benar-benar menyukai seseorang melakukan sedikit manipulasi jawaban daripada pendekatan "convert to string and regex".

@MichaelT Aku bertanya-tanya apakah ada olution pendek hanya menggunakan operasi bitwise primitif.
lirtosiast

@ ThomasKwa Itu mungkin ada hubungannya dengan tantangan kode .

Menarik. Anda juga dapat menulis tes seperti ini if (popcount(i ^ (i*2))>3):, dan perluas popcount () ke serangkaian AND bitwise dan operasi shift. Tapi itu akan menghasilkan kode yang cukup panjang.
G. Sliepen

1
@ThomasKwa y = x | (x-1) untuk mengaktifkan semua bit paling kanan 0. Kemudian z = y & (y + 1) untuk mematikan semua trailing 1 bit. Jika z bukan nol, maka nomor aslinya memiliki lebih dari satu kali proses.
Alchymist

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>


@ Docosc tidak, hasilnya akan menjadi seperti,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
edc65

3

K5, 19 byte

Ini beroperasi di sepanjang prinsip yang sama dengan solusi Dennis, tetapi dengan lebih sedikit builtin untuk memanfaatkan.

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

Pertama, buat serangkaian biner x-tuple ( +!x#2), lalu untuk setiap tupel temukan setiap titik yang angka tidak cocok dengan sebelumnya jika kita memperlakukan elemen -1 pada daftar sebagai 0 untuk tujuan ini ( ~0=':'). Solusi kami adalah di mana dua lebih sedikit dari jumlah masing-masing hitungan run. ( &2<+/').

Menampilkan setiap langkah perantara lebih jelas:

  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

Dan semuanya:

  {&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

Pip, 13 + 1 = 14 byte

Mengambil input dari baris perintah dan menggunakan -sflag untuk spasi di antara angka-angka output.

01NTB_FI,2**a

Cukup mudah: membangun range(2**a)dan memfilter lambda _: "01" in toBinary(_). Saya cukup senang memikirkan 01ide itu secara mandiri. Tidak ada tanda kutip yang diperlukan 01karena ini memindai sebagai literal numerik (angka dan string adalah tipe yang sama di Pip).


2

Julia, 40 byte

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

Ini menggunakan pendekatan yang agak berbeda dengan solusi Julia lainnya - daripada melakukan pencarian string untuk "01" dalam bit string, ia menggunakan beberapa matematika untuk menentukan apakah angka memenuhi syarat.

i$i>>1akan memiliki yang hanya di tempat-tempat digit berubah dari nol menjadi satu, atau satu ke nol. Dengan demikian, setidaknya harus ada tiga yang iharus bolak-balik antara nol dan satu kali cukup. count_onesmenemukan jumlah yang, dan kemudian filtermenghapus yang tidak cukup.


2

C ++, 197 188 141 byte

Catatan: ini ditulis dan diuji menggunakan MSVC ++ 2013. Tampaknya #includeing <iostream>mencakup semua C header yang diperlukan untuk membuat karya ini. Tampaknya juga bahwa kode tidak lagi benar-benar C ++, tetapi kompilasi menggunakan C ++ memungkinkan trik header yang mengurangi ukuran kode dibandingkan dengan memasukkan banyak header C lebih banyak.

Menggunakan printfalih-alih coutjuga menghemat beberapa byte.

Golf:

#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);}}

Tidak Disatukan:

#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 dapat menggunakan '\n'alih-alih std :: endl (secara umum), atau ','karena setiap pemisah valid dan yang tertinggal baik-baik saja.
G. Sliepen

Alih-alih regex, Anda bisa melakukannya dengan strstr(c,"01").
G. Sliepen

@ G. Sllien terima kasih! Jujur saya baru saja menyalin solusi Java saya dan dikonversi ke C ++, tetapi solusi sederhana sering yang terbaik. Saya mungkin harus melakukan sesuatu yang mirip dengan Java sekarang.

Dua kesalahan kecil: 1<<atol(b[1])seharusnya 1L<<atol(b[1]), jika tidak, hasil dari ekspresi itu akan menjadi integer 32 bit yang ditandatangani, yang berarti kode hanya akan berjalan hingga 2 ^ 30. Printf harus digunakan %lduntuk mencetak angka antara 2 ^ 31 dan 2 ^ 32 dengan benar.
G. Sliepen

2

Perl 5, 55 53 49 47 41 byte

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

54 52 48 46 40 byte, plus satu untuk -Ebendera, bukan -e.


Terimakasih untuk xnor untuk petunjuk tentang penggunaan /01/alih-alih /10+1/, yang menghemat dua byte.

Terima kasih kepada Dennis saran untuk menggunakan <>bukan$ARGV[0] , yang menyelamatkan enam byte.


2

C, 84 81 byte

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

Ini didasarkan pada komentar yang saya buat pada jawaban C lain untuk pertanyaan ini tentang kemungkinan menggunakan operator bitwise sederhana. Ia bekerja dengan mengalihkan semua trailing 0 bit ke 1 dalam pernyataan i | (i-1). Kemudian ia mengalihkan semua trailing 1 bit ke 0 menggunakan k & (k + 1). Ini akan menghasilkan nol jika hanya ada satu yang dijalankan dan bukan-nol sebaliknya. Saya membuat asumsi bahwa panjang adalah 64-bit tetapi bisa memperbaikinya dengan mengorbankan tiga byte dengan menggunakan int64_t sebagai gantinya.

Tidak disatukan

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_thanya ditentukan jika Anda #include<stdint.h>. memastikan operasi 64 bit memerlukan long longjenis dengan biaya 5 byte.
chqrlie

Perhatikan bahwa Anda memohon passing perilaku yang tidak terdefinisi long iuntuk %dformat. Perhatikan juga yang ()berlebihan untuk &dan |operator. Memperbaiki ini menghemat 3 byte! long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
chqrlie

@ chqrlie Semua poin sangat bagus. Terima kasih.
Alchymist


1

Python 2.7, 89 byte

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

Saya pikir ini bisa sedikit golf.


@ mbomb007 Saya mencobanya, tidak berhasil.
Loovjo

@ mbomb007 Apakah Anda menggunakan Python 2.7?
Loovjo

Apakah penting versi 2.7 yang mana? Saya menjalankannya di repl.it (2.7.2) dan tidak berfungsi, tetapi Ideone (2.7.10) berhasil. Mungkin saja itu adalah bug di repl.it, tidak harus perbedaan versi.
mbomb007

Program Anda mencetak dengan salah 0pada output.
mbomb007

Juga print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]dua byte lebih pendek. Tetapi dengan memperbaiki untuk 0akan memiliki panjang yang sama (89), jika Anda gunakan range(1,2**input()).
mbomb007

1

TI-BASIC, 34 32 30 byte

Untuk kalkulator TI-83 + / 84 + series.

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

Agar angka mengandung dua run dari 1s, itu harus berisi dua 10s ketika kita memakukan trailing nol ke representasi biner.

Daripada menghasilkan representasi biner dan memeriksa a 10, kami menguji pasangan bit secara matematis dengan menggunakan sisa oleh 4 ( int(4fPart(), yang akan memberikan di 2mana ada a 10. Karena kami tidak peduli dengan pesanan, randIntNoRep(adalah cara terpendek untuk menghasilkan daftar eksponen.

Kami gunakan log(untuk memeriksa jumlah proses:

  • Jika setidaknya ada 2 run, maka log(hasilnya positif, dan jumlahnya ditampilkan.

  • Jika ada satu proses, maka itu log(adalah 0, dan jumlahnya tidak ditampilkan.

  • Jika tidak ada jalan (yang pertama kali terjadi pada X = 2 ^ Ans), kemudian log(melempar ERR: DOMAIN, menghentikan output tepat pada titik yang tepat.

Kami menggunakan e^(Anssebagai argumen akhir dari For(loop — selalu lebih besar dari 2^Ans, tetapi e^(merupakan token tunggal, jadi satu byte lebih pendek.

Input / output untuk N = 4:

4:prgmRUNSONES
               5
               9
              10
              11
              13

Kemudian kalkulator melakukan kesalahan; layar kesalahan terlihat seperti ini:

ERR:DOMAIN
1:Quit
2:Goto

Ketika 1 ditekan, layar beranda ditampilkan lagi:

4:prgmRUNSONES
               5
               9
              10
              11
              13
           Error

Kalkulator TI menyimpan semua angka dalam float BCD dengan presisi 14 digit, bukan float int atau biner. Oleh karena itu, pembagian dengan kekuatan dua lebih besar dari 2^14mungkin tidak tepat. Sementara saya telah memverifikasi bahwa angka-angka paling sulit, 3*2^30-1dan 2^32-1, ditangani dengan benar, saya belum mengesampingkan kemungkinan kesalahan pembulatan. Namun saya akan terkejut jika ada kesalahan untuk input apa pun.


Bagaimana Anda menghitung 32 byte? Sepertinya 70 bagi saya (termasuk baris baru).
msh210

TI-BASIC adalah tokenized; itu menggunakan pengkodean karakter eksklusif di mana semua perintah ini masing-masing satu byte dan yang lain adalah dua. Ini adalah konsensus komunitas untuk mencetak skor dengan penyandian ini - lihat meta.codegolf.stackexchange.com/a/4764/39328 untuk detailnya.
lirtosiast

Oh keren. Terima kasih FYI.
msh210

1
  • ini tidak mengalahkan jawaban flawr tetapi saya tidak bisa menahan pesona pertanyaan

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

eksekusi

4

ans =

5

ans =

9    10    11

ans =

13

prinsip

  • Rangkaian angka adalah hasil dari strip konsekuen 1, yang berarti f (n, l) = 2 ^ l + 2 ^ (l + 1) + .... 2 ^ n

Setiap angka yang diambil dari interval] f (n, l), f (n, l) + 2 ^ (l-1) [di mana l> 1 memverifikasi kondisi ini, sehingga hasilnya adalah hasil dari negasi dari seri ini di ketentuan 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

Program saya mencetak rentang antara masing-masing dua baris (jika ada)


Sunting: sayangnya itu tidak membuatnya lebih golf tetapi saya ingin menambahkan pendekatan lain dalam memproses ide ini

setelah periode perjuangan saya berhasil menemukan representasi matematis untuk seri ini yaitu:

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

= 2 ^ l (2 ^ k-1)

skor = 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 byte

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);}

Memperluas (sebenarnya berkontraksi) pada entri G.Sepepen, mengambil keuntungan dari komentar xnor pada 01pola dalam representasi biner, tetapi hanya menggunakan fungsi standar dan sedikit memutar-mutar.

Versi tidak disatukan:

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)
            ;
    }
}

Loop dalam memindai ipola biner 01dengan menggeser secara iteratif xke kanan selama masih memiliki 3 bit. printfmengembalikan jumlah karakter yang dicetak, karenanya tidak pernah 0, jadi tes loop dalam gagal setelah printf, menghindari kebutuhan untuk breakpernyataan.

C ++, 129 128 byte

Mengadaptasi gagasan yang sama, varian C ++ ada di sini:

#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);}

Secara teknis, saya harus membuat isebuah long longuntuk memastikan bit operasi 64 dan menghitung upto 2^32untuk tambahan 5 byte, tetapi platform modern memiliki 64 bit int.


1

JavaScript ES6, 60 byte

Kode

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

Cobalah online!

Penjelasan

[...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 (semacam - kompilasi dengan peringatan di GCC) - 103

Ini tidak menggunakan fungsi perpustakaan dalam bentuk apa pun kecuali printf. Anda dapat melihat dengan melihat ini bahwa tidak ada upaya yang telah dilakukan untuk menjadikannya sesuai standar atau menghindari UB.

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;}}

Untuk membuatnya patuh, Anda perlu melakukan banyak hal seperti memasukkan stdio.h yang akan bertentangan dengan semangat membuatnya sekecil mungkin.

Jika ada yang punya saran untuk membuatnya lebih singkat, beri tahu saya.


0

PowerShell, 80 byte

while([Math]::Pow(2,$args[0])-gt$n++){$n|?{[Convert]::ToString($n,2)-match"01"}}

0

Python, 44 Bytes

Oke, ini mungkin bisa lebih pendek tapi itu codegolf pertama saya:

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

Pikirkan ini menjawab pertanyaan, tolong jangan turun memilih jika tidak, hanya memposting apa yang salah dengan itu di bawah ini.


1
Anda perlu mengambil input ( input()sangat ideal) untuk mendapatkan n, dan kemudian hanya menghitung hingga 2^n-1, daripada mengulang tanpa batas. Selain itu, Anda bisa menggunakan spasi 1 dan 2 untuk bersarang, daripada 4 dan 8, dan menggunakan mapatau pemahaman daftar mungkin akan mempersingkat kode Anda.
Mego

0

jawaban matlab lain yang berbeda dari skor yang baik.

matlab 60(57)

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

eksekusi

>> @(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

  • Idenya adalah mengambil angka x di mana representasi biner dari - (x) +1 tidak hanya berisi satu kejadian1

contoh:

0000111ditolak karena ~ x = 1111, ~ x + 1 = 00001mengandung satu digit = 1

0100111diterima karena ~ x = 1011, ~ x + 1 = 0111mengandung banyak 1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.