ตัวเลขไบนารีที่แยกไม่ออก


28

หากคุณแสดงจำนวนเต็มบวกบางส่วนในไบนารีโดยไม่มีเลขศูนย์นำหน้าและแทนที่ทุกค่า1ด้วย a (และทุก ๆ0ด้วย a )แล้ววงเล็บทั้งหมดจะตรงกันหรือไม่

ในกรณีส่วนใหญ่พวกเขาจะไม่ ตัวอย่างเช่น 9 อยู่1001ในไบนารีซึ่งกลายเป็น())(โดยที่วงเล็บสองรายการแรกเท่านั้นที่ตรงกัน

แต่บางครั้งพวกเขาจะจับคู่ ตัวอย่างเช่น 44 อยู่101100ในรูปของเลขฐานสองซึ่งกลายเป็น()(())โดยที่วงเล็บซ้ายทั้งหมดมีวงเล็บขวาตรงกัน

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

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ลำดับ OEIS ที่เกี่ยวข้อง

ตัวอย่างความจริงต่ำกว่า 100:

2, 10, 12, 42, 44, 50, 52, 56

ตัวอย่างเท็จต่ำกว่า 100:

1, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 46, 47, 48, 49, 51, 53, 54, 55, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99


10
มีลำดับสำหรับทุกสิ่ง ...
Arcturus

คำตอบ:


8

TeaScript , 9 ไบต์ 16 18 20 22 24

บันทึก 2 ไบต์ด้วย @ETHproductions

!x÷W(n,¢)

ว้าว นั่นสั้น ใช้แนวทางของ @ xnor นี่จะใช้ฟังก์ชันแทนที่แบบเรียกซ้ำ ( W) ซึ่งจะแทนที่ทั้งหมด10เท่ากับ()ไม่มีอะไร หากสตริงว่างเปล่ามันจะสมดุล


การใช้ TeaScript รุ่นที่สร้างขึ้นหลังจากมีการโพสต์ความท้าทายนี้อาจกลายเป็น7 ไบต์:

!x÷W(n)

Ungolfed

!xT(2)W(n,``)

คำอธิบาย

!      // NOT, returns true if empty string, else false
 xT(2)   // To binary
 W(n,``) // n is 10, reclusive replaces 10 or (), with nothing.

1
ยอดเยี่ยม สองสิ่งที่อาจช่วยได้: 1) ถ้ามันเป็นเท็จเมื่อขึ้นไปมันก็ล้มเหลวไปแล้วดังนั้นคุณไม่จำเป็นต้องมีเครื่องหมายตัวแรก 2) ผมเชื่อว่า~--cเป็น falsy c--ในตรงสถานการณ์เดียวกับ
ETHproductions

@ETHproductions ยอดเยี่ยมขอบคุณ! ตอนนี้ฉันลงไปที่ 16 ไบต์
Downgoat

13

Pyth, 10 ไบต์

!uscG`T.BQ

ลองชุดทดสอบนี้ใน Pyth Compiler

มันทำงานอย่างไร

              (implicit) Store the evaluated input in Q.
       .BQ    Return the binary string representation of Q.
 u            Reduce w/base case; set G to .BQ and begin a loop:
     `T         Return str(10) = "10".
   cG           Split G (looping variable) at occurrences of "10".
  s             Join the pieces without separators.
              Set G to the returned string.
              If the value of G changed, repeat the loop.
              This will eventually result in either an empty string or a
              non-empty string without occurrences of "10".
!             Return (and print) the logical NOT of the resulting string.

!u:G`Tk.BQฉันมากับเทียบเท่า เข้าใจได้ง่ายขึ้น
orlp

ใช่ว่าเป็นทางเลือกที่เป็นธรรมชาติมากขึ้นอย่างแน่นอน
Dennis

8

Python2, 87 ไบต์

try:exec"print 1,"+"".join(["],","["][int(c)]for c in bin(input())[2:])
except:print 0

การติดตั้งที่ไม่ถูกต้องซึ่งละเมิดข้อผิดพลาดทางไวยากรณ์


3
นี่คือรหัสกอล์ฟ แย่มากเป็นคำชม
corsiKa

8

JavaScript (ES6), 55 54 51 ไบต์

n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2

ไบต์ที่บันทึกไว้ต้องขอบคุณ@ Vɪʜᴀɴและ@xsot !

คำอธิบาย

n=>
  ![...n.toString(    // convert the input to an array of binary digits
    d=2)]             // d = current depth (+2)
      .some(c=>       // iterate through the digits
        (d+=c*2-1)    // increment or decrement the parenthesis depth
          <2          // if the depth goes negative, return false
      )*
        d==2          // if we finished at a depth of 0, return true

1
f=คุณสามารถบันทึกไบต์ที่สองโดยการเอาไม่จำเป็นต้อง นอกจากนี้คุณยังสามารถใช้การใช้+cแทนc|0เป็นเคสให้เป็นจำนวนเต็มได้ คุณสามารถใช้(+c?d++:d--)สิ่งที่สั้นกว่านี้ได้ด้วย
Downgoat

@ Vɪʜᴀɴตกลง มีแนวทางบางอย่างที่ฉันจำเป็นต้องใช้f=หรือไม่? เนื่องจาก JavaScript มีคำตอบอื่น ๆ มากมายเกี่ยวกับชื่อเว็บไซต์
user81655

1
โดยทั่วไปแล้วคุณจะต้องตั้งชื่อฟังก์ชั่นหากความท้าทายต้องการให้คุณทำเช่นนั้น มิฉะนั้นจะถือว่าปลอดภัยว่าฟังก์ชั่นที่ไม่มีชื่อนั้นใช้ได้ดี
Alex A.

ใน Firefox เรียกใช้สิ่งนี้เพื่อ11ผลตอบแทนtrueเมื่อมันควรจะกลับมาfalse
Downgoat

2
ฉันไม่รู้จักจาวาสคริปต์ แต่ฉันพยายามลดจำนวนไบต์ลงไปเล็กน้อยและใช้งานได้ในโครเมี่ยม:n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
xsot

7

Python 2, 45 ไบต์

f=lambda n,i=1:i*n>0<f(n/2,i+(-1)**n)or n<i<2

ฟังก์ชั่นวนซ้ำ อ่านเลขฐานสองของnจากปลายทำให้นับiระดับการทำรังปัจจุบันของ parens หากอยู่ด้านล่าง0ให้ปฏิเสธ เมื่อเราไปถึงจุดเริ่มต้นให้ตรวจสอบว่ามีการนับ0หรือไม่

ที่จริงเราเริ่มต้นนับที่จะทำให้มันง่ายต่อการตรวจสอบว่าได้ลดลงไปi=1 0กรณีที่ประสบความสำเร็จเพียงอย่างเดียวคือขั้วn==0และตรวจสอบด้วยi==1 n<i<2เราบังคับให้การตรวจสอบนี้เกิดขึ้นถ้าn==0หรือiล้มลง0ซึ่งในกรณีนี้มันจะล้มเหลวโดยอัตโนมัติ

feersum บันทึกสองไบต์ด้วยการปรับโครงสร้างกรณีที่ไม่เกิดซ้ำด้วยความไม่เท่าเทียมกับการลัดวงจร


3
ต้องการการละเมิดที่มีเงื่อนไขมากกว่านี้ f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2อย่างน้อยก็ประหยัด 1
feersum

6

CJam, 11 ไบต์

ri2b"}{"f=~

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

เนื่องจากสตริงที่ไม่ว่างเปล่า / ว่างเปล่าเป็นจริง / เท็จใน CJam และเอาต์พุตที่พิมพ์ออกมาจะเป็นสตริงเสมอจึงสอดคล้องกับกฎ ด้วยค่าใช้จ่ายที่เพิ่มขึ้นอีก 3 ไบต์รวมเป็น14 ไบต์เราสามารถทิ้งสตริงความจริงหรือเท็จบนสแต็กที่จะพิมพ์:

Lri2b"}{"f=~]s

สิ่งนี้ยังคงขัดข้องสำหรับหมายเลขที่ไม่สามารถใช้ร่วมกันได้ซึ่งก็คือ ได้รับอนุญาตโดยค่าเริ่มต้น

ทดสอบการทำงาน

$ cjam <(echo 'ri2b"}{"f=~') <<< 52 2>&-; echo
{{}{}}
$ cjam <(echo 'ri2b"}{"f=~') <<< 53 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 54 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 55 2>&-; echo

$ cjam <(echo 'ri2b"}{"f=~') <<< 56 2>&-; echo
{{{}}}

มันทำงานอย่างไร

ri          e# Read an integer from STDIN.
  2b        e# Push the array of its binary digits.
    "}{"f=  e# Replace 0's with }'s and 1's with {'s.
          ~ e# Evaluate the resulting string.
            e# If the brackets match, this pushes one or more blocks.
            e# If the brackets do not match, the interpreter crashes.

CJam, 15 ไบต์

ri2bs_,{As/s}*!

ลองเล่นซอนี้ดูสิในล่าม CJam หรือตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียว

มันทำงานอย่างไร

ri               Read an integer from STDIN.
  2b             Push the array of its binary digits.
    s            Cast to string.
     _,          Push the string's length.
       {    }*   Do that many times:
        As/        Split at occurrences of "10".
           s       Cast to string to flatten the array of strings.
              !  Push the logical NOT of the result.

1
ยี้คุณแทบจะไม่ชนะฉันอีกครั้ง ....
GamrCorps

6

Python ขนาด 51 ไบต์

lambda n:eval("'0b'==bin(n)"+".replace('10','')"*n)

ฟังก์ชั่นที่ไม่ระบุชื่อ หาค่าของนิพจน์ที่ดูเหมือน

'0b'==bin(n).replace('10','').replace('10','').replace('10','')...

แต่ละทดแทนลบทั้งหมดซึ่งสอดคล้องกับ10 ()หลังจากทำการทดแทนทั้งหมดแล้วฟังก์ชันจะคืนค่าว่าสิ่งที่เหลืออยู่นั้นเป็นเพียงส่วนนำหน้าฐานสอง0bหรือไม่ มันมากกว่าพอเพียงที่จะทำให้nการเปลี่ยนตั้งแต่kจำนวน -digit ต้องใช้เวลาอย่างมากที่สุดขั้นตอนและความคุ้มค่ามากที่สุดk/22**k



4

อย่างจริงจัง 17 ไบต์

,;2@¡@`""9u$(Æ`nY

เอาต์พุต0สำหรับ false และ1true ลองมันออนไลน์

คำอธิบาย:

,      get value from stdin
;      dupe top of stack
2@¡    pop a: push a string containing the binary representation of a (swapping to get order of operands correct)
@      swap top two elements to get original input back on top
`""9u$(Æ` define a function:
  ""     push empty string
  9u$    push "10" (push 9, add 1, stringify)
  (      rotate stack right by 1
  Æ      pop a,b,c: push a.replace(b,c) (replace all occurrences of "10" in the binary string with "")
n      pop f,a: call f a times
Y      pop a: push boolean negation of a (1 if a is falsey else 0)

4

Japt 23 ไบต์

Japtเป็นรุ่นสั้นJa vaScri พอยต์ ล่าม

Us2 a e@+X?++P:P-- &&!P

สิ่งนี้ทำให้ฉันนึกถึงว่า Japt ยังไม่ไปเทียบกับ TeaScript แค่ไหน หลังจากปรับปรุงล่ามในอีกไม่กี่วันข้างหน้าฉันต้องการเพิ่มตัวอักษร "ทางลัด" เช่นVɪʜᴀɴ

มันทำงานอย่างไร

       // Implicit: U = input number, P = empty string
Us2 a  // Convert U to base 2, then split the digits into an array.
e@     // Assert that every item X in this array returns truthily to:
 +X?   //  If X = 1,
 ++P   //   ++P. ++(empty string) returns 1.
 :P--  //  Otherwise, P--. Returns false if P is now -1.
&&!P   // Return the final result && !P (true if P is 0; false otherwise).
       // Implicit: output final expression

ไม่นานหลังจากความท้าทายนี้ @ Vɪʜᴀɴ (ตอนนี้รู้จักกันในชื่อ @Downgoat) ช่วยให้ฉันใช้คุณลักษณะการแทนที่แบบเรียกซ้ำเช่นเดียวWกับคำตอบ TeaScript ซึ่งหมายความว่าความท้าทายนี้สามารถทำได้ในเวลาเพียง 5 ไบต์:

!¢eAs  // Implicit: U = input integer, A = 10
 ¢     // Convert U to binary.
  eAs  // Recursively remove instances of A.toString().
!      // Return the logical NOT of the result (true only for the empty string).

ทดสอบออนไลน์!


3

Mathematica, 49 ไบต์

(#~IntegerDigits~2//.{x___,1,0,y___}:>{x,y})=={}&

ฉันอ่าน Mathematica ไม่ได้ ได้โปรด :)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴแปลงตัวเลขเป็นฐาน 2 (เป็นรายการ) จากนั้นนำออก1,0จากรายการซ้ำ ๆและทดสอบว่าผลลัพธ์เป็นรายการว่างหรือไม่
alephalpha


3

C ++, 104 94 ไบต์

#include<iostream>
int n,c;int main(){for(std::cin>>n;n&c>=0;n>>=1)c+=n&1?-1:1;std::cout<<!c;}

รันด้วยคอมไพเลอร์นี้ต้องระบุอินพุตมาตรฐานก่อนเรียกใช้

คำอธิบาย

  • การประกาศภายนอกของการเริ่มต้นหลักเป็น 0
  • การอ่านทศนิยมจะแปลงเป็นไบนารีโดยปริยายเพราะนี่คือคอมพิวเตอร์
  • เราตรวจสอบบิต / วงเล็บขวาไปซ้ายn>>=1เพราะ
  • c+=n&1?-1:1คงจำนวนวงเล็บเปิด)ไว้
  • n&c>=0 หยุดเมื่อเหลือ 0 นำเท่านั้นหรือวงเล็บปิดมากกว่าที่พวกเขาเปิด

3

Haskell, 49 46 ไบต์

0#l=l==1
_#0=2<1
n#l=div n 2#(l+(-1)^n)
f=(#1)

ตัวอย่างการใช้งาน: ->f 13False

ฉันกำลังติดตามระดับการซ้อนlเหมือนคำตอบอื่น ๆ อย่างไรก็ตามกรณี "สมดุล" ถูกแทนด้วย1ดังนั้น "มากกว่า - - )กว่า-( " กรณีคือ0กรณีคือ

PS: พบการปรับระดับการซ้อนl+(-1)^nใน XNOR ของคำตอบ


signumดูเหมือนซับซ้อนเกินไปวิธีการเกี่ยวกับเพียง_#0=1<0?
xnor

@xnor: ใช่ขอบคุณ
nimi

ทำไมไม่ลองl>0แทนl==1ล่ะ
Michael Klein

@MichaelKlein: เพราะl==1มีความสมดุลเท่านั้น ถ้าl>1วงเล็บไม่ถูกปรับสมดุล
nimi

@nimi ฉันเข้าใจฉันตีความผิด ๆ ว่ามันทำงานอย่างไร
Michael Klein

3

Python 2, 60 57 56 55 53 52 50 49 ไบต์

n=input()
i=1
while i*n:i+=1|n%-2;n/=2
print i==1

ขอบคุณ xnor สำหรับการบันทึกสองไบต์และ feersum สำหรับการนับไบต์สุดท้ายถึง 49!

คำอธิบาย

หมายเลขอินพุตnถูกประมวลผลจากบิตที่มีนัยสำคัญน้อยที่สุด iเป็นตัวนับที่ติดตามจำนวน 0 และ 1 โปรดทราบว่ามันถูกเริ่มต้น1เพื่อบันทึกไบต์ การวนซ้ำจะยกเลิกก่อนnถึง 0 ถ้าจำนวน 1 มากกว่าจำนวน 0 (i<=0 )

เพื่อให้วงเล็บมีความสมดุลต้องมีเงื่อนไขสองข้อ:

  • จำนวน 0 และ 1 มีค่าเท่ากัน (เช่นi==1)
  • จำนวน 1 ไม่เคยเกินจำนวน 0 ในระหว่างกระบวนการนี้ (เช่นการวนซ้ำไม่ได้ยกเลิกก่อนกำหนดn==0) แก้ไข: ฉันรู้ว่าเงื่อนไขนี้ไม่จำเป็นต้องเป็นiต้องไม่เป็นบวกหากn!=0ดังนั้นเงื่อนไขก่อนหน้านี้ก็เพียงพอแล้ว

ถ้าiและnเป็นค่าลบแล้วคือi==n==0 i+n==0
orlp

iอาจเป็นค่าลบหากลูปยกเลิกก่อนกำหนด
xsot

ที่จริงi|n==0ควรทำงานเสมอ
orlp

คำแนะนำที่ยอดเยี่ยมบรรทัดนั้นดูดีขึ้นในขณะนี้
xsot

while i*nควรทำงาน
xnor

3

JavaScript ES5, 118 87 85 82 77 ไบต์

เทคนิคที่น่าสนใจในความคิดของฉัน ลบทั้งจำนวนมากขอบคุณ @ETHproductions และ @NotthatCharles

function p(x){x=x.toString(2);while(/10/.test(x))x=x.replace(10,"");return!x}

JavaScript ES6, 77 57 56 54 ไบต์

-21 ไบต์ถึง ETHproductions

x=>[...x=x.toString(2)].map(_=>x=x.replace(10,""))&&!x

ฉันชอบคำแปลในวงเล็บ อย่างไรก็ตามหากคุณปล่อยให้เป็น 1 และ 0 ก็จะดีขึ้นเล็กน้อย:function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
ETHproductions

@ETHproductions จุดดี! ฉันคิดว่าฉันจะปล่อยให้รหัสอื่นที่ด้านล่างฉันชอบอัลกอริทึมจริงๆ ^ _ ^ ขอบคุณเพื่อน!
Conor O'Brien

รุ่น ES6 ยังคงสามารถเล่นกอล์ฟได้พวง: x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)เคล็ดลับคือการย้ายในขณะที่วนเป็น.mapเพราะมีไม่เคย '10 ในอินพุตมากกว่าความยาวของมัน
ETHproductions

@ETHproductions ขอขอบคุณอีกครั้ง ^ _ ^ mapเคล็ดลับที่ดีกับ
Conor O'Brien

ไม่มีปัญหา :) BTW สามารถบันทึกไบต์อื่นได้ด้วยเคล็ดลับ edc65 ใช้ตลอดเวลา: x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xIDK ถ้ามันสั้นลง
ETHproductions

2

D, 209 170 ไบต์

import std.stdio;import std.format;import std.conv;void main(char[][]a){string b=format("%b",to!int(a[1]));int i;foreach(c;b){i+=c=='1'?1:-1;if(i<0)break;}writeln(i==0);}

สิ่งนี้ทำในสิ่งที่ควรทำโดยไม่มีการเพิ่มเติมหรือผลประโยชน์ใด ๆ


2

C, 67 ไบต์

n;main(i){for(scanf("%d",&n);n*i;n/=2)i+=1-n%2*2;putchar(48+!~-i);}

ค่อนข้างเป็นพอร์ตของการส่งหลามของฉัน


2

Prolog, 147 ไบต์

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).
q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.
p(X):-b(X,L),!,q(L,0).

มันทำงานอย่างไร

b(N,[X|L]):-N>1,X is N mod 2,Y is N//2,b(Y,L).
b(N,[N]).

แปลงจำนวนทศนิยม N ให้เป็นไบนารีแทนว่าเป็นรายการ (ย้อนกลับ) ความหมาย:

b(42,[0,1,0,1,0,1]) is true

แล้ว:

q([H|T],N):-N>=0,(H=0->X is N+1;X is N-1),q(T,X).
q([],N):-N=0.

เรียกใช้ซ้ำในรายการ [H | T] เพิ่ม N หากองค์ประกอบส่วนหัวเป็น 0 มิฉะนั้นจะลดลง
ถ้า N ณ จุดใด ๆ กลายเป็นลบหรือถ้า N ในท้ายที่สุดไม่ใช่ 0 คืนเท็จจะเป็นจริง

การกรีดค่ะ

p(X):-b(X,L),!,q(L,0).

มีเพื่อป้องกันการย้อนรอยและค้นหาวิธีแก้ปัญหาที่ไม่ใช่ไบนารีให้กับ b (N, [N])

การทดสอบ
ลองใช้ออนไลน์ได้ที่นี่
เรียกใช้ด้วยแบบสอบถามเช่น:

p(42).

2

PowerShell, 106 ไบต์

param($a)$b=[convert]::ToString($a,2);1..$b.Length|%{if($b[$_-1]%2){$c++}else{$c--}if($c-lt0){0;exit}};!$c

จะไม่ชนะการแข่งขันที่มีความยาวสั้นที่สุดแน่นอน แต่เดี๋ยวก่อนอย่างน้อยก็เต้น Java?

ใช้การเรียก. NET ที่ใช้เวลานานมาก[convert]::ToString($a,2)ในการแปลงหมายเลขอินพุตของเราเป็นสตริงที่แสดงถึงเลขฐานสอง 1..$b.length|%{..}จากนั้นเราจะหาห่วงผ่านสตริงที่มี แต่ละวงถ้าตัวเลขของเราคือ1(ประเมินด้วย%2แทนที่จะ-eq1บันทึกสองสามไบต์) เราจะเพิ่มตัวนับของเรา มิฉะนั้นเราจะลดมันลง ถ้าเรามาถึงเชิงลบหมายความว่ามีคนมากขึ้น)กว่า(ที่พบเพื่อให้ห่างไกลเพื่อให้เราส่งออกและ0 exitเมื่อเราผ่านการวนรอบ$cเป็นจำนวนใด0จำนวน>0หนึ่งดังนั้นเราจึงหาตรรกะไม่ใช่!ของมันซึ่งรับเอาท์พุท

นี้มีมุมแหลมของเอาท์พุท0ถ้า parens จะไม่ตรงกันเพราะเรามีมากขึ้น)แต่การแสดงผลFalseถ้า parens (จะไม่ตรงกันเพราะเรามีมากขึ้น ข้อความเท็จที่เทียบเท่ากับการใช้งานจริงที่น่าสนใจ หาก parens Trueทุกการแข่งขันเอาท์พุท


โอเคแน่นอน (ถ้าฉันสามารถแก้ไขข้อสงสัยจู้จี้ที่ฉันกำลังแก้ไขปัญหาที่ผิดฉันจะ)
TessellatingHeckler

1

GNU Sed (พร้อมส่วนขยาย eval), 27

s/.*/dc -e2o&p/e
:
s/10//
t

Sed ไม่มีความคิดที่ชัดเจนเกี่ยวกับความจริงและความเท็จดังนั้นที่นี่ฉันกำลังอ้างว่าสตริงว่างหมายถึงความจริงและสตริงอื่น ๆ ทั้งหมดหมายถึงความเท็จ

หากสิ่งนี้ไม่เป็นที่ยอมรับเราสามารถทำสิ่งต่อไปนี้:

GNU Sed (พร้อมส่วนขยาย eval), 44

s/.*/dc -e2o&p/e
:
s/10//
t
s/.\+/0/
s/^$/1/

เอาต์พุตนี้ 1 สำหรับความจริงและ 0 เป็นอย่างอื่น


1

𝔼𝕊𝕄𝕚𝕟 (ESMin), 21 ตัวอักษร / 43 ไบต์

ô⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ)

Try it here (Firefox only).

โปรดทราบว่านี่ใช้ตัวแปรที่กำหนดไว้ล่วงหน้ากับตัวเลข (โดยเฉพาะ 2 และ 0) มีตัวแปรตัวเลขที่กำหนดไว้ล่วงหน้าจาก 0 ถึง 256

19 ตัวอักษร / 40 ไบต์ไม่ใช่แบบแข่งขัน

⟦ïßḂ]Ĉ⇀+$?⧺Ḁ:Ḁ‡)⅋!Ḁ

Try it here (Firefox only).

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


because everyone measures by char count
phase

1

Java, 129 131 bytes

boolean T(int i){int j=0,k=0;for(char[]a=Integer.toString(i,2).toCharArray();j<a.length&&k>=0;j++){k+=a[j]=='1'?1:-1;}return k==0;}

Probably can be shortened. Explanation to come. Thanks to Geobits for 4 bytes off!


Is it possible to combine int k=0; with int j=0;?
ETHproductions

No, j is an inner variable in the for loop and cannot be referenced outside it.
GamrCorps

You should be able to combine the other way, though: int k=0,j=0;for(... Then you could put the char[] declaration inside the loop initializer to save a semicolon, too.
Geobits

The bigger problem is that this gives false positives. It returns true for 9, 35, 37, 38, for example.
Geobits

@Geobits oops, I didnt even realize that, will fix when I get a chance.
GamrCorps

1

C++, 61 bytes

I think the current C++ answer is wrong: it returns a truthy value for all even numbers, e.g. 4. Disclaimer: I was not able to use the mentioned compiler, so I used g++ 4.8.4. The problem lies in the use of the binary AND operator instead of the logical AND which is used to break early when the number of closing parentheses exceed the number of opening parentheses. This approach could work if true is represented as a word with an all true bit pattern. On my system, and probably most other systems, true is equivalent to 1; only one bit is true. Also, n/=2 is shorter than n>>=1. Here is an improved version as a function:

int f(int n,int c=0){for(;c>=0&&n;n/=2)c+=n&1?-1:1;return c;}

0

𝔼𝕊𝕄𝕚𝕟 (very noncompetitve), 6 chars / 8 bytes

!ïⓑĦⅩ

Try it here (Firefox only).

I've decided to revisit this challenge after a very, very long time. 𝔼𝕊𝕄𝕚𝕟 has gotten so much better.

The reason this is a separate answer is because the 2 versions are almost completely different.

Explanation

Converts input to binary, recursively replaces instances of 10, then checks if result is an empty string.


0

C# 98 bytes

bool f(int m){int i=0;foreach(char s in Convert.ToString((m),2)){if(s=='1')i+=2;i--;}return i==0;}

open for any suggestions. i like this challange even tho it is old-ish

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