ตัวเลขที่วิ่งหลายรอบ


30

งาน

ค้นหาชุดของตัวเลขที่การแสดงเลขฐานสองมีการรัน1อย่างน้อยสองรายการคั่นด้วยอย่างน้อยหนึ่ง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

นี่คือ - คำตอบที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


ฉันคิดว่าคุณพลาด 23 สำหรับ n = 5
xnor

@ xnor คุณถูกต้อง ขอบคุณและใช่แล้วมันทำให้มันไม่เทียบเท่ากับ A094695 อืมมม oeis.org/A101082 vs oeis.org/A166934

@VTCAKAVSMoACE ใช่ หากมีการ\nคั่นและวาง\nบนบรรทัดสุดท้ายการ,คั่นด้วยการ,ต่อท้ายควรยอมรับเช่นกัน Updated

1
อินพุตสามารถอยู่ในรูปแบบรายการได้[1, 2, 3]หรือไม่?
kirbyfan64sos

@ kirbyfan64sos ใช่ Updated

คำตอบ:


7

Pyth, 12 ไบต์

f<2r.BT8U^2Q

ลองออนไลน์

ความคิด

การแสดงเลขฐานสองของจำนวนบวกใด ๆ เริ่มต้นด้วยการวิ่ง1วินาทีตามด้วยอื่น ๆ การสลับการวิ่งของ0วินาทีและ1วินาที หากมีการวิ่งแยกกันอย่างน้อยสามครั้งการวิ่งสองครั้งจะรับประกันว่าจะวิ่ง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'เราก็ต้องตรวจสอบว่าการขยายตัวไบนารีมี

0ที่จะมีทั้งสองวิ่งคนหนึ่งที่อยู่ด้านขวาจะต้องนำหน้าด้วย หากมีการวิ่งเพียงครั้งเดียวก็จะไม่มีผู้นำคนใด0เกิดขึ้น


คำตอบเก่า:

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

การแทนแบบไบ ธ ไพ ธ อนทำงานได้ดีมากที่นี่ bin(9)=='0b10110'เลขฐานสองเป็นลายลักษณ์อักษรเช่น แยกที่'0'ผลลัพธ์ในรายการของ

  • สตริงว่างเปล่าทางด้านซ้ายของค่าเริ่มต้น0ระหว่างสองลำดับต่อเนื่อง0และทางด้านขวาของรอบสุดท้าย0
  • bตามด้วยตัวอักษรนำอย่างน้อยหนึ่งตัว
  • Runs ของ1ที่ไม่ได้นำ

มีสองหมวดหมู่แรกอยู่เสมอ แต่หมวดสุดท้ายมีอยู่เฉพาะในกรณีที่มีการเรียกใช้1ซึ่งไม่มีส่วนนำ'1'และถ้ามีมากกว่าหนึ่ง1ครั้ง ดังนั้นจึงเพียงพอที่จะตรวจสอบว่ารายการมี2องค์ประกอบที่แตกต่างกันมากกว่าหรือไม่

งูหลาม 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, จริง) ที่ใช้จำนวนเต็มและส่งกลับอาร์เรย์

ใช้ regex ไม่/10+1/1อย่างน้อยหนึ่งและจากนั้นอีก0 1@histocrat ชี้ให้เห็นว่าถ้า01มีทุกที่ในสตริงจะต้องมี1ที่ไหนสักแห่งก่อน


1
การใช้สตริงรูปแบบสั้นลงเล็กน้อยที่นี่: /10+1/=~'%b'%x. นอกจากนี้คุณยังสามารถบันทึกอักขระโดยใช้ช่วงแบบรวม ( 0..2**n) เนื่องจาก2**nจะไม่มีการเรียกใช้หลายครั้ง
ประวัติศาสตร์ 24

@histocrat ฮะผมไม่เคยรู้ว่าคุณอาจจะพลิกคำสั่งของสตริงและ regex =~กับ ขอบคุณ!
ลูกบิดประตู

1
เดี๋ยวก่อน regex /01/ก็ใช้ได้เช่นกัน หากมีก01ต้องมี 1 ทางซ้าย
ประวัติศาสตร์ 24

@histocrat โอ้นั่นฉลาด! ที่ช่วยประหยัดอักขระสองตัว
Doorknob

7

จูเลีย43 43ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มและส่งกลับอาร์เรย์ มันใช้กลอุบายของฮิสโตแกต (ใช้ในคำตอบของ Doorknob) ซึ่ง01จะจับคู่ก็ต่อเมื่อมีข้อ 1 ก่อนหน้านี้

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

เคล็ดลับของฮิสโทแคตไม่ใช่ของฉัน :)
Doorknob

@ Doorknob โอ้เฮ้ตอนนี้คุณทั้งสองได้รับเครดิตแล้ว :)
Alex A.

6

Matlab, 79 68 64 59

แนวคิดคือการตีความเลขฐานสองเป็นอาร์เรย์ของศูนย์และเลขศูนย์จากนั้นคำนวณความแตกต่างที่แน่นอนระหว่างเพื่อนบ้านแต่ละคู่ หากเรามีความแตกต่าง 1 ครั้งหรือมากกว่าสองครั้งเราจะต้องวิ่งอย่างน้อยสองครั้ง โปรดทราบว่าวิธีนี้ใช้งานได้หากเราเป็นตัวแทนของเลขฐานสองโดยไม่มีศูนย์นำหน้า

@(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แทนที่จะiผูกมัดสำหรับ 62: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]

ประวัติความเป็นมา:

สิ่งนี้จะแก้ไขข้อผิดพลาด (Switched == and = และ square แทนกำลังสอง) และแทนที่จริงด้วย 2> 1 และเท็จด้วย 1> 2 นอกจากนี้ต้องขอบคุณที่ชี้ให้เห็นว่า 2 ^ x ล้มเหลวเสมอ ขอบคุณ Thomas Kwa และ 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]

แต่เดิม

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

1
ฉันคิดว่าคุณหมายถึงว่า1..(2^x-1)อาจจะเป็น1.. (2^x)ตั้งแต่ 2 ^ x ล้มเหลวเสมอ
lirtosiast

คุณสามารถเปลี่ยนคงที่FalseและTrueมีและ1>2 ไม่จำเป็นต้องวงเล็บรอบ1<2 2^x-1(BTW: คุณพิมพ์ผิด: ต้องเป็น4==1=True)
nimi

ขอบคุณสำหรับการแก้ไขคำผิด มันเป็นช่วงดึกในเวลาของฉัน
Akangka

เทคนิคที่ดีฉันคิดว่าคุณสามารถลด g เป็น: gx | x mod4 == 1 = x> 4 | 2> 1 = g $ x div2
เดเมียน

5

APL, 34 27 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชัน monadic ที่ไม่มีชื่อซึ่งรับค่าจำนวนเต็มทางด้านขวาและส่งกลับอาร์เรย์

คำอธิบาย:

                     }¨⍳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มันในขณะที่ส่วนที่เหลือทั้งหมดก็สวยมากเพียงแค่รายงานตำแหน่งของนิพจน์ regex ที่ตรงกันและพิมพ์ไปยัง STDOUT โดยคั่นด้วย ช่องว่าง


ฉันคิดว่าตัวคั่นเริ่มต้นสำหรับcatเป็นช่องว่างดังนั้นคุณสามารถละเว้นได้,sep=","ทั้งหมดประหยัด 7 ไบต์
Alex A.

@AlexA ใช่ฉันจะใช้ช่องว่างที่นี่เป็นกันยายนได้หรือไม่? ฉันไม่แน่ใจ
David Arenburg

1
OP พูดถึงตัวคั่นที่คุณเลือกดังนั้นฉันคิดว่าพื้นที่ดูสมเหตุสมผลพอสมควร :)
Alex A.

สิ่งนี้ต้องการฟังก์ชั่นของแมวหรือไม่? ไม่ว่าจะเป็นมันเอาท์พุทจะถูกคั่นด้วยแท็บ ตัวนับซ้ายเป็นส่วนหนึ่งของ UI หากคุณเขียนลงในไฟล์สิ่งนี้จะไม่รวมอยู่ด้วยดังนั้นจึงไม่ใช่ส่วนหนึ่งของเอาต์พุต
freekvd

@fanvd โดยที่ไม่มีมันจะไม่พิมพ์ไปยัง STDOUT สิ่งที่เกี่ยวกับกฎโง่ ๆ ของเว็บไซต์นี้
David Arenburg

4

CJam, 14

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

สั้นลง 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" ปรากฏในการแทนเลขฐานสองของตัวเลขต้องมีทำเครื่องหมายการเกิดขึ้นครั้งที่สองของตัวเลข "1"

แข็งแรงเล่นกอล์ฟ:

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
}

เอาต์พุตของโปรแกรม (จำได้ว่าตัวคั่นต่อท้ายเป็นที่ยอมรับ):

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ตัวแปรตัวนับใช่ไหม
ข้อบกพร่อง

ประเภทจำนวนเต็มทั้งหมดใน Java ไม่ได้ลงนาม ในการทำงานกับจำนวนเต็มบวก 32 บิตlongจำเป็นต้องมี 64 บิต นอกจากนี้การใช้intจริงจะเพิ่มขนาดของรหัสเนื่องจากการอ้างอิงIntegerระดับ wrapper ซึ่งจะแยกจำนวน ฉันคิดว่าสถานที่ที่จะประหยัดพื้นที่น่าจะเป็น regex แต่การทดสอบของฉันแสดงให้เห็นว่าฉันต้องมีผู้นำและตามมา.*

โอ้ใช่ แต่ฉันคิดว่าคุณสามารถใช้Longกระดาษห่อหุ้มด้วยได้intหรือไม่ (ไม่ใช่ในกรณีนี้ แต่โดยทั่วไปแล้ว)
ข้อบกพร่อง

ใช่intจะส่งเสริมให้เมื่อใช้เป็นพารามิเตอร์ด้วยlong Longในกรณีนี้แม้ว่าจะมีไม่ได้จริงๆวิธีการใช้งานใด ๆintเนื่องจากการบิตเครื่องหมายและมีความยาวมากกว่าInteger Longถึงกระนั้นฉันได้พบบางวิธีที่จะบีบพื้นที่พิเศษบางส่วนออกจากภาษาเป็น verbose เป็น 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;}

ลองออนไลน์!

12 ไบต์ขอบคุณด้วย @ceilingcat!

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 = 12 ^ number_of_bits เราตั้งค่าxให้iเลื่อนไปทางขวาจนกว่าเราจะลบบิตศูนย์ต่อเนื่องทั้งหมดที่จุดสิ้นสุดที่สำคัญที่สุด จากนั้นเราเลื่อนไปxทางขวาจนกว่าเราจะลบ 1 บิตที่ต่อเนื่องกันทั้งหมดที่จุดสิ้นสุดที่มีนัยสำคัญน้อยที่สุด หากผลลัพธ์ยังไม่เป็นศูนย์เราจะพบการแข่งขัน


2
ฉันต้องบอกว่าฉันชอบจริง ๆ ว่ามีคนทำคำตอบการจัดการเล็กน้อยมากกว่า "แปลงเป็นสตริงและ regex"

@MichaelT ฉันสงสัยว่ามี olution สั้น ๆ โดยใช้การดำเนินการ bitwise ดั้งเดิมเท่านั้น
lirtosiast

@ThomasKwa ที่อาจจะมีอะไรบางอย่างที่เป็นรหัสความท้าทาย

น่าสนใจ คุณยังสามารถเขียนการทดสอบเช่นนี้if (popcount(i ^ (i*2))>3)และขยาย popcount () ไปยังชุดของ AND ระดับบิตและการดำเนินการ shift แต่นั่นจะส่งผลให้รหัสยาวมาก
G. Sliepen

1
@ThomasKwa y = x | (x-1) เพื่อเปิดบิตขวาสุด 0 ทั้งหมด จากนั้น z = y & (y + 1) เพื่อปิด 1 บิตต่อท้ายทั้งหมด ถ้า z ไม่ใช่ศูนย์แสดงว่าหมายเลขเดิมมีการวิ่งมากกว่าหนึ่งครั้ง
เล่นแร่แปรธาตุ


3

K5, 19 ไบต์

สิ่งนี้ดำเนินไปตามหลักการที่คล้ายคลึงกับโซลูชันของเดนนิส แต่มีบิวอินน้อยลงเพื่อใช้ประโยชน์จาก

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

ขั้นแรกให้สร้างชุดของไบนารี x-tuples ( +!x#2) จากนั้นสำหรับแต่ละ tuple พบว่าทุกจุดที่ตัวเลขไม่ตรงกับที่ผ่านมาหากเราปฏิบัติต่อองค์ประกอบ -1 ของรายการเป็น 0 เพื่อจุดประสงค์นี้ ( ~0=':') โซลูชันของเราเป็นที่ที่สองน้อยกว่าผลรวมของการนับการวิ่งแต่ละครั้ง ( &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

Pip, 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จะมีเฉพาะในสถานที่ที่ตัวเลขเปลี่ยนจากศูนย์เป็นหนึ่งหรือหนึ่งเป็นศูนย์ ดังนั้นจะต้องมีอย่างน้อยสามตัวiเพื่อสลับไปมาระหว่างศูนย์ถึงหนึ่งครั้ง count_onesค้นหาจำนวนของจากนั้นfilterลบจำนวนที่มีไม่เพียงพอ


2

C ++, 197 188 141 bytes

หมายเหตุ: นี้ถูกเขียนและทดสอบโดยใช้ MSVC ++ 2013 ปรากฏว่า#includeไอเอ็นจี<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);}}

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 (โดยทั่วไป) หรือ','เนื่องจากตัวคั่นใด ๆ นั้นใช้ได้และตัวต่อท้ายนั้นใช้ได้
G. Sliepen

แทนที่จะ regexs strstr(c,"01")คุณก็สามารถทำมันได้ด้วย
G. Sliepen

@ G.Sliepen ขอบคุณ! ฉันเพิ่งคัดลอกโซลูชัน Java ของฉันไปแล้วแปลงเป็น C ++ แต่วิธีแก้ไขง่ายๆมักจะดีที่สุด ฉันควรทำสิ่งที่คล้ายกับ Java ตอนนี้

ข้อผิดพลาดเล็ก ๆ สองข้อ: 1<<atol(b[1])ควรเป็น1L<<atol(b[1])อย่างอื่นผลลัพธ์ของนิพจน์นั้นจะเป็นจำนวนเต็ม 32 บิตที่ได้รับการรับรองซึ่งหมายความว่ารหัสจะทำงานได้ถึง 2 ^ 30 เท่านั้น printf ควรใช้%ldเพื่อพิมพ์ตัวเลขระหว่าง 2 ^ 31 และ 2 ^ 32 อย่างถูกต้อง
G. Sliepen

2

Perl 5, 55 53 49 47 41 ไบต์

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

54 52 48 46 40 ไบต์บวกหนึ่งสำหรับธงแทน-E-e


ขอบคุณxnorสำหรับคำแนะนำเกี่ยวกับการใช้/01/แทน/10+1/ซึ่งบันทึกสองไบต์

ขอบคุณเดนนิสสำหรับคำแนะนำในการใช้<>แทน$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 อีกข้อสำหรับคำถามนี้เกี่ยวกับความเป็นไปได้ของการใช้ตัวดำเนินการระดับบิตง่าย มันทำงานได้โดยการสลับ 0 บิตต่อท้ายทั้งหมดเป็น 1 ในคำสั่ง i | (i-1) จากนั้นมันจะสลับทั้งหมด 1 บิตเป็น 0 โดยใช้ k & (k + 1) สิ่งนี้จะส่งผลให้ศูนย์ถ้ามีเพียงหนึ่งวิ่งและไม่ใช่ศูนย์อย่างอื่น ฉันตั้งสมมติฐานว่ายาวเป็น 64- บิต แต่สามารถแก้ไขได้ด้วยค่าใช้จ่ายสามไบต์โดยใช้ int64_t แทน

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_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 bytes

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

I think this could be golfed a bit.


@mbomb007 I tried that, it didn't work.
Loovjo

@mbomb007 Are you using Python 2.7?
Loovjo

Does it matter which version of 2.7? I run it on repl.it (2.7.2) and it doesn't work, but Ideone (2.7.10) does. It might just be a bug in repl.it though, not necessarily a version difference.
mbomb007

Your program incorrectly prints 0 in the output.
mbomb007

Also print[i for i in range(2**input())if[n[:1]for n in bin(i)[2:].split("0")].count("1")-1] is two bytes shorter. But with the fix for 0 would be the same length (89), if you use range(1,2**input()).
mbomb007

1

TI-BASIC, 34 32 30 bytes

For a TI-83+/84+ series calculator.

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

For a number to contain two runs of 1s, it must contain two 10s when we tack a trailing zero onto the binary representation.

Rather than generate the binary representation and check for a 10, we test pairs of bits mathematically by using remainder by 4 (int(4fPart(), which will give 2 where there is a 10. Because we don't care about order, randIntNoRep( is the shortest way to generate the list of exponents.

We use log( to check for the number of runs:

  • If there are at least 2 runs, then the log( is positive, and the number is displayed.

  • If there is one run, then the log( is 0, and the number is not displayed.

  • If there are no runs (which first happens at X=2^Ans), then log( throws an ERR:DOMAIN, stopping the output at exactly the right point.

We use e^(Ans as the ending argument of the For( loop—it's always greater than 2^Ans, but e^( is a single token, so it's one byte shorter.

Input/output for N=4:

4:prgmRUNSONES
               5
               9
              10
              11
              13

Then the calculator throws an error; the error screen looks like this:

ERR:DOMAIN
1:Quit
2:Goto

When 1 is pressed, the home screen is displayed again:

4:prgmRUNSONES
               5
               9
              10
              11
              13
           Error

TI calculators store all numbers in a BCD float with 14 digits of precision, not an int or binary float. Therefore, divisions by powers of two greater than 2^14 may not be exact. While I have verified that the trickiest numbers, 3*2^30-1 and 2^32-1, are handled correctly, I have not ruled out the possibility of rounding errors. I would however be surprised if there were errors for any input.


How do you count 32 bytes? It looks like 70 to me (including the newlines).
msh210

TI-BASIC is tokenized; it uses a proprietary character encoding in which all of these commands are one byte each and the others are two. It is the community consensus to score by this encoding-- see meta.codegolf.stackexchange.com/a/4764/39328 for details.
lirtosiast

Oh, cool. Thanks FYI.
msh210

1
  • this doesnt beat flawr's answer but i couldnt resist the charm of the question

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

execution

4

ans =

5

ans =

9    10    11

ans =

13

principle

  • The series of numbers are a result of consequent strip of 1's, which does mean f(n,l)=2^l+2^(l+1)+....2^n

Any number taken from the interval ]f(n,l),f(n,l)+2^(l-1)[ where l>1 verifies this condition, so the outcome is a result of the negation of this series in terms of 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

My program prints the range between each two lines (if exists)


Edit: unfortunately that doesnt make it golfed more but i wanted to add another approach of proceding this idea

after a period of struggle i succeded to find a mathematical representation for this series which is:

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

=2^l(2^k-1)

score=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 bytes

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

Expanding (actually contracting) on G.Sliepen entry, taking advantage of xnor remark on the 01 pattern in the binary representation, but using only standard functions and some bit twiddling.

Ungolfed version:

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

The inner loop scans i for the binary pattern 01 by iteratively shifting x to the right as long as it has 3 bits left. printf returns the number of characters printed, hence never 0, so the inner loop test fails after the printf, avoiding the need for a break statement.

C++, 129 128 bytes

Adapting the same idea, the C++ variant is here:

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

Technically, I should make i a long long to ensure 64 bit operation and compute upto 2^32 for an extra 5 bytes, but modern platforms have 64 bit ints.


1

JavaScript ES6, 60 bytes

Code

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

Try it online!

Explanation

[...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 (sort of - compiles with warnings in GCC) - 103

This uses no library functions of any kind except printf. You can see by looking at this that no effort has been spared to make it standards compliant or avoid 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;}}

To make it compliant you would need to do lots of things like including stdio.h which would be against the spirit of making it as small as possible.

If anyone has suggestions for making it shorter please let me know.



0

Python, 44 Bytes

Okay, this could probably be shorter but it's my first codegolf:

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

Think this answers the question, please don't down vote if it doesn't, just post whats wrong with it below.


1
You need to take input (input() is ideal) to get n, and then only count up to 2^n-1, rather than looping indefinitely. Also, you can use 1 and 2 spaces for the nesting, rather than 4 and 8, and using map or a list comprehension would probably shorten your code tremendously.
Mego

0

another different matlab answer of good score.

matlab 60(57)

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

execution

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

  • The idea is picking up numbers x where the binary representation of -(x)+1 doesnt contain only one occurence of 1

example:

0000111 is rejected because ~x=1111,~x+1=00001 contains one digit=1

0100111 is accepted because ~x=1011,~x+1=0111 contains many 1's

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.