Số nhị phân thứ mười


28

Nếu bạn biểu thị một số nguyên dương trong nhị phân không có số 0 đứng đầu và thay thế mọi số 1bằng a (và mọi số 0bằng a ), thì tất cả các dấu ngoặc có khớp không?

Trong hầu hết các trường hợp họ sẽ không. Ví dụ, 9 là 1001nhị phân, trở thành ())(, trong đó chỉ có hai dấu ngoặc đơn đầu tiên khớp.

Nhưng đôi khi họ sẽ phù hợp. Ví dụ: 44 là 101100nhị phân, trở thành ()(()), trong đó tất cả các dấu ngoặc đơn bên trái có dấu ngoặc đơn bên phải.

Viết một chương trình hoặc chức năng mà mất trong một dương mười cơ sở số nguyên và in hoặc lợi nhuận một truthy giá trị nếu phiên bản nhị phân ngoặc của số có tất cả dấu ngoặc đơn phù hợp. Nếu không, hãy in hoặc trả lại một falsy giá trị.

Mã ngắn nhất tính bằng byte thắng.

Trình tự OEIS liên quan.

Ví dụ thực tế dưới 100:

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

Ví dụ giả dưới 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
Có một chuỗi cho tất cả mọi thứ ...
Arcturus

Câu trả lời:


8

TeaScript , 9 byte 16 18 20 22 24

Đã lưu 2 byte nhờ @ETHproductions

!x÷W(n,¢)

Ái chà. Đó là ngắn. Sử dụng phương pháp của @ xnor. Điều này sẽ sử dụng hàm thay thế đệ quy ( W) sẽ thay thế tất cả 10bằng ()không có gì. Nếu chuỗi trống nó được cân bằng.


Sử dụng một phiên bản TeaScript được thực hiện sau khi thử thách này được đăng, điều này có thể trở thành 7 byte:

!x÷W(n)

Bị đánh cắp

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

Giải trình

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

1
Xuất sắc! Hai điều có thể giúp ích: 1) Nếu nó giả khi đi lên, nó đã bị sai lệch, vì vậy bạn không cần phải có dấu hiệu đầu tiên. 2) Tôi tin ~--clà sai lầm trong chính xác kịch bản tương tự như c--.
Sản phẩm ETH

@ETHproductions tuyệt vời, cảm ơn! Bây giờ tôi xuống còn 16 byte
Downgoat

13

Bình thường, 10 byte

!uscG`T.BQ

Hãy thử bộ thử nghiệm này trong Trình biên dịch Pyth.

Làm thế nào nó hoạt động

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

Tôi đã đưa ra tương đương !u:G`Tk.BQ. Có thể dễ hiểu hơn.
orlp

Vâng, đó chắc chắn là một lựa chọn tự nhiên hơn.
Dennis

8

Python2, 87 byte

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

Một thực hiện khủng khiếp mà lạm dụng lỗi cú pháp.


3
Đây là mã golf. Kinh khủng là một lời khen.
corsiKa

8

JavaScript (ES6), 55 54 51 byte

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

Đã lưu byte nhờ @ Vɪʜᴀɴ@xsot !

Giải trình

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
Bạn có thể lưu hai byte bằng cách loại bỏ không cần thiết f=. Bạn cũng có thể sử dụng +cthay vì sử dụng c|0cho một số nguyên. Bạn cũng có thể sử dụng (+c?d++:d--)thậm chí còn ngắn hơn
Downgoat

@ Vɪʜᴀɴ OK. Có một số loại hướng dẫn khi tôi cần sử dụng f=? Bởi vì rất nhiều câu trả lời JavaScript khác trên trang web đặt tên cho các chức năng của chúng.
dùng81655

1
Thông thường bạn chỉ cần đặt tên cho hàm nếu thử thách yêu cầu bạn thực hiện. Mặt khác, nó an toàn để giả định rằng các chức năng không tên là tốt.
Alex A.

Trong Firefox, chạy cái này cho 11, sẽ trả về truekhi nó sẽ quay trở lạifalse
Downgoat

2
Tôi không biết javascript, nhưng tôi đã cố gắng cắt một vài byte và nó hoạt động trong chrome:n=>![...n.toString(d=2)].some(c=>(d+=c*2-1)<2)*d==2
xsot

7

Python 2, 45 byte

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

Một hàm đệ quy. Đọc các chữ số nhị phân ntừ cuối, giữ một imức độ lồng nhau hiện tại của các parens. Nếu nó rơi xuống dưới 0, từ chối. Khi chúng tôi đạt đến điểm bắt đầu, hãy kiểm tra xem số lượng có phải không 0.

Trên thực tế, chúng tôi bắt đầu đếm vào i=1để dễ dàng kiểm tra xem nó có rơi xuống không 0. Trường hợp thành công duy nhất là n==0i==1, được kiểm tra với n<i<2. Chúng tôi buộc kiểm tra này xảy ra nếu n==0, hoặc nếu irơi vào 0, trong trường hợp đó, nó tự động thất bại.

frageum đã lưu hai byte bằng cách cấu trúc lại các trường hợp không đệ quy có bất đẳng thức với ngắn mạch.


3
Cần lạm dụng có điều kiện hơn. f=lambda n,i=1:n>0<i*f(n/2,i+(-1)**n) or n<i<2, ít nhất, tiết kiệm 1.
frageum

6

CJam, 11 byte

ri2b"}{"f=~

Đây là một điều ô uế: Đối với các số có thể xác định được, nó sẽ in một hoặc nhiều khối. Đối với các số không có giá trị, nó sẽ bị sập mà không in bất cứ thứ gì sang STDOUT. Nếu bạn thử trực tuyến trong trình thông dịch CJam , hãy nhớ rằng nó không phân biệt giữa STDOUT và STDERR.

Vì các chuỗi không trống / trống là trung thực / giả mạo trong CJam và đầu ra được in luôn là một chuỗi, nên có thể tuân thủ các quy tắc. Với chi phí gia tăng của 3 byte hơn, với tổng số 14 byte , chúng tôi thực sự có thể để lại một truthy hoặc falsy chuỗi trên stack sẽ được in:

Lri2b"}{"f=~]s

Điều này vẫn gặp sự cố đối với các số không thể xác định được, được cho phép theo mặc định .

Chạy thử

$ 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
{{{}}}

Làm thế nào nó hoạt động

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 byte

ri2bs_,{As/s}*!

Hãy thử fiddle này trong trình thông dịch CJam hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc .

Làm thế nào nó hoạt động

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
chết tiệt, bạn hầu như không đánh bại tôi một lần nữa ....
GamrCorps

6

Python, 51 byte

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

Một chức năng ẩn danh. Đánh giá một biểu thức trông giống như

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

Mỗi thay thế loại bỏ tất cả 10, tương ứng với (). Sau khi tất cả các thay thế đã được thực hiện, hàm sẽ trả về cho dù những gì còn lại chỉ là tiền tố nhị phân 0b. Nó thay vì đủ để thực hiện nthay thế, vì một ksố-chữ số mất hầu hết k/2các bước và giá trị của nó là nhiều nhất 2**k.


4

Hồng ngọc, 40

->i{n='%0b'%i;1while n.slice!'10';n<?0}

Thao tác chuỗi đơn giản. Giọt '10' cho đến khi không còn lại.


4

Nghiêm túc , 17 byte

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

Đầu ra 0cho sai và 1đúng. Hãy thử trực tuyến .

Giải trình:

,      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 byte

Japt là phiên bản rút gọn của Ja vaScri pt . Thông dịch viên

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

Điều này nhắc nhở tôi rằng Japt vẫn chưa đi được bao xa so với TeaScript. Sau khi cải tiến trình thông dịch trong vài ngày tới, tôi muốn thêm vào các ký tự "phím tắt" như Vɪʜᴀɴ.

Làm thế nào nó hoạt động

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

Ngay sau thử thách này, @ Vɪʜᴀɴ (hiện được gọi là @Downgoat) đã giúp tôi triển khai tính năng thay thế đệ quy, như Wtrong câu trả lời của TeaScript. Điều này có nghĩa là thử thách này hiện có thể được thực hiện chỉ trong 5 byte:

!¢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).

Kiểm tra nó trực tuyến!


3

Toán học, 49 byte

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

Tôi không thể đọc Mathicala. Xin giải thích? :)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Chuyển đổi số thành cơ sở 2 (dưới dạng danh sách), sau đó liên tục xóa 1,0khỏi danh sách và kiểm tra xem kết quả có phải là danh sách trống không.
alephalpha


3

C ++, 104 94 byte

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

Chạy với trình biên dịch này , phải chỉ định đầu vào tiêu chuẩn trước khi chạy.

Giải trình

  • Khai báo bên ngoài chính khởi tạo thành 0.
  • Đọc một số thập phân ngầm chuyển thành nhị phân, bởi vì đây là một máy tính.
  • Chúng tôi kiểm tra bit / ngoặc đơn từ phải sang tráin>>=1.
  • c+=n&1?-1:1giữ số lượng dấu ngoặc đơn mở ).
  • n&c>=0 dừng khi chỉ các số 0 đứng đầu hoặc dấu ngoặc đơn đóng nhiều hơn số mở.

3

Haskell, 49 46 byte

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

Ví dụ sử dụng: f 13->False .

Tôi đang theo dõi mức độ lồng nhau lnhư nhiều câu trả lời khác. Tuy nhiên, trường hợp "cân bằng" được đại diện bởi 1, vì vậy trường hợp "hơn- )-than- (" là0 .

PS: tìm thấy sự điều chỉnh mức lồng nhau l+(-1)^ntrong câu trả lời của xnor .


signumvẻ như quá phức tạp, làm thế nào chỉ _#0=1<0?
xnor

@xnor: vâng, cảm ơn.
nimi

Tại sao không l>0thay thế l==1?
Michael Klein

@MichaelKlein: vì chỉ l==1cân bằng. Nếu l>1, dấu ngoặc đơn không cân bằng.
nimi

@nimi Tôi hiểu rồi, tôi đã hiểu sai về cách thức hoạt động của nó
Michael Klein

3

Python 2, 60 57 56 55 53 52 50 49 byte

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

Cảm ơn xnor vì đã lưu hai byte và frageum vì đã đưa số byte cuối cùng lên 49!

Giải trình

Số đầu vào n, được xử lý từ bit quan trọng nhất của nó. ilà một bộ đếm theo dõi số 0 và 1. Lưu ý rằng nó được khởi tạo 1để lưu một byte. Vòng lặp sẽ hủy bỏ trước khi nđạt 0 nếu số lượng 1 vượt quá số 0 (i<=0 ).

Để các dấu ngoặc được cân bằng, cần có hai điều kiện:

  • Số 0 và 1 là bằng nhau (nghĩa là i==1)
  • Số lượng 1 không bao giờ vượt quá số 0 trong quá trình này (nghĩa là vòng lặp không hủy bỏ quá sớm n==0). Chỉnh sửa: Tôi nhận ra rằng điều kiện này không cần thiết vì iphải không tích cực nếu n!=0điều kiện trước đó là đủ.

Nếu inlà không âm thì i==n==0i+n==0.
orlp

icó thể âm tính nếu vòng lặp hủy bỏ sớm.
xsot

Thật ra, i|n==0nên làm việc luôn.
orlp

Đề nghị tuyệt vời, dòng đó bây giờ tốt hơn.
xsot

while i*nnên hoạt động
xnor

3

JavaScript ES5, 118 87 85 82 77 byte

Kỹ thuật thú vị theo ý kiến ​​của tôi. Trừ đi toàn bộ rất nhiều, nhờ @ETHproductions và @NotthatCharles

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

JavaScript ES6, 77 57 56 54 byte

-21 byte để sản xuất ETH.

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

Tôi thích bản dịch sang dấu ngoặc đơn. Tuy nhiên, nếu bạn để nó là 1 và 0, thì ngắn hơn một chút:function p(x){x=x.toString(2);r=/10/;while(x.search(r)>=0){x=x.replace(r,"")}return!x}
Sản phẩm ETH

@ETHproductions Điểm tốt! Tôi nghĩ rằng tôi sẽ để lại mã khác ở phía dưới, tôi thực sự thích thuật toán ^ _ ^ Cảm ơn bạn!
Conor O'Brien

Phiên bản ES6 vẫn có thể được chơi thành một bó: x=>([...x=x.toString(2)].map(_=>x=x.replace(/10/,"")),!x)Bí quyết là di chuyển vòng lặp while thành một .map, vì không bao giờ có nhiều hơn 10 'trong một đầu vào so với chiều dài của nó.
Sản phẩm ETH

@ETHproductions Cảm ơn một lần nữa ^ _ ^ Thủ thuật hay với map.
Conor O'Brien

Không có vấn đề gì :) BTW, một byte khác có thể được lưu bằng thủ thuật edc65 sử dụng mọi lúc: x=>[...x=x.toString(2)].map(_=>x=x.replace(/10/,""))&&!xIDK nếu nó có thể ngắn hơn mặc dù.
Sản phẩm ETH

2

D, 209 170 byte

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

Điều này thực hiện chính xác những gì nó phải làm mà không có bất kỳ bổ sung hoặc lợi ích.


2

C, 67 byte

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

Khá nhiều cổng trình trăn của tôi.


2

Prolog, 147 byte

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).

Làm thế nào nó hoạt động

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

Chuyển đổi số thập phân N thành biểu diễn nhị phân dưới dạng danh sách (đảo ngược). Ý nghĩa:

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

Sau đó:

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

Truy xuất trên danh sách [H | T] tăng N nếu phần tử đầu bằng 0 nếu không thì giảm.
Nếu N tại bất kỳ điểm nào trở thành âm hoặc nếu N cuối cùng không phải là 0 trả về false, thì khác đúng.

Cắt trong

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

Có phải để ngăn chặn quay lui và tìm giải pháp không nhị phân cho b (N, [N])

Thử nghiệm
Hãy thử trực tuyến tại đây
Chạy với một truy vấn như:

p(42).

2

PowerShell, 106 byte

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

Sẽ không chiến thắng bất kỳ cuộc thi dài nhất nào, đó là điều chắc chắn. Nhưng này, ít nhất nó đang đánh bại Java?

Sử dụng lệnh gọi .NET rất dài [convert]::ToString($a,2)để chuyển đổi số đầu vào của chúng tôi thành một chuỗi đại diện cho các chữ số nhị phân. Chúng tôi sau đó lặp vòng qua chuỗi đó với 1..$b.length|%{..}. Mỗi vòng lặp, nếu chữ số của chúng tôi là một 1(được đánh giá %2thay vì -eq1lưu một vài byte), chúng tôi sẽ tăng bộ đếm của chúng tôi; khác, chúng tôi giảm nó. Nếu chúng ta từng đạt đến tiêu cực, điều đó có nghĩa là có nhiều )hơn (gặp phải cho đến nay, vì vậy chúng ta đầu ra 0exit. Khi chúng ta đi qua vòng lặp, $clà một 0hoặc một số >0, vì vậy chúng ta lấy logic - không phải !của nó, mà sẽ nhận được đầu ra.

Điều này có nghĩa là không thể xuất hiện 0nếu các parens không khớp vì chúng ta có nhiều hơn ), nhưng xuất ra Falsenếu các parens không khớp vì chúng ta có nhiều hơn (. Về cơ bản chức năng báo cáo giả tương đương, chỉ thú vị. Nếu parens tất cả khớp, đầu ra True.


Được, chắc chắn rồi. (Chà, nếu tôi có thể sửa chữa nghi ngờ dai dẳng rằng tôi đang giải quyết vấn đề sai, tôi sẽ).
TessellatingHeckler

1

GNU Sed (có phần mở rộng eval), 27

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

Sed không thực sự có một ý tưởng xác định về sự thật và chim ưng, vì vậy ở đây tôi khẳng định rằng chuỗi trống có nghĩa là sự thật và tất cả các chuỗi khác có nghĩa là chim ưng.

Nếu điều này không được chấp nhận, thì chúng ta có thể làm như sau:

GNU Sed (có phần mở rộng eval), 44

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

Điều này xuất ra 1 cho sự thật và 0 khác.


1

(ESMin), 21 ký tự / 43 byte

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

Try it here (Firefox only).

Lưu ý rằng điều này sử dụng các biến được xác định trước cho các số (cụ thể là 2 và 0). Có các biến số được xác định trước từ 0 đến 256.

19 ký tự / 40 byte, không cạnh tranh

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

Try it here (Firefox only).

Quyết định thực hiện đầu ra ngầm ... Tuy nhiên, các hình thức đầu ra trước đó vẫn được hỗ trợ, do đó bạn có được một số tùy chọn đầu ra!


bởi vì tất cả mọi người đo bằng số char
giai đoạn

1

Java, 129 131 byte

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

Có lẽ có thể rút ngắn. Giải thích sắp tới. Cảm ơn Geobits đã tắt 4 byte!


Có thể kết hợp int k=0;với int j=0;?
Sản phẩm ETH

Không, j là một biến bên trong trong vòng lặp for và không thể được tham chiếu bên ngoài nó.
GamrCorps

Tuy nhiên int k=0,j=0;for(..., bạn có thể kết hợp theo cách khác: Sau đó, bạn có thể đặt char[]khai báo bên trong trình khởi tạo vòng lặp để lưu dấu chấm phẩy.
Geobits

Vấn đề lớn hơn là điều này mang lại kết quả dương tính giả. Nó trả về true cho 9, 35, 37, 38 chẳng hạn .
Geobits

@Geobits oops, tôi thậm chí không nhận ra rằng, sẽ sửa chữa khi tôi có cơ hội.
GamrCorps

1

C ++, 61 byte

Tôi nghĩ rằng câu trả lời C ++ hiện tại là sai: nó trả về giá trị trung thực cho tất cả các số chẵn, ví dụ 4. Tuyên bố miễn trừ trách nhiệm: Tôi không thể sử dụng trình biên dịch được đề cập, vì vậy tôi đã sử dụng g ++ 4.8.4. Vấn đề nằm ở việc sử dụng toán tử AND nhị phân thay vì logic AND được sử dụng để ngắt sớm khi số lượng dấu ngoặc đóng vượt quá số dấu ngoặc mở. Cách tiếp cận này có thể hoạt động nếu trueđược biểu diễn dưới dạng một từ có mẫu bit hoàn toàn đúng. Trên hệ thống của tôi, và có lẽ hầu hết các hệ thống khác, truetương đương với 1; chỉ một bit là đúng. Ngoài ra, n/=2là ngắn hơn n>>=1. Đây là một phiên bản cải tiến như một chức năng:

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

0

(Rất không cạnh tranh), 6 ký tự / 8 byte

!ïⓑĦⅩ

Try it here (Firefox only).

Tôi đã quyết định xem lại thử thách này sau một thời gian rất dài. Đã trở nên tốt hơn rất nhiều.

Lý do đây là một câu trả lời riêng biệt là vì 2 phiên bản gần như hoàn toàn khác nhau.

Giải trình

Chuyển đổi đầu vào thành nhị phân, thay thế đệ quy 10, sau đó kiểm tra xem kết quả có phải là một chuỗi rỗng không.


0

C # 98 byte

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

mở cho bất kỳ đề nghị. tôi thích cái challange này ngay cả khi nó đã cũ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.