숫자가 2 진입니까?


58

이진 표현에 선행 0을 무시하고 1s보다 많은 s가 포함되어 있으면 정수는 이진 중 0입니다. 예를 들어 1은 이진 표현이 단순하기 때문에 이진-무거 우지 1만 4는 이진 표현이이므로 이진 헤비가 아닙니다 100. 동점 (예 : 2, 이진 표현 10)이있는 경우 숫자는 이진으로 간주되지 않습니다.

양의 정수를 입력으로 받으면 이진이 많은 경우 참 값을 출력하고 그렇지 않으면 거짓 값을 출력합니다.

테스트 케이스

체재: input -> binary -> output

1          ->                                1 -> True
2          ->                               10 -> False
4          ->                              100 -> False
5          ->                              101 -> True
60         ->                           111100 -> True
316        ->                        100111100 -> True
632        ->                       1001111000 -> False
2147483647 ->  1111111111111111111111111111111 -> True
2147483648 -> 10000000000000000000000000000000 -> False

채점

이것은 이므로 각 언어에서 가장 적은 바이트 승리합니다.


언어가 양의 정수로 간주되는 범위를 벗어나기 때문에 마지막 테스트 사례를 처리 할 수 ​​없으면 어떻게됩니까?
musicman523

1
@ musicman523 afaik 표준 I / O 규칙에 따르면 언어의 숫자 형식으로 표현할 수있는 숫자 만 허용하면됩니다. boolfuck과 같은 것을 사용하여 이것을 "게임"하는 것은 표준 허점으로 간주됩니다
Skidsdev

진실 / 거짓 가치가 계산됩니까? 아니면 두 가지 구별되는 가치가 필요합니까?
Outgolfer Erik

@EriktheOutgolfer 모든 가치
Skidsdev

6
일명 A072600 , 이것이 누군가에게 도움이된다면.
dcsohl

답변:


28

x86 기계 코드, 15 14 바이트

F3 0F B8 C1 0F BD D1 03 C0 42 2B D0 D6 C3

이것은 Microsoft의 __fastcall 호출 규칙 (ecx의 첫 번째 유일한 매개 변수, eax의 반환 값, 수신자가 edx를 클로버 할 수 있음)을 사용하는 함수이지만 레지스터에서 인수를 전달하는 다른 호출 규칙에 대해서는 사소하게 수정할 수 있습니다.

255를 true로, 0을 false로 반환합니다.

문서화되지 않았지만 널리 지원되는 opcode를 사용 salc합니다.

아래 분해 :

;F3 0F B8 C1 
  popcnt eax, ecx ; Sets eax to number of bits set in ecx

;0F BD D1
  bsr edx, ecx    ; Sets edx to the index of the leading 1 bit of ecx

;03 C0
  add eax, eax

;42
  inc edx

;2B D0
  sub edx, eax

  ; At this point, 
  ;   edx = (index of highest bit set) + 1 - 2*(number of bits set)
  ; This is negative if and only if ecx was binary-heavy.

;D6
  salc           ; undocumented opcode. Sets al to 255 if carry flag 
                 ; is set, and to 0 otherwise. 

;C3
  ret

온라인으로 사용해보십시오!

덕분에 피터 코르 교체 제안에 lzcntbsr.


좋은. 나는 popcnt대답을보기 위해 아래로 스크롤하기 전에 명백한 한도를 얻었 지만 lzcnt질문에 필요한 유효 숫자 만 다루는 것으로 생각하지 않았습니다 .
Peter Cordes

(일명 ) bsr대신 사용하여 순 저축을 얻는 방법이 있습니까? 32-lzcnt를 제공하므로 대신 사용해야 합니다 . (. 또는 영업 이익은 말했다 ... 어쨌든, AMD도 문서에이 동작을 기존의 모든 Intel 및 AMD 하드웨어 SRC = 0 수정되지 않은 DST를, 잎,하지만 인텔이 정의되지 않은 말한다 긍정적 배제하는 .)lzcntrep bsrsublea0
피터 코르

1
도전은 입력을 양의 정수로 명시 적으로 제한하기 때문에 @Peter와 동일한 줄을 따라 생각하고있었습니다. 실제로 popcntand를 사용하여 초안을 작성 bsr했지만 17 바이트였습니다. 나는 그것이 내가 본 첫 asm 답변 과 비교할 때 꽤 좋았다고 생각 했지만,이 영리한 lea트릭은 그 바지를 능가합니다. 또한 비교에보고 bsf하고 popcnt. 그러나 rep접두사 를 삭제하여 저장할 수있는 1 바이트를 고려 하더라도이 솔루션을 이길 수있는 방법을 찾지 못했습니다 .
코디 그레이

1
salc아니다 등가setc al: 후자 세트 alCF되지 255로 설정하면 1
루슬란

1
의 실제 값은 salc입니다 sbb al, al. 그러나 인코딩 할 때 1 바이트를 절약 할 수 있습니다. 그런데,이 되어 AMD 문서화하고, 널리 니모닉도 인텔의 P6 연산 코드 맵에서 오는, 인텔에서 지원합니다. 따라서 이것은 실제로 사용하기에 매우 안전합니다. 또한, 그 명령을 사용하기 위해 여기에 좋은 개선이 있습니다! 이것은 (1) x86-64 코드를 사용했기 때문에 inc인코딩하는 데 두 배의 시간이 걸리고 (2) 생각 하지 않았기 때문에 원래 초안 salc이 수행 한 작업입니다. 더 먼 길. 한 번만 투표 할 수 없습니다.
코디 그레이

17

젤리 , 5 바이트

Bo-SR

비어 있지 않은 출력 (거친) 또는 빈 출력 (거짓)을 나타냅니다.

온라인으로 사용해보십시오!

작동 원리

Bo-SR  Main link. Argument: n

B      Binary; convert n to base 2.
 o-    Compute the logical OR with -1, mapping 1 -> 1 and 0 -> -1.
   S   Take the sum s. We need to check if the sum is strictly positive.
    R  Range; yield [1, ..., s], which is non-empty iff s > 0.

좋은. 나는 Bo-S가졌지 만, 긍정적 / 비 긍정을 진실 / 거짓으로 바꾸는 1 바이트 원자를 찾을 수 없었습니다 ...
ETHproductions

논리 또는 -1이 있습니까?
Lynn

@Lynn 그렇습니다. 감사.
Dennis


@cairdcoinheringaahing 감사하지만 당시에 Æṃ는 존재하지 않았습니다.
Dennis

14

파이썬 2 , 35 바이트

lambda n:max('10',key=bin(n).count)

온라인으로 사용해보십시오!

기존 답변, 38 바이트

출력 0falsy하고 -2-1같은 truthy

lambda n:~cmp(*map(bin(n).count,'10'))

온라인으로 사용해보십시오!


2
을 반환 할 때 앞에 0 bin이 있으면이 솔루션 문제가 발생합니까?
Shadow

3
@shadow max작동 방식으로 인해 문제가 없습니다 . 동점 인 경우 max는 최대 값을 갖는 iterable의 첫 번째 값을 리턴합니다. 이 코드는이 사실을 사용하여 동점 일 경우 1이 리턴되도록합니다. 이는 0이 추가되어 실제로 0보다 많은 1이 있음을 의미합니다 bin. 여분의 0이 아닌 경우이 방법으로 작성하면 실제로 올바르지 않습니다.
FryAmTheEggman

@FryAmTheEggman 이것은 이전 답변에서도 마찬가지입니다. 둘 다 같을 때 의 cmp수익률 0은 동일합니다
Rod

11

옥타브 , 18 바이트

@(n)mode(de2bi(n))

통신 도구 상자가 포함되어 있지 않으므로 TIO가 작동하지 않습니다. Octave-Online 에서 테스트 할 수 있습니다 .

작동 원리 :

de2bi십진수를 문자열이 아닌 이진 숫자 벡터로 변환합니다 dec2bin.

mode벡터에서 가장 빈번한 숫자를 반환합니다. 동점 인 경우 기본값이 가장 낮습니다.

@(n)                % Anonymous function that takes a decimal number as input 'n'
    mode(        )  % Computes the most frequent digit in the vector inside the parentheses
         de2bi(n)   % Converts the number 'n' to a binary vector

통신 도구 상자는 Octave의 표준 부분입니까, 아니면 다른 언어의 라이브러리와 더 비슷합니까?
dcsohl

설치와 함께 제공되는 패키지입니다. 일부 설치에서는 구체적으로로드해야하며 다른 설치에서는 표준으로 자동로드됩니다. Octave-Online.net 표준의 일부이므로 참조로 사용하고 있습니다. (코드는 챌린지 이전에 존재 한 하나 이상의 통역사에서 작동해야합니다).
Stewie Griffin

9

자바 스크립트 (ES6), 36 34 바이트

f=(n,x=0)=>n?f(n>>>1,x+n%2-.5):x>0

f=(n,x=0)=>n?f(n>>>1,x+=n%2-.5):x>035 바이트
ovs

입력이 음수가 아니므로 바이트를 저장하는 n>>1대신 대신 사용하십시오 n>>>1.
kamoroso94

@ kamoroso94 감사하지만 2147483648에서 실패합니다.
ETHproductions

@ETHproductions Darn, 그리고 n/2|0더 나아지지 않습니다 : /
kamoroso94



7

Brachylog , 6 바이트

ḃọtᵐ>₁

온라인으로 사용해보십시오!

설명

Example input: 13

ḃ        Base (default: binary): [1,1,0,1]
 ọ       Occurences:             [[1,3],[0,1]]
  tᵐ     Map Tail:               [3,1]
    >₁   Strictly decreasing list

때문에 선행 0와 숫자의 목록이 출력을 통합하지 않습니다, 우리는의 발행 수는 것을 알고 1항상 먼저하고의 발행 수는 0항상 초 후가 될 것입니다 .



6

C (gcc) , 51 48 41 40 바이트

i;f(n){for(i=0;n;n/=2)i+=n%2*2-1;n=i>0;}

온라인으로 사용해보십시오!


OP의 설명에 따라 다음을 제거 할 수 있습니다.unsigned
musicman523

nnn은 긍정적이기 때문에, 당신은 변경할 수 있습니다 n>>=1n/=2. 나는 또한 당신이 사용할 수있는 생각 ~n대신에 n^-1또한 변경할 수 있도록해야하는, &&&
musicman523

"NNN"수단 - 내가 의견을 편집 할 때 이상한 일이 발생 n하고, 변화에 대해 신경 쓰지 &&하기 위해 &, 나는 그 일을 할 생각하지 않습니다. 그러나 그것을 *작동 하도록 변경
musicman523

@ musicman523 &&부호없는 경우 만 처리했지만 양의 정수 만 처리하면되므로 모두 제거 할 수 있습니다. 그래도 /=짧아지는 것에 대한 좋은 pouint >>=, 감사합니다!
cleblanc

로 변경 n&1?++i:--1하여 1 바이트를 저장할 수 있습니다 i+=n%2*2-1. 또한 >0무거운 것으로 0을 출력하고 무겁지 않은 경우 0이 아닌 값을 출력한다고 말함으로써 제거 할 수도 있습니다.
musicman523

6

R , 54 53 51 바이트

Max Lawnboy 덕분에 -1 바이트

n=scan();d=floor(log2(n))+1;sum(n%/%2^(0:d)%%2)*2>d

stdin에서 읽습니다. TRUE이진수로 된 숫자를 반환 합니다. d이진수의 수입니다. sum(n%/%2^(0:d)%%2숫자 합계 (즉, 1의 수)를 계산합니다.

온라인으로 사용해보십시오!


내 게시물을 게시 한 후에 만 ​​답을 보았습니다 ... 어쨌든 1 바이트를 절약 하는 log2(n)대신 사용할 수 있습니다.log(n,2)
Maxim Mikhaylov

물론 @MaxLawnboy 아. 감사!
주세페

다른 12 바이트를 골퍼
JAD

6

x86_64 기계 코드, 23 22 21 바이트

31 c0 89 fa 83 e2 01 8d 44 50 ff d1 ef 75 f3 f7 d8 c1 e8 1f c3

분해 :

  # zero out eax
  xor  %eax, %eax
Loop:
  # copy input to edx
  mov  %edi, %edx
  # extract LSB(edx)
  and  $0x1, %edx
  # increment(1)/decrement(0) eax depending on that bit
  lea -1(%rax,%rdx,2), %eax
  # input >>= 1
  shr  %edi
  # if input != 0: repeat from Loop
  jnz  Loop

  # now `eax < 0` iff the input was not binary heavy,
  neg %eax
  # now `eax < 0` iff the input was binary heavy (which means the MSB is `1`)
  # set return value to MSB(eax)
  shr  $31, %eax
  ret

-1바이트에 대한 @Ruslan, @PeterCordes에게 감사합니다 !

온라인으로 사용해보십시오!


당신이 8d 1f대신 사용하는 특별한 이유 가 89 fb있습니까?
Ruslan

2
진짜 질문은, 당신이 그 가증 한 AT & T 구문을 사용하는 특별한 이유가 있습니까?!? 또한 분해와 분해 모두 당신이 add eax, 2+ 를 가지고 있다는 데 동의 dec eax하지만, 귀하의 의견은 당신이 ebx아닌 증가하고 싶다고 제안합니다 eax.
코디 그레이

1
당신은 대체 할 수 있습니다 jnz Next/ add/ dec과 (7 바이트) lea -1(%rax, %rbx, 2), %eax(4 바이트) 할 eax += 2*ebx - 1(처럼 다른 86 기계 코드 대답을 ). 그런 다음 neg %eax부호 비트를 맨 아래로 이동하기 전에 루프 외부 (2 바이트) 외부 . 1 바이트의 순 절약. 또는 반환 값이 또는 인 경우 test %eax,%eax/ setge %al도 작동합니다 . boolint8_t
Peter Cordes

1
@PeterCordes 무슨 일이 일어 났는지 알지만 확실하지 않습니다. 이 방법으로 시도하지 않았을 lea -1(%rax,rbx,2)뿐 아니라 lea -1(%eax,%eax,2)바이트를 낭비 했을 수도 있습니다 . 어쨌든 둘 다 옳았습니다. 덕분에 많은 (귀국일에서 나는 그것을 바꿀 수 있습니다 leaA를 mov하는 동안 나는 그것을 해요)!
ბიმო

1
@ moonheart08 : 그때는 몰랐지만 누군가 7 바이트를 절약 한 답변 을 게시했습니다 .
ბიმო

5

펄 6 ,  32  30 바이트

{[>] .base(2).comb.Bag{qw<1 0>}}

그것을 테스트

{[>] .polymod(2 xx*).Bag{1,0}}

그것을 테스트

넓히는:

{      # bare block lambda with implicit parameter 「$_」

  [>]  # reduce the following with &infix:« > »

    .polymod(2 xx *) # turn into base 2 (reversed) (implicit method call on 「$_」)
    .Bag\            # put into a weighted Set
    { 1, 0 }         # key into that with 1 and 0
                     # (returns 2 element list that [>] will reduce)
}


5

하스켈, 41 34

g 0=0
g n=g(div n 2)+(-1)^n
(<0).g

경우 n홀수하는을 -1그것도의 경우를 취할 1. 로 재귀 호출을 추가하고 n/2if를 중지하십시오 n = 0. 결과가 0숫자 보다 작 으면 이진 중입니다.

온라인으로 사용해보십시오!

편집 : @ Ørjan Johansen은 일부 단축키를 발견하고 7 바이트를 저장했습니다. 감사!


mod n 2그냥 될 수 있으며 n누산기가 없으면 바이트가 짧습니다. 온라인으로 사용해보십시오!
Ørjan Johansen

5

망막 , 37 34 바이트

.+
$*
+`(1+)\1
$1@
@1
1
+`.\b.

1+

온라인으로 사용해보십시오! 링크에는 작은 테스트 사례가 포함됩니다 (더 큰 테스트 사례에는 메모리가 부족할 수 있음). 편집 : @MartinEnder 덕분에 3 바이트가 절약되었습니다. 설명 : 첫 번째 단계는 십진수에서 단항으로 변환하고 다음 두 단계는 단항에서 이진으로 변환합니다 (이것은 내가 @대신 사용 하는 것을 제외하고 Retina 위키의 단항 산술 페이지에서 거의 직선 입니다 0). 세 번째 단계는 @1또는 이 중 하나 1@일 수있는 서로 다른 문자 쌍을 찾아서 남아있을 때까지 삭제합니다. 마지막 단계는 남은 1을 확인합니다.


${1}일 수 있습니다 $+. 또는 !대신 0에을 사용 01|10하여 단축 할 수 있습니다 .\b..
마틴 엔더

@MartinEnder Huh, $+패턴에 |? 가 포함 된 경우 올바른 작업을 수행 합니까? 내가 전에 그것을 사용할 수 있었는지 궁금합니다.
Neil

2
아니요, $+매우 어리 석고 사용 여부에 관계없이 가장 큰 그룹을 사용합니다. 9 개 이상의 그룹이 있거나 여기에있는 그룹과 같은 상황에서 골프를 타는 데 유용하며, 왜 프로덕션 정규식에서이 그룹을 사용했는지 모르겠습니다.
마틴 엔더

5

R , 43 바이트

max(which(B<-intToBits(scan())>0))/2<sum(B)

온라인으로 사용해보십시오!

             intToBits(scan())              # converts to bits
          B<-                 >0            # make logical and assign to B
max(which(                      ))/2        # get the length of the trimmed binary and halve
                                    <sum(B) # test against the sum of bits

깔끔한 솔루션 +1! 나도 몰랐어요intToBits
주세페

또 다른 4 바이트를 골퍼
JAD

5

코 틀린 , 50 바이트

{i:Int->i.toString(2).run{count{it>'0'}>length/2}}

암시 적 유형의 람다 (Int) -> Boolean. 의 사용으로 인해 버전 1.1 이상 Int.toString(radix: Int).

불행히도 TIO의 Kotlin 런타임은 1.0.x 인 것처럼 보이므로 TIO 링크 대신 슬픈 개가 있습니다.



4

R, 39 37 바이트

sum(intToBits(x<-scan())>0)>2+log2(x)

이것은 @MickyT와 @Giuseppe가 사용하는 여러 방법을 조합하여 몇 바이트를 절약합니다.

sum(intToBits(x) > 0)1비트 수를 세고 2+log2(x)/2반올림 할 때 총 비트 수의 절반입니다. 두 값이 같은 동작 때문에 반올림 할 필요가 없습니다.



4

정규식 (ECMAScript), 85 73 71 바이트

^((?=(x*?)\2(\2{4})+$|(x*?)(\4\4xx)*$)(\2\4|(x*)\5\7\7(?=\4\7$\2)\B))*$

온라인으로 사용해보십시오!

Deadcode의 설명

이전 73 바이트 버전이 아래에 설명되어 있습니다.

^((?=(x*?)\2(\2{4})+$)\2|(?=(x*?)(\4\4xx)*$)(\4|\5(x*)\7\7(?=\4\7$)\B))+$

ECMAScript 정규식의 한계로 인해 효과적인 전술은 종종 필요한 속성을 모든 단계에서 변하지 않고 유지하면서 한 번에 한 단계 씩 변환하는 것입니다. 예를 들어, 완벽한 제곱 또는 2의 거듭 제곱을 테스트하려면 모든 단계에서 제곱 또는 2의 거듭 제곱 (각각)을 유지하면서 크기를 줄이십시오.

이 솔루션이 모든 단계에서 수행하는 작업은 다음과 같습니다.

111100101ones>zeroes1

ones>zeroesones1>zeroes1

이러한 반복 된 단계가 더 이상 진행되지 않으면, 최종 결과는 연속적인 1비트 열이 될 것이며 , 이는 원래 숫자도 무거웠 음을 나타내거나 2의 거듭 제곱은 원래 숫자가 무겁지 않다는 것을 나타냅니다.

물론, 이러한 단계는 숫자의 이진 표현에 대한 인쇄상의 조작의 관점에서 위에서 설명되었지만 실제로는 단항 산술로 구현됩니다.

# For these comments, N = the number to the right of the "cursor", a.k.a. "tail",
# and "rightmost" refers to the big-endian binary representation of N.
^
(                          # if N is even and not a power of 2:
    (?=(x*?)\2(\2{4})+$)   # \2 = smallest divisor of N/2 such that the quotient is
                           # odd and greater than 1; as such, it is guaranteed to be
                           # the largest power of 2 that divides N/2, iff N is not
                           # itself a power of 2 (using "+" instead of "*" is what
                           # prevents a match if N is a power of 2).
    \2                     # N = N - \2. This changes the rightmost "10" to a "01".
|                          # else (N is odd or a power of 2)
    (?=(x*?)(\4\4xx)*$)    # \4+1 = smallest divisor of N+1 such that the quotient is
                           # odd; as such, \4+1 is guaranteed to be the largest power
                           # of 2 that divides N+1. So, iff N is even, \4 will be 0.
                           # Another way of saying this: \4 = the string of
                           # contiguous 1 bits from the rightmost part of N.
                           # \5 = (\4+1) * 2 iff N+1 is not a power of 2, else
                           # \5 = unset (NPCG) (iff N+1 is a power of 2), but since
                           #   N==\4 iff this is the case, the loop will exit
                           #   immediately anyway, so an unset \5 will never be used.
    (
        \4                 # N = N - \4. If N==\4 before this, it was all 1 bits and
                           # therefore heavy, so the loop will exit and match. This
                           # would work as "\4$", and leaving out the "$" is a golf
                           # optimization. It still works without the "$" because if
                           # N is no longer heavy after having \4 subtracted from it,
                           # this will eventually result in a non-match which will
                           # then backtrack to a point where N was still heavy, at
                           # which point the following alternative will be tried.
    |
        # N = (N + \4 - 2) / 4. This removes the rightmost "01". As such, it removes
        # an equal number of 0 bits and 1 bits (one of each) and the heaviness of N
        # is invariant before and after. This fails to match if N is a power of 2,
        # and in fact causes the loop to reach a dead end in that case.
        \5                 # N = N - (\4+1)*2
        (x*)\7\7(?=\4\7$)  # N = (N - \4) / 4 + \4
        \B                 # Assert N > 0 (this would be the same as asserting N > 2
                           # before the above N = (N + \4 - 2) / 4 operation).
    )
)+
$       # This can only be a match if the loop was exited due to N==\4.

2
이것은 Deadcode의 답변 에서 영감을 얻었지만 알고리즘은 주석이 아닌 별도의 답변을받을 가치가 있다고 생각할 정도로 다릅니다.
그리미

2
이것은 놀랍고 정확하게보고 싶었습니다 (누군가 훨씬 더 간결한 알고리즘으로 물에서 내 정규식을 날려 버립니다). 그러나 귀하의 의견은 실제로 그것을 전혀 설명하지 않으며, 정규식의 주석이 달린 73 바이트 버전도 작동하지 않습니다 (뒤로 참조 \5는 하나씩 벗어납니다). 나는 이것을 연구하고 설명하고 내 대답에 주석을 달았습니다 (StackExchange는 여러 줄로 답장을 허용하지 않기 때문에).
데드 코드

4

정규식 (ECMAScript), 183 바이트

이것은 ECMA 정규식으로 해결해야 할 또 다른 흥미로운 문제였습니다. 이것을 처리하는 "명백한"방법은 1비트 수를 세어 총 비트 수와 비교하는 것입니다. 그러나 ECMAScript 정규식에서 직접 계산할 수는 없습니다. 지속적인 역 참조가 없기 때문에 루프에서 하나의 숫자 만 수정할 수 있으며 각 단계에서 숫자 만 줄일 수 있습니다.

이 단항 알고리즘은 다음과 같이 작동합니다.

  1. N에 맞는 2의 최대 거듭 제곱의 제곱근을 취하고, 제곱근이 완벽한 지 반올림해야하는지 기록합니다. 이것은 나중에 사용됩니다.
  2. 루프에서 각 최상위 1비트를 비트가있는 최하위 위치로 이동 0합니다. 이러한 각 단계는 빼기입니다. 루프의 끝에서 나머지 숫자 (2 진으로 표시됨)는 1s가없는 0s 의 문자열입니다 . 이러한 작업은 실제로 단항식으로 수행됩니다. 그것들은 개념적으로 바이너리로 이루어지고 있습니다.
  3. 이 " 1s의 이진 문자열 "을 앞에서 얻은 제곱근과 비교하십시오 . 제곱근을 반올림해야한다면 2 배 버전을 사용하십시오. 이것은 " 1s의 이진 문자열 "이 최종 매치를하기 위해 N보다 이진 자릿수의 절반 이상을 가져야 한다는 것을 보장한다 .

제곱근을 구하기 위해, 로코 번호 정규식 게시물 에 간략하게 설명 된 곱셈 알고리즘의 변형 이 사용됩니다. 최하위 0비트 를 식별하기 위해, 팩터 넘버 정규식 포스트 에 간략하게 설명 된 나눗셈 알고리즘 이 사용됩니다. 이것들은 스포일러 입니다. 따라서 고급 단항 정규식 마술을 원하지 않는다면 더 이상 읽지 마십시오 . 이 마법을 스스로 알아내는 데 총력을 기울이려면 이 이전 게시물 의 연속 스포일러 태그 권장 문제 목록에서 몇 가지 문제를 해결 하고 수학 통찰력을 독립적으로 생각해 보는 것이 좋습니다 .

더 이상 고민하지 말고 정규 표현식 :

^(?=.*?(?!(x(xx)+)\1*$)(x)*?(x(x*))(?=(\4*)\5+$)\4*$\6)(?=(((?=(x(x+)(?=\10$))*(x*))(?!.*$\11)(?=(x*)(?=(x\12)*$)(?=\11+$)\11\12+$)(?=.*?(?!(x(xx)+)\14*$)\13(x*))\16)*))\7\4(.*$\3|\4)

온라인으로 사용해보십시오!

# For the purposes of these comments, the input number = N.
^
# Take the floor square root of N
(?=
    .*?
    (?!(x(xx)+)\1*$)    # tail = the largest power of 2 less than tail
    (x)*?               # \3 = nonzero if we will need to round this square root
                        #      up to the next power of two
    (x(x*))             # \4 = potential square root; \5 = \4 - 1
    (?=
        (\4*)\5+$       # Iff \4*\4 == our number, then the first match here must result in \6==0
    )
    \4*$\6              # Test for divisibility by \4 and for \6==0 simultaneously
)
# Move all binary bits to be as least-significant as possible, e.g. 11001001 -> 1111
(?=
    (                                 # \7 = tool for making tail = the result of this move
        (
            (?=
                (x(x+)(?=\10$))*(x*)  # \11 = {divisor for getting the least-significant 0 bit}-1
            )
            (?!.*$\11)                # Exit the loop when \11==0
            (?=
                (x*)                  # \12 = floor((tail+1) / (\11+1)) - 1
                (?=(x\12)*$)          # \13 = \12+1
                (?=\11+$)
                \11\12+$
            )
            (?=
                .*?
                (?!(x(xx)+)\14*$)     # tail = the largest power of 2 less than tail
                \13                   # tail -= \13
                (x*)                  # \16 = tool to move the most-significant 1 bit to the
                                      # least-significant 0 bit available spot for it
            )
            \16
        )*
    )
)
\7                  # tail = the result of the move
\4                  # Assert that \4 is less than or equal to the result of the move
(
    .*$\3
|
    \4              # Double the value of \4 to compare against if \3 is non-empty,
                    # i.e. if we had an even number of total digits.
)



3

J , 12 바이트

(+/>-:@#)@#:

J는 오른쪽에서 왼쪽으로 동사를 실행하므로 끝에서 시작하여 시작을 향해 나아갑니다.

설명

         #:       NB. Convert input to list of bits
       -:@#       NB. Half (-:) the (@) length (#)
          >       NB. Greater than 
         +/       NB. Sum (really plus (+) reduce (/)

1
(#<2*+/)@#:내가 빠진 것이 아니라면 1을 저장해야합니다.
FrownyFrog





2

C #, 82 바이트

n=>{var s=System.Convert.ToString(n,2);return s.Replace("0","").Length>s.Length/2}

문자열을 IEnumerable <char>로 처리하여 좀 더 다듬을 수 있습니다. n=>{var s=Convert.ToString(n,2);return s.Count(c=>c=='1')>s.Length/2;}
GalacticCowboy

@GalacticCowboy 정규화 Convert되고 포함 해야하는 (11 using System.Linq;보다 짧음 namespace System.Linq{}) 11 바이트를 추가합니다 . 좋은 생각은이 경우 절약을 보장 할만 큼 면도를하지 않습니다.
TheLethalCoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.