Birden fazla koşulu olan sayılar


30

Görev

İkili gösterimin 1en az bir tanesiyle ayrılmış iki veya daha fazla işlem içereceği şekilde sayı kümesini bulun 0.

Örneğin, 4 bit uzunluğundaki sayılar için:

 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)

Giriş

Uygulamaya, aralıktaki bazı girdiler aracılığıyla sağlanan bir tam sayı 3 .. 32. Bu sayılacak en fazla bit sayısını temsil eder.

Girişi n, sayıların incelenmesi gerektiğini gösterir.0 .. 2n-1

Çıktı

Kriterlere uyan tüm numaraların sınırlı (seçiminiz) listesi. Sayılar sayısal sırada verilmelidir. Ekstra bir takip sınırlayıcı kabul edilebilir. Veri yapısı muhafazaları (örneğin []ve benzerleri) de kabul edilebilir.

Örnek

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

Bu - en az bayt miktarı olan cevap kazanır.


Sanırım n = 5 için 23 tane özledin.
xnor

@ xnor haklısınız. Teşekkürler ve evet, bu da A094695'e eşdeğer değil. Hmm. oeis.org/A101082 vs oeis.org/A166934

@VTCAKAVSMoACE evet. Eğer biri \nsınırlandırıyor ve \nson satıra ,giriyorsa, ,iz bırakarak sınırlandırılmış olması da kabul edilebilir olmalıdır. Güncellenmiş.

1
Giriş, bir liste biçiminde olabilir [1, 2, 3]mi?
kirbyfan64sos 21:15

@ kirbyfan64sos evet. Güncellenmiş.

Yanıtlar:


7

Pyth, 12 bayt

f<2r.BT8U^2Q

Çevrimiçi deneyin.

Fikir

Herhangi bir pozitif sayının ikili temsili her zaman 1 sn'lik bir işlemle başlar , muhtemelen 0 sn ve 1 sn'lik diğer alternatif akımlarla devam eder . En az üç ayrı işlem varsa, bunlardan ikisinin 1 sn'lik bir koşu olacağı garanti edilir .

kod

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

Bunu çok fazla düşünmüştüm. İkili genişlemenin içerip içermediğini kontrol etmemiz yeterli '01'.

İki tane koşunun olması için, sağdakiin a'dan önce gelmesi gerekir 0. Sadece bir koşuş olursa, lider 0olmayacak, bu olmayacak.


Eski cevap:

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

Python ikili gösterimi burada çok iyi çalışıyor. Bir ikili sayı gibi yazılır bin(9)=='0b10110'. '0'Listesindeki sonuçlara bölme

  • Baştaki boşluğa 0, arka arkaya gelen iki karakterin arasında 0ve herhangi bir finalin sağında boş dizeler0
  • Mektubu bbir veya daha fazla önde gelen kişi takip etti
  • Arasında çalıştırır 1yol açmayan s'

İlk iki kategori her zaman vardır, ancak sonuncusu yalnızca 1liderleri içermeyen '1'bir koşu varsa, ve yalnızca birden fazla koşu varsa 1. Bu nedenle, listenin 2farklı öğelerden fazlasını içerip içermediğini kontrol etmek yeterlidir .

Python 3.5 açma tarafından 2 karakter kazandırır {*_}yerine set(_).


/01/Bunun yerine kullanmak fikri için teşekkürler /10+1/. Bundan Perl'de faydalandım .
msh210

13

Ruby, 44 40 38 karakter

44 üzerinden çarpı hala 44 normaldir;

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

Bir tamsayı alan ve bir dizi döndüren adsız bir işlev (proc, aslında).

Regex kullanır /10+1/: a 1, en az bir 0, sonra başka 1. @ histokrat 01, dizede herhangi bir yer varsa , ondan önce bir yerde olması gerektiğini belirtir 1.


1
Bir biçim dizesi kullanarak burada biraz daha kısa: /10+1/=~'%b'%x. Ayrıca, içerdiği bir aralığı ( 0..2**n) kullanarak bir karakter kaydedebilirsiniz, çünkü 2**nhiçbir zaman birden fazla işlem yapmaz.
histoc

@histokrat Huh, sicimin ve regex'in sırasını değiştirebileceğinizi bilmiyordum =~. Teşekkürler!
Doorknob

1
Bekle, aslında regex /01/de aynı şekilde çalışır. Eğer bir varsa 01, solda bir yerde bir tane olmalı.
histocrat

@ histokrat Oh, bu çok zekice! Bu iki karakter kaydeder.
Doorknob

7

Julia, 43 41 bayt

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

Bu bir tamsayıyı kabul eden ve bir dizi döndüren adsız bir işlev oluşturur. Histokratlarının regex numarasını (Doorknob'un cevabında kullanılan) kullanır, burada 01sadece önceki 1 varsa eşleşir.

Ungolfed:

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

Histokratın numarası, benim değil. :)
Doorknob

@Doorknob Oh hey, şimdi ikiniz de kredi alıyorsunuz. :)
Alex A.

6

Matlab, 79 68 64 59

Buradaki fikir, ikili sayıyı sıfır dizisi ve sayıları dizisi olarak yorumlamak ve ardından her bir komşu çifti arasındaki mutlak farkı hesaplamaktır. Eğer iki ya da daha fazla kez 1 farkımız varsa, o zaman iki ya da daha fazla olanı izleyeceğiz. Bunun yalnızca ikili sayıları satır başında olmadan temsil ettiğimizde işe yaradığını unutmayın.

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

Eski versiyonlar:

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 bayt

Kutsal inek, JS'de aralıklar oluşturmak kolay değil. Belki gerçek bir fordöngü ile daha kısa olurdu . Hayır, yalan söyledim; Aslında biraz daha uzun. Oh iyi. Sanırım sadece kaydedilen 27 byte'a razı olmak zorunda kalacağım. (7, Mwr247'ye teşekkürler!)

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

Firefox’un en son sürümlerinde düzgün çalışıyor, ancak muhtemelen başka bir tarayıcıda değil. Denemek:

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

( Bu sayfadan snippet alındı )

Önerilerinizi bekliyoruz!


Sen kullanabilirsiniz .keys()yerine .fill()ve ayerine i62 benimsin kravat:x=>[for(a of Array(1<<x).keys())if(/01/.test(a.toString(2)))a]
Mwr247

@ Mwr247 Teşekkürler! 62'nin altında mümkün olup olmadığını merak ediyorum ... :)
ETHproductions

6

Haskell, 68 61 53 bayt

Damien'dan İyileştirme

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

Tarihçe:

Bu, hatayı düzeltir (Anahtarlı == ve =, ve ikisinin gücü yerine kare). Ve 2> 1 ile true ve 1> 2 ile false değiştirin. Ayrıca, 2 ^ x'in her zaman başarısız olduğunu gösterdiğin için teşekkürler. Thomas Kwa ve nimi'ye teşekkürler

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]

Aslında

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

Tam program olması gerekiyorsa,

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
Lambdalar gayet iyi, çünkü OP adında bir fonksiyon veya program yazmayı belirtmedi. Bu arada, PPCG'ye hoş geldiniz!
lirtosiast

1
Sanırım 1..(2^x-1)hangisi 1.. (2^x)2 ^ x'den beri başarısız oluyor?
lirtosiast

Sen sabitleri yerini alabilir Falseve Truebirlikte 1>2ve 1<2. Parantez içine gerek yok 2^x-1. (BTW: bir yazım hatası var: öyle olmalı 4==1=True).
nimi,

Yazım hatası düzeltme için teşekkürler. Benim zamanımda gece geç saatti.
Akangka

güzel numaralar! Bence g oranını azaltabilirsiniz: gx | x mod4 == 1 = x> 4 | 2> 1 = g $ x div2
Damien

5

APL, 34 27 bayt

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

Bu, sağdaki bir tamsayıyı kabul eden ve bir dizi döndüren adsız bir monadik işlev oluşturur.

Açıklama:

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

Dennis sayesinde 7 byte kurtarıldı!


4

R, 55 47 bayt

(@ Alex.A'dan yardım alarak)

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

R, dönüştürülen sayıları uygun bir şekilde görüntülemek için yerleşik bir işleve sahip değildir, bu yüzden bunu kullanıyorum R.utils::intToBin, gerisi sadece eşleşen regex ifadesinin konumunu bildirir ve ayrılırken STDOUT'a yazdırır. alanı.


Bence varsayılan ayırıcı catbir boşluktur, bu yüzden ,sep=","7 bayt tasarruf ederek tamamen ihmal edebilirsiniz .
Alex A.

@AlexA. evet, bu yüzden burada bir boşluk olarak bir boşluk kullanabilir miyim? Emin değildim
David Arenburg

1
OP sizin seçiminizin sınırlayıcı olduğunu söyledi, bu yüzden bir alanın yeterince makul gözüktüğünü düşünüyorum. :)
Alex A.

Bu gerçekten kedi işlevine ihtiyaç duyuyor mu? onsuz, çıktı sekmeyle sınırlandırılır. Sol taraftaki sayaç kullanıcı arayüzünün bir parçasıdır, bir dosyaya yazarsanız bu dahil edilmez, bu yüzden çıktının bir parçası olmaz.
freekvd

onsuz @freekvd bu sitenin saçma kuralları hakkında bir şey, STDOUT yazdırmayacak.
David Arenburg


4

JavaScript (ES6), 69 68 67 62 bayt

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

Bugün, dolgu veya harita kullanmadan dizileri dinamik olarak doldurmanın daha kısa bir yolunu keşfettim. Yapılması x=>[...Array(x).keys()], 0 ile x arasında bir dizi döndürür. Kendi aralığınızı / değerlerinizi tanımlamak istiyorsanız x=>[...Array(x)].map((a,i)=>i), yalnızca birkaç bayt daha uzun olduğu için kullanın.


4

Java, 214 165 155 154 148 141 110 bayt

Bu gönderme, Java'daki bir sayının ikili bir dize gösteriminin hiçbir zaman baştaki sıfıra sahip olmadığı gerçeğini kullanır. Dize bir sayının ikili gösteriminde "01" görünür, o takdirde gereken numarası "1" ikinci bir örneğini işaretleyin.

golfed:

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

Ungolfed:

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
}

Program çıktısı (unutmayın, takip sınırlayıcıları kabul edilebilir):

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, 

intSayaç değişkeni için kullanamaz mısın?
kusur

Java'daki tüm tamsayı türleri imzasızdır. 32 bit pozitif tamsayı ile çalışmak için 64 bit longgereklidir. Ayrıca, bir ile intaslında olur artış nedeniyle referans kod büyüklüğü Integernumarası ayrıştırma yapan sarma sınıfı. Yer kazanmak için muhtemel bir yerin regex olacağını düşünüyorum, ancak testlerim lider ve .*

Ah doğru, ama kullanabileceğini düşündüm Longile sarıcı int? (Peki bu durumda değil ama genel olarak?)
kusur

Evet, ile parametre olarak kullanıldığında intteşvik edecek . Bu durumda , işaret biti yüzünden kullanmanın hiçbir yolu yoktur ve bundan daha uzundur . Yine de, bir dilin biraz daha fazla dilini Java kadar ayrıntılı olarak sıkmanın birkaç yolunu buldum. longLongintIntegerLong

Eğer kullanabilir miyim new Long()yerine Long.parseLong()?
Ypnypn

4

C (gcc) , 111 99 bayt

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

Çevrimiçi deneyin!

@Ceilingcat sayesinde 12 bayt tıraş edildi!

Ungolfed:

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şlevi, uzun bir tamsayıda ayarlanan ilk bitin dizinini verir. Bu yüzden biz i = 12 ^ number_of_bits için döngü . Biz ayarlamak xiçin ibiz en önemsiz ucunda tüm ardışık sıfır bit kaldırdık kadar sağa kaymış. Ardından, xen az önemli ucunda tüm ardışık 1 bitleri kaldırana kadar sağa kayarız. Sonuç hala sıfır değilse, bir eşleşme bulduk.


2
Söylemeliyim ki, birisinin "string ve regex'e dönüştür" yaklaşımından ziyade biraz manipülasyon cevabı yapmasından hoşlandım.

@MichaelT Sadece ilkel bitsel işlemleri kullanarak kısa bir rutubet olup olmadığını merak ediyorum.
lirtosiast

@ThomasKwa Bu bir kod mücadelesi olarak yapılacak bir şey olabilir .

İlginç. Testi şu şekilde de yazabilirsiniz if (popcount(i ^ (i*2))>3):, ve popcount () 'ı bit bit ANDs ve shift işlemleri dizisine genişletin. Ancak bu oldukça uzun kodlarla sonuçlanacaktır.
G. Sliepen

1
@ThomasKwa y = x | (x-1) en sağdaki 0 ​​bitin tümünü açmak için. Sonra tüm takip eden 1 bit'i kapatmak için z = y & (y + 1). Z sıfır değilse, orijinal sayı birden fazla çalıştırmaya sahipti.
Simya

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 hayır, sonuç şöyle bir şey olurdu,,,,,5,,,,9,10,11,,13,,,,17,18,19,20,21,22,23,,25,26,27,,29,,
edc65

3

K5, 19 bayt

Bu, Dennis'in çözümü ile benzer prensipler boyunca çalışır, ancak bundan yararlanacak daha az sayıda yerleşikle birlikte çalışır.

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

İlk önce, bir dizi ikili x-tuples ( +!x#2) oluşturun, daha sonra her bir tuple için, listenin -1 ~0=':'. Çözümlerimiz, her bir işlem sayısının toplamından daha azının iki olduğu yerlerdir. ( &2<+/').

Her ara adımın gösterilmesi daha açıktır:

  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

Ve hep birlikte:

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

Komut satırından girdi alır ve -sçıktı numaraları arasındaki boşluklar için bayrağı kullanır .

01NTB_FI,2**a

Oldukça basit: üzerine inşa range(2**a)ve filtre lambda _: "01" in toBinary(_). Bu 01fikri bağımsız olarak düşündüğüm için çok mutlu oldum . Etrafında hiçbir teklif gerekmemektedir, 01çünkü sayısal bir değişmez olarak tarar (rakamlar ve dizeler Pip'de aynıdır).


2

Julia, 40 bayt

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

Bu, diğer Julia çözümüne biraz farklı bir yaklaşım kullanır - bit dizesinde "01" için bir dizi araması yapmak yerine, sayının koşulu sağlayıp sağlamadığını belirlemek için bazı matematik kullanır.

i$i>>1sadece rakamın sıfırdan bire veya birden sıfıra değiştiği yerlerde olanlar olacaktır. Bu nedenle, isıfır ile bir arasında defalarca ileri geri geçiş yapmak için en az üç tane olmalıdır . count_onessayıları bulur ve daha sonra filteryeterli olmayanları kaldırır.


2

C ++, 197 188 141 bayt

Not: Bu yazılı ve O anlaşılmaktadır MSVC ++ 2013 kullanılarak test edilmiştir #includeing <iostream>bu işi yapmak için gerekli C başlıklarının tümünü içerir. Ayrıca, kodun artık gerçekten C ++ olmadığı, ancak C ++ kullanarak derlenmenin, daha fazla C başlığı eklemekle karşılaştırıldığında kod boyutunu azaltan başlık numarasına olanak sağladığı görülüyor.

printfBunun yerine kullanılması coutbirkaç bayttan da tasarruf sağlar.

golfed:

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

Ungolfed:

#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 yerine (genel olarak) kullanabilir veya ','herhangi bir ayırıcı geçerli olduğundan ve sonuncusu iyi olduğu için kullanabilirsiniz .
G. Sliepen

Regexs yerine, sadece ile yapabilirdi strstr(c,"01").
G. Sliepen

@ G.Sliepen teşekkürler! Gerçekten sadece Java çözümümü kopyaladım ve C ++ 'a dönüştürdüm, ancak basit çözüm genellikle en iyisidir. Muhtemelen şimdi Java ile benzer bir şey yapmalıyım.

İki küçük hata: 1<<atol(b[1])olmalıdır 1L<<atol(b[1]), aksi halde bu ifadenin sonucu imzalı bir 32 bit tam sayı olur, bu kodun yalnızca 2 ^ 30'a kadar çalışacağı anlamına gelir. Printf, %ld2 ^ 31 ve 2 ^ 32 arasındaki sayıları doğru yazdırmak için kullanmalıdır .
G. Sliepen

2

Perl 5, 55 53 49 47 41 bayt

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

54 52 48 46 40 bayt, artı -Ebayrak yerine bir tane -e.


Teşekkür etmek XNOR için ipucu kullanma konusunda /01/yerine /10+1/iki bayt kaydedildi hangi.

Dennis'e teşekkür tavsiyesinde bulunmak <>yerine, $ARGV[0]altı byte tasarruf sağladı .


2

C, 84 81 bayt

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

Bu, basit bit yönünde operatörleri kullanma olasılığı hakkındaki bu soruya C cevabı üzerine yaptığım yorumları temel almaktadır. Tüm izleri 0 biti i | (i-1) ifadesinde 1'e değiştirerek çalışır. Daha sonra, tüm takip eden 1 bitleri k & (k + 1) kullanarak 0'a değiştirir. Bu, yalnızca bir tane koşusu varsa ve sıfır olmayansa sıfırla sonuçlanır. Uzunluğunun 64 bit olduğunu, ancak bunun yerine int64_t kullanarak üç bayt pahasına düzeltebileceğini kabul ediyorum.

Ungolfed

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_tsadece siz tanımlanırsanız #include<stdint.h>. 64 bit işlemin sağlanması long long, 5 baytlık bir maliyetle tür gerektirir .
chqrlie

Eğer geçen tanımsız davranışını çağırmak o Not long iiçin %dformatında. Ayrıca ve operatörler ()için gereksiz olduğuna dikkat edin . Bunu düzeltmek 3 byte kazandırır! &|long i,j,k;main(){for(scanf("%ld",&j);++i<1L<<j;k&k+1&&printf("%ld ",i))k=i|i-1;}
chqrlie

@chqrlie Hepsi çok iyi. Teşekkür ederim.
Simyacı


1

Python 2.7, 89 bayt

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

Bu biraz golf oynayabileceğini düşünüyorum.


@ mbomb007 Denedim, işe yaramadı.
Loovjo

@ mbomb007 Python 2.7 kullanıyor musunuz?
Loovjo

Hangi 2.7 sürümünün önemi var mı? Repl.it (2.7.2) üzerinde çalıştırıyorum ve çalışmıyor, ama Ideone (2.7.10) çalışıyor. Her ne kadar sürüm farkı olmasa da, repl.it dosyasında bir hata olabilir.
mbomb007

Programınız 0çıktıda yanlış yazdırıyor .
mbomb007 21:15

Ayrıca print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1]iki bayt daha kısa. Ancak, bunun için düzeltme 0aynı uzunlukta (89) olacaktır range(1,2**input()).
mbomb007 21:15

1

TI-BASIC, 34 32 30 bayt

Bir TI-83 + / 84 + serisi hesap makinesi için.

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

Bir sayının iki işlemi 1 sn içerecek 10şekilde, ikili gösterime bir son sıfır aştığımızda iki saniye içermesi gerekir .

İkili gösterimi oluşturmak ve a'yı kontrol etmek yerine 10, bit çiftlerini matematiksel olarak 4 ( int(4fPart() 'e göre olan (a )' nın 2bulunduğu yere verecek şekilde test ediyoruz 10. Biz sipariş hakkında umurumda değil, randIntNoRep(olduğu en kısa üstellerin listesini oluşturmak için bir yol.

Koşu log(sayısını kontrol etmek için kullanıyoruz :

  • En az 2 çalışma varsa, o zaman log(pozitifdir ve sayı görüntülenir.

  • Bir çalışma varsa, o zaman log(0 olur ve sayı görüntülenmez.

  • Hiçbir çalışma yoksa (ilk önce X = 2 ^ Ans'da gerçekleşir), ardından log(ERR: DOMAIN atar ve çıktıyı tam doğru noktada durdurabilir.

Döngünün e^(Ansbitiş argümanı olarak kullanıyoruz - For(her zaman büyüktür 2^Ans, ancak e^(tek bir belirteçtir, bu yüzden bir bayt kısadır.

N = 4 için giriş / çıkış:

4:prgmRUNSONES
               5
               9
              10
              11
              13

Sonra hesap makinesi bir hata atar; hata ekranı şöyle görünür:

ERR:DOMAIN
1:Quit
2:Goto

1 tuşuna basıldığında, ana ekran tekrar görüntülenir:

4:prgmRUNSONES
               5
               9
              10
              11
              13
           Error

TI hesaplayıcıları, tüm sayıları bir int veya ikili şamandıra değil, 14 basamaklı bir hassasiyetle bir BCD şamandırasında saklar. Bu nedenle, ikiden daha büyüklerin gücü ile bölünmeler 2^14kesin olmayabilir. En zor sayıların doğru olduğunu 3*2^30-1ve 2^32-1doğru işlendiğini doğrulasam da, yuvarlama hataları olasılığını ekarte etmedim. Ancak herhangi bir giriş için hata olsaydı şaşırırdım.


32 bayt nasıl sayılır? Bana 70 gibi görünüyor (yeni satırlar dahil).
msh210

TI-BASIC belirtilmiştir; bu komutların hepsinin birer bayt, diğerlerinin ise iki olduğu bir özel karakter kodlaması kullanır . Bu kodlamaya göre puan almak topluluk fikir birliğidir - ayrıntılar için meta.codegolf.stackexchange.com/a/4764/39328 adresine bakınız.
lirtosiast

Oh harika. Teşekkürler Bilginize.
msh210

1
  • bu kusurun cevabını geçmiyor ama sorunun cazibesine karşı koyamadım

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

icra

4

ans =

5

ans =

9    10    11

ans =

13

prensip

  • Sayı dizisi, f (n, l) = 2 ^ l + 2 ^ (l + 1) + .... 2 ^ n anlamına gelen 1'lerin ardışık şeridinin bir sonucudur.

F (n, l), f (n, l) + 2 ^ (l-1) [[l> 1 bu koşulu doğrular; n terimi

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ım, her iki satır arasındaki aralığı (varsa) yazdırır


Düzenleme: ne yazık ki bu daha fazla golf yapmaz ama ben bu fikri işleme başka bir yaklaşım eklemek istedim

Bir mücadele süresinden sonra, bu seri için matematiksel bir temsil bulmayı başardım:

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

= 2 ^ L (2 ^ k-1)

puanı = 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 bayt

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 girişi üzerine genişleyen (aslında büzüşen) 01, ikili göstergedeki düzen üzerinde xnor ifadesinden yararlanarak , ancak sadece standart fonksiyonlar ve bir miktar titreme kullanarak.

Ungolfed versiyonu:

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

İç döngü , iki bit kaldığı sürece sağa doğru kaydırılarak iikili kalıbı tarar . yazdırılan karakter sayısını döndürür, dolayısıyla hiçbir zaman olmaz , bu nedenle iç döngü sınaması bir ifadeye duyulan gereksinimden kaçınarak başarısız olur .01xprintf0printfbreak

C ++, 129 128 bayt

Aynı fikri uyarlayarak, C ++ değişkeni burada:

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

Teknik olarak, ben yapmalıdır ibir long long64 bitlik çalışmasını sağlamak ve kadar hesaplamak için 2^32fazladan 5 bayt için, ama modern platformlar 64 bitlik tam sayılar var.


1

JavaScript ES6, 60 bayt

kod

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

Çevrimiçi deneyin!

açıklama

[...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’de yapılan uyarılarla derlenir) - 103

Bu, printf dışında hiçbir kütüphane işlevini kullanmaz. Buna bakarak standartlara uygun hale getirmek veya UB'den kaçınmak için hiçbir çaba sarf edilmediğini görebilirsiniz.

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

Uyumlu hale getirmek için, stdio.h dahil olmak üzere mümkün olduğunca küçük yapma ruhuna aykırı birçok şey yapmanız gerekecektir.

Herhangi birinin daha kısa yapmak için önerileri varsa, lütfen bana bildirin.


0

PowerShell, 80 bayt

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

0

Python, 44 Bayt

Tamam, muhtemelen daha kısa olabilir ama bu benim ilk kod yazarım:

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

Bunun soruyu yanıtladığını düşünün, lütfen yapmazsa, aşağı oy vermeyin, sadece aşağıda neyin yanlış olduğunu yazın.


1
Girmek için girdi ( input()ideal) almak zorundasınız nve sonra 2^n-1süresiz olarak döngü yapmak yerine, sadece saymaya başlamalısınız. Ayrıca, yuvalama için 4 ve 8 yerine 1 ve 2 boşlukları kullanabilirsiniz ve mapliste veya bir anlama kullanımı muhtemelen kodunuzu büyük ölçüde kısaltır.
Mego

0

İyi puanın bir başka farklı matlab cevabı.

matlab 60(57)

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

icra

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

  • Buradaki fikir , - (x) +1'in ikili gösteriminin yalnızca bir oluşumunu içermemesi olan x sayılarını toplamaktır.1

örnek:

0000111reddedildi çünkü ~ x = 1111, ~ x + 1 = 00001bir rakam içeriyor = 1

0100111kabul edilir çünkü ~ x = 1011, ~ x + 1 = 0111birçok 1 içerir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.