Cyclops 번호입니까? "아무도"는 알고있다!


66

태스크:

정수 입력이 주어지면 Cyclops Number인지 여부를 알아냅니다.

키클롭스 번호는 무엇입니까? 음, 이진 표현 0은 중심에 하나만있는 숫자입니다 !

테스트 사례 :

Input | Output | Binary  | Explanation
--------------------------------------
0     | truthy | 0       | only one zero at "center"
1     | falsy  | 1       | contains no zeroes
5     | truthy | 101     | only one zero at center
9     | falsy  | 1001    | contains two zeroes (even though both are at the center)
10    | falsy  | 1010    | contains two zeroes
27    | truthy | 11011   | only one zero at center
85    | falsy  | 1010101 | contains three zeroes
101   | falsy  | 1100101 | contains three zeroes
111   | falsy  | 1101111 | only one zero, not at center
119   | truthy | 1110111 | only one zero at center

입력:

  • 정수 또는 동등한 유형. ( int, long, decimal등)

  • 입력을 평가할 때 정수 오버 플로우 또는 기타 원하지 않는 문제가 발생하면 해당 입력을 평가할 필요가 없다고 가정하십시오.

산출:

  • 다정하거나 거짓.

  • 진실 / 거짓 출력은 진실 / 거짓에 대해 사용 된 언어의 사양을 충족해야합니다. (예 : C는 0false, 0이 아닌 true)

도전 규칙 :

  • 0보다 작은 입력은 허위 인 것으로 가정되므로 평가할 필요가 없습니다.

  • 숫자의 이진 표현 길이가 짝수이면 숫자는 키클롭스 숫자가 될 수 없습니다.

일반적인 규칙:


이것은 나의 첫 번째 프로그래밍 퍼즐 & 코드 골프 도전입니다.


25
참고 : 이것은 A129868
tsh

35
제목에서 2800 년 후반 대중 문화 참고 자료에 대해 +1
9

테스트 할 최대 수는 얼마입니까?
Serverfrog

@Serverfrog는 제한을 지정하지 않았으므로 양의 정수를 테스트 할 수 있다고 가정합니다.
타우

이진 입력이 허용됩니까?
Qwertiy

답변:


11

apt, 8 바이트

1¥¢q0 äè

온라인으로 실행

설명:

1¥¢q0 äè   
                                                              119
  ¢          // Convert the input into a binary string        "1110111"
   q0        // Split the string on "0"                       ["111","111"]
      ä      // Reduce each item by:                            a     b
       è     //   Seeing how many times a is found in b       [1]
 1¥          // == 1; See if the result equals 1              True                                         

이진 문자열을 나누는 것이 아이디어인데 0, 하나만 있으면 두 개의 항목이 생성됩니다 0. 그런 다음 첫 번째 항목이 두 번째 항목과 일치하여 회 문식임을 확인합니다. 이진 문자열에 여러 개의가 포함 된 경우 0reduce는 다중 항목 배열을 반환하므로 ==1조건에 실패합니다 . 이진 문자열을 포함하지 않으면 0,하지만 상동 아니라, äè반환합니다 0때문에이 b포함 0의 일치 a.


1
카페인이 들어간 뇌를 몇 초 만에 여기에서 무슨 일이 일어나고 있는지 보았습니다! 잘 했어요 작동해야합니다.
얽히고 설킨

1
Japt는 모르지만 올바르게 이해하면 다음을 수행합니다. ¤= 이진으로 변환; q0= 0으로 분할; äè나는 확실하지 않다 ..; 그리고 플래그 -N에 목록으로 변환 NaN하지만, 잎 01동일합니다. 를 들어 äè일부 그게 볼 수 119있다 [111,111]분할 이후 äè로 변경 1; 과 85이다 [1,1,1,1]분할 이후 äè로 변경됩니다 [1,1,1]. .ä("è")작동 방식 을 설명해 주 시겠습니까?
Kevin Cruijssen

2
@KevinCruijssen 설명을 추가했습니다. 도움이 되길 바랍니다.
올리버

1
NaNJAPT에서 falsey? 또한 (당신이 조건으로하지 실행받을 경우? "Truthy이 truthy / falsy을 위해 사용 된 언어의 사양을 충족해야합니다 falsy 출력 /"를하는 경우 - 다른 그와 함께 수행하는 경우 예) 2수익률 2내가 의심이다 falsey을 (하지만, 경우 수 있습니다 JAPT 05AB1E와 같습니다).
Jonathan Allan

1
JS는 0진실로 간주되는 정수 이외의 정수를 가정합니다 . 그러나 진실로 2되돌아 가면 2이 제출물을 재 작업해야 할 수도 있습니다.
타우

21

파이썬 2 , 30 바이트

lambda n:(2*n^2*n+3)**2==8*n+9

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

그주의 2*n^2*n+3의 비트 XOR입니다 2*n2*n+3그 파이썬의 연산자 우선 순위 때문입니다.


1
사이클롭스 숫자 lambda n:(2*n^2*n+3)**2-8*n-9의 반환 값 0으로을 반환 해도 괜찮습니까?
Eric Duminil

2
이 산출 TRUE을 위해n = -1
user2390246

3
@ user2390246이 문제는 부정적으로 의도 된 것이 아닙니다. 만약 그렇다면, 받아들이는 모든 해결책은 부정적이어야합니다. (파이썬이 정수를 구현하는 방식은 파이썬에서 어떤 해결책도 파이썬에서 받아들이지 않아야한다는 것을 의미합니다)
DreamConspiracy

3
@SolomonUcko 음수는 일반적으로 2의 보수 표현으로 저장됩니다. 첫 번째 고정 크기 정수 (예 : 32 비트)를 고려하십시오. 다른 특성 중에서도 TCR에서는 MSB가 음수로 1이고 양수가 0이어야합니다. 이를 위해서는 모든 양의 출력이 거짓이어야합니다. 파이썬에서는 더 많은 문제가 있습니다. 음수는 암시 적으로 가장 중요한 방향으로 1의 무한 시퀀스를 갖습니다. 그 중간을 찾으려고 행운을 빌어 요
DreamConspiracy

2
@ user2390246 문제는 코드가 부정적으로 작동 할 필요가 없음을 명확히하기 위해 편집되었습니다. 추가하여 2 바이트를 처리 할 수 ​​있습니다 >1.
xnor

18

x86 머신 코드, 17 바이트

8D 47 01 31 F8 89 C2 F7 D2 0F AF C2 8D 44 78 02 C3

위의 바이트는 32 비트 정수 입력 값을 받아들이는 함수를 정의합니다 ( EDI이 예제 의 레지스터에서는 일반적인 System V 호출 규칙에 따라 결과 크기에 영향을주지 않고 원하는 입력 레지스터를 거의 선택할 수 있습니다) EAX입력 값이 Cyclops 번호인지 여부를 나타내는 결과 ( 레지스터에 있음)를 반환합니다 .

챌린지 규칙에 따라 음수 값을 무시할 수 있기 때문에 입력은 부호없는 정수로 간주됩니다.

의사 결정 논리는 Neil의 답변 에서 차용되었습니다 . Cyclops 수는 이므로 일련의 비트 트위들 링 연산을 사용하여 입력.n=(2k+1)(2k11)

참고 : 반환 값은 진실 / 거짓이지만 시맨틱은 반대로되어 Cyclops 숫자에 대해 함수가 거짓을 반환합니다. 기계 코드에는 "진실 / 거짓에 대한 사양"이 없기 때문에 이것이 합법적이라고 주장합니다. 이는 문제의 요구 사항입니다. (이것이 부정 행위라고 생각되면 대체 버전은 아래를 참조하십시오.)

어셈블리 언어 니모닉에서 이것은 다음과 같습니다.

; EDI = input value
; EAX = output value (0 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 02        lea    eax, [eax + edi*2 + 2]  ; EAX  = (EAX + (EDI * 2) + 2)
C3                 ret                            ; return, with EAX == 0 for Cyclops number

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


약속 한대로 실제 표준이나 규칙이없는 기계 코드에서도 진실 / 거짓의 의미를 뒤집는 것이 부정적이라고 생각되면 3 바이트를 더하여 총 21 바이트를 추가하십시오 .

; EDI = input value
; AL  = output value (1 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 01        lea    eax, [eax + edi*2 + 1]  ; EAX  = (EAX + (EDI * 2) + 1)
40                 inc    eax                     ; EAX += 1
0F 94 C0           setz   al                      ; AL = ((EAX == 0) ? 1 : 0)
C3                 ret                            ; return, with AL == 1 for Cyclops number

이 코드의 전반부는 원본과 동일합니다 ( imul명령을 통해 아래로 ). 는 lea거의 동일하지만, 그 대신 일정한 2의 첨가, 단지 다음의 때문에 일정한 1. 추가 inc명령이있는 값 증가 EAX플래그를 설정하기 위해 1 레지스터. "zero"플래그가 설정되면 setz명령은 AL1로 설정 됩니다. 그렇지 않으면 AL0으로 설정됩니다. 이것은 C 컴파일러가 기계 코드를 생성하여를 반환하는 표준 방식입니다 bool.

lea명령어에 추가 된 상수를 변경해도 코드 크기는 변경되지 않으며 inc명령어는 매우 작지만 (1 바이트 만) setz명령어는 다소 무려 3 바이트입니다. 불행히도, 나는 그것을 쓰는 더 짧은 방법을 생각할 수 없습니다.


4
이것은 너무 빠르므로 모든 숫자를 큰 값으로 테스트하여 과시해야한다고 생각합니다. 온라인으로 사용해보십시오!
데드 코드

실제로 @Deadcode보다 빨라야합니다. :-) 인라인 어셈블리로 시연하면 약간의 오버 헤드가 추가되지만 바이트 문자열로 이동하는 오래된 트릭 (예 : 이 답변 참조 )이 TIO의 컴파일러 작업을 중단했으며 어셈블리에서 결과를 직접 인쇄하는 코드를 작성하는 것이 너무 많습니다 귀찮게 일하십시오. 그러나 이것은 크기 최적화가 속도 최적화와 충돌하지 않는 특별한 경우 중 하나입니다. 이것은 크기를 초과하는 속도를 원한다면 asm으로 코드를 작성하는 방식과 거의 같습니다.
코디 그레이

합의에 따라 asm 제출 코드 golf.stackexchange.com/a/165020/84624stackoverflow.com/questions/48381234/… 에 상태 플래그를 반환하는 것은 허용되지 않습니다 . 그렇다면 두 번째 답변에서 3을 할 수 있습니다.
640KB

9

정규식 (ECMAScript), 60 58 57 60 58 바이트

입력 은 s 문자열의 길이로 단항 입니다.nx

SPOILER WARNING : 제곱근의 경우,이 정규식은 일반화 곱셈 알고리즘의 변형을 사용합니다.이 곱셈은 명백하지 않으며 스스로 해결할 수있는 보람있는 퍼즐 일 수 있습니다. 자세한 정보 는 로코 (Rocco) 번호 찾기 에서이 형식의 알고리즘에 대한 설명을 참조하십시오 .

zGrimy 덕분 -1 바이트 검색에서 역 추적을 허용하여 -2 바이트 , 제곱근 캡처를 lookahead 외부로 이동하여 0 -2 바이트 를 처리하기 위해 +3 바이트 대신 을 작은에서 최대 로 검색z
z

이것은 완벽한 제곱 2 인 를 찾아서 작동합니다 . 을 초과하지 않는 최대 2의 최대 제곱 전력만 이 이것을 충족시킬 수 있지만 골프 최적화로 인해 정규 표현식은 가장 작은 것부터 시작합니다. 각각은 사이클롭스 숫자에 해당하므로 가장 큰 숫자 만 일치 할 수 있습니다.zn=2(nz)+z+1n

^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$

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

^                 # N = tail
(x*)              # tail = Z, with the smallest value that satisfies the following
                  # assertions (which is no different from the largest value that
                  # would satisfy them, since no more than one value can do so);
                  # \1 = N - Z

(?!(x(xx)+)\2*$)  # Assert Z is a power of 2

# Assert Z is a perfect square, and take its square root
(x(x*))           # \4 = square root of Z; \5 = \4 - 1; tail = N - \1 - \4
(?=(\4*)\5+$)     # iff \4*\4 == Z, then the first match here must result in \6==0
(?=\4*$\6)        # test for divisibility by \4 and for \6==0 simultaneously

# Assert that N == \1*2 + \4 + 1. If this fails, then due to a golf optimization,
# the regex engine will backtrack into the capturing of \4, and try all smaller
# values to see if they are the square root of Z; all of these smaller values will
# fail, because the \4*\4==Z multiplication test only matches for one unique value
# of \4.
x\1$

|^$               # Match N==0, because the above algorithm does not

OP는 0이 진실이어야한다고 밝혔으므로 현재로서는 문제가 해결되지 않습니다.
그리미

1
간단 ^(1*)0\1$하지 않습니까?
에 무지

4
입력이 이진 인 경우에만 @ 무시의 구현. 그것은 많은 도전들을 사소하게 만들 것입니다. 적용 가능한 경우 단항 입력을 지속적으로 사용하는 것이 훨씬 더 흥미 롭습니다.
데드 코드

9

자바 스크립트 (Node.js) , 20 바이트

p=>~p==(p^=p+1)*~p/2

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

아마도 이것이 맞을 수도 있습니다.

고마워 Grimy, 1 바이트 절약.


자바 스크립트 (Node.js) , 32 바이트

f=(p,q)=>p&1?f(p/2,q+q|2):!(p^q)

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


자바 스크립트 (Node.js) , 34 바이트

p=>/^(1*)0\1$/.test(p.toString(2))

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



일치하지 않는 테스트
edc65

1
@ edc65 실패한 테스트 케이스를 찾았습니까?
tsh

2
@tsh .testnot.match
ASCII 전용

@ASCII 전용 와우, 합리적으로 들립니다 ... 어떻게 읽을 수 있습니까?
tsh



7

Mathematica (Wolfram 언어), 32 31 바이트

J42161217 덕분에 1 바이트가 절약되었습니다!

OddQ@Log2[#+Floor@Sqrt[#/2]+2]&

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

입력 및 재와 같은 순수 정수 촬영 기능 True또는 False. 사실을 바탕으로 (재미 증명하기 위해!) 숫자가 있다고 n만하고있는 경우 사이클롭스 인 n의 제곱근 플러스 n/2플러스 22의 홀수 전력 다운 라운드 (하나는 교체 할 수 있습니다 Floor중 하나에 의해 Ceiling또는 Round한 사람이도 대체로 +2하여 +1.) Trueinput을 반환 합니다 0.


1
Log2[#+Floor@Sqrt...
J42161217

√()Sqrt[]
attinat

바이트 수가 정확합니까? TIO는 현재 프로그램에 32 바이트를 제공합니다.
mbomb007

@ mbomb007 aha, TIO는 J42161217의 1 바이트 절약을 포함하지 않았습니다. 결정된.
그렉 마틴

attinat이 제안한 것을 사용하지 않은 이유가 있습니까?
mbomb007


5

apt, 8 바이트

¢ðT ¥¢Êz

제출을 수정 해 주신 Luis felipe de Jesus Munoz에게 감사드립니다!

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

기존 정규식 기반 솔루션, 15 바이트

¤f/^(1*)0\1$/ l

true는 1을, false는 0을 반환합니다.

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


잘 연주했습니다. 나는 정규 표현식을 언젠가 배워야합니다. :) +1
Quintec

1
@Quintec Regex는 대단합니다 :)
무지의 구현

업데이트 : 짧은 길을 찾았습니다 :)
Quintec


1
@LuisfelipeDejesusMunoz 고마워, 그것은 ==연산자 의 정말 좋은 사용입니다 !
에 무지

4

젤리 ,  8  7 바이트

Outgolfer Erik 덕분에 -1 ( ŒḂ대신 isPalindrome 내장 사용 ⁼Ṛ$)

B¬ŒḂ⁼SƊ

1(truthy) 또는 0(falsey) 를 생성하는 정수를 받아들이는 monadic Link .

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

어떻게?

B¬ŒḂ⁼SƊ - Link: integer             e.g. 1    9          13         119
B       - to base 2                      [1]  [1,0,0,1]  [1,1,0,1]  [1,1,1,0,1,1,1]
 ¬      - logical NOT (vectorises)       [0]  [0,1,1,0]  [0,0,1,0]  [0,0,0,1,0,0,0]
      Ɗ - last three links as a monad:
  ŒḂ    -   is a palindrome?             1    1          0          1
     S  -   sum                          0    2          1          1
    ⁼   -   equal?                       0    0          0          1

실제로 당신이 내 앞에 영리한 아이디어를 가지고있는 것처럼 보이지만 그 영리함은 분명하지 않으며 ( Bċ0⁼1ȧŒḂ8 바이트이기도합니다) -1 ⁼Ṛ$과 동일 ŒḂ합니다. 또한 음수를 처리 할 필요가 없습니다.
Outgolfer Erik

고마워 에릭, 회문 내장은 어떤 이유로 내 마음을 미끄러 뜨렸다!
Jonathan Allan

사실, ṚƑ요즘 에도 그 장소에서 사용할 수 있으므로 그렇게 기억하십시오 (가장 중요한 것 Ƒ).
아웃 골퍼 에릭


4

정규식 (ECMAScript), 53 47 바이트

Deadcode와 Grimy 덕분에 -6 바이트

^((?=(x*?)(\2((x+)x(?=\5$))+x$))(?!\2{6})\3x)*$

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


정규 표현식을 완전히 주석 처리하고 증명하는 과정에서 (아직 완성되지 않은) 50 바이트로 ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
줄였습니다

4

Brachylog , 8 바이트

ḃD↔Dḍ×ᵐ≠

입력이 Cyclops 번호 인 경우 성공하고 입력이 Cyclops 번호가 아닌 경우 실패하는 술어입니다. 성공 / 실패는 Brachylog에서 가장 근본적인 진실 / 거짓 개념입니다.

온라인으로 사용해보십시오! 또는 10000까지의 모든 진실한 결과물을 찾으십시오 .

설명

          Input is an integer
ḃ         Get its binary representation, a list of 1's and 0's
 D        Call that list D
  ↔       When reversed...
   D      It's the same value D
    ḍ     Dichotomize: break the list into two halves
          One of these halves should be all 1's; the other should contain the 0
     ×ᵐ   Get the product of each half
       ≠  Verify that the two products are not equal

Cyclops 번호가 주어진 경우에만 성공합니다.

  • 이진 표현이 회문이 아닌 경우 D↔D실패합니다. 다음에서 우리는 그것이 회문이라고 가정 할 수 있습니다.
  • 둘 이상의 0이있는 경우 두 반쪽 모두 하나 이상의 0을 포함합니다. 따라서 제품은 모두 0이되고 ×ᵐ≠실패합니다.
  • 0이 없으면 두 개의 반쪽에만 1이 포함됩니다. 따라서 제품은 모두 하나가되고 ×ᵐ≠실패 할 것입니다.
  • 정확히 0이있는 경우가 남습니다. 우리는 이미 회문이 있다는 것을 알고 있기 때문에 이것이 중심적이어야합니다. 반으로 나타나서 반제품이 0이됩니다. 나머지 절반에는 모든 것이 포함되므로 해당 제품은 하나가됩니다. 그런 다음 1 ≠ 0이고 ×ᵐ≠성공하며 전체 술어가 성공합니다.


3

05AB1E , 8 (또는 9) 바이트

bD0¢sÂQ*

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

1진실한 경우 반환 ; 0또는 1거짓이 아닌 양의 정수 . 05AB1E에서는 진실 1하고 다른 모든 것은 거짓이지만 이것이 허용되는 출력인지 또는 출력이 일관되고 고유 한 두 값이어야하는지 확실하지 않습니다. 두 번째 경우는 후행 Θ보다 때문에 모든 출력이 다른 추가 될 수 1되고 0:

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

b     # Convert the (implicit) input-integer to a binary-string
 D    # Duplicate it
  0¢  # Count the amount of 0s
 s    # Swap to get the binary again
  ÂQ  # Check if it's a palindrome
 *    # Multiply both (and output implicitly)

  Θ   # Optionally: check if this is truthy (==1),
      # resulting in truthy (1) or falsey (0)

산술 접근 방식은 10 바이트입니다.

LoD<s·>*Iå

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

a(n)=(2n1)(22n+1)

L        # Create a list in the range [1, (implicit) input-integer]
 o       # For each integer in the list, take 2 to the power this integer
  D<     # Create a copy, and decrease each value by 1
  s·     # Get the copied list again, and double each value
    >    # Then increase each value by 1
  *      # Multiply the numbers at the same indices in both lists
     Iå  # Check if the input-integer is in this list
         # (and output the result implicitly)

갖는 1다른 언어 (예 : C와 TI-BASIC)이 유사한 truthy / falsy 정의 (모두 0 / 0이 아닌)이 있기 때문에 같은 truthy 및 falsy 다른 모든 숫자 것은,이 문제에 대한 허용됩니다. 진실하거나 허위로 간주되는 것이 언어의 사양과 일치하는 한 공정한 게임입니다.
타우

3

엑셀, 97 63 바이트

=A1=2*4^(ROUND(LOG(A1,4),0))-2^(ROUND(LOG(A1,4),0))-1

2 개의 숫자를 계산합니다.

가장 가까운 4의 거듭 제곱
>Num|Binary|2*Power4|Binary
> 1| 1| 2* 1= 2| 10
> 2| 10| 2* 4= 8| 1000
> 4| 100| 2* 4= 8| 1000
> 20| 10100| 2*16=32|100000

 

1 더하기 4의 가장 가까운 거듭 제곱의 제곱근
>Num|Binary|1+√Power4|Binary
> 1| 1|1+ √1= 2| 10
> 2| 10|1+ √4= 3| 11
> 4| 100|1+ √4= 3| 11
> 20| 10100|1+ √16= 5| 101

그런 다음 첫 번째 숫자에서 두 번째 숫자를 뺍니다.

>Num|Binary|2*Power4|Binary|1+√Power4|Binary|a-b|Binary
> 1| 1| 2* 1= 2| 10|1+ √1= 2| 10| 0| 0
> 2| 10| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 4| 100| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 20| 10100| 2*16=32|100000|1+ √16= 5| 101| 27| 11011

이 결과를 원래 숫자와 비교하십시오.

오래된 방법

=DEC2BIN(A1)=REPLACE(REPT("1",1+2*INT(IFERROR(LOG(A1,2),0)/2)),1+IFERROR(LOG(A1,2),0)/2,1,"0")

A1의 Log-base-2로 시작하여 가장 가까운 짝수로 내림 한 다음 1을 더하십시오.

그런 다음 "1"s 의 문자열을 만들고 가운데 문자를 a "0"로 바꾸면 항상 홀수이며 A1의 이진 길이와 같거나 1보다 작은 이진 길이를 가진 Cyclops 수를 만듭니다.

그런 다음 A1의 이진 표현과 비교하십시오.


3

R , 37 33 바이트

(x=scan())%in%(2*4^(n=0:x)-2^n-1)

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

R에는 이진수로 변환하기위한 내장 기능이 없으므로 간단히 OEIS의 수식 중 하나를 사용하여 시퀀스에서 용어 목록을 계산했습니다.

n<-0:x관대 한 시작 값 목록을 생성합니다. 2*4^(n<-0:x^2)-2^n-1)는 OEIS의 공식이며을 사용하여 입력이 해당 순서로 나타나는지 확인합니다 %in%.

음의 입력을 처리 할 필요가 없으므로 -2 바이트 내가 변경할 수 있습니다 기억에 의해 -2 바이트 <-=.


3

C (gcc), 26 바이트

f(n){n=~n==(n^=-~n)*~n/2;}

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

항구 의 답변 . 구현에서 정의한 작업 순서에 의존합니다.

C ++ (클랑), 38 바이트

int f(int n){return~n==(n^=-~n)*~n/2;}

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

C ++에서 유형을 생략 할 수 없으며 clang에서 반환을 생략 할 수 없습니다. 그렇지 않으면 동일합니다.


1
return취약하고 플랫폼에 의존하는 암시 적 누산기 반환 값 악용 대신 C ++ 답변을 C 답변과 차별화하는 것이 좋습니다.
데드 코드

2
또한 표준 준수를 요구하는 규칙을 원하지만 규칙을 따르지 않기 때문에 이것을 사용하지 않는 것은 나쁜 골프 일뿐입니다. C ++ (clang)에는 반환이 필요하므로 38 바이트가됩니다.
그리미

그런 다음 C (gcc) 및 C ++ (gcc) 대신 C (gcc) 및 C ++ (clang)을 사용 하여이 문제를 해결할 수 있습니다. 나는 지금 그것을했다.
데드 코드


3

J , 22 19 17 15 14 바이트

BolceBussiere 덕분에 -3 바이트!

ngn 덕분에 -4 바이트!

Traws 덕분에 -1 바이트!

J , 14 바이트

1=1#.(*:|.)@#:

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


1
#=1++/­­­­­­­
ngn

1
(#=1++/)@(*|.)@#:
ngn

1
1=1#.1-(*|.)@#:
ngn

1
나는 그것을 사용하기에 충분한 j를 모르지만 그것을 줄임으로써 다른 사람들의 코드에서 배우는 것이 재미있다
ngn

1
-1 바이트1=1#.(*:|.)@#:
Traws


2

첨부 , 22 바이트

{Flip@_=_∧1=0~_}@Bin

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

대안

27 바이트 : {BitXor[2*_,2*_+3]^2=8*_+9}

27 바이트 : {BitXor@@(2*_+0'3)^2=8*_+9}

27 바이트 : {Palindromic@_∧1=0~_}@Bin

28 바이트 : {BitXor[...2*_+0'3]^2=8*_+9}

28 바이트 : {BitXor[…2*_+0'3]^2=8*_+9}

28 바이트 : {Same@@Bisect@_∧1=0~_}@Bin

29 바이트 : {_[#_/2|Floor]=0∧1=0~_}@Bin

30 바이트 : Same@Bin@{_+2^Floor[Log2@_/2]}

30 바이트 : {_[#_/2|Floor]=0and 1=0~_}@Bin


2

레티 나 0.8.2 , 38 37 바이트

.+
$*
+`^(1+)\1
$+0
10
1
^((1+)0\2)?$

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 편집 : 설명 후 이전 솔루션에서 0을 올바르게 처리하지 못했습니다. 설명:

.+
$*

십진수에서 단항으로 변환합니다.

+`^(1+)\1
$+0
10
1

Retina 위키의 방법을 사용하여 단항에서 이진으로 변환하십시오.

^((1+)0\2)?$

1앞뒤에 같은 수의 0빈 문자열을 확인하거나 빈 문자열 (위의 변환이 0을 처리하는 방식)을 확인하십시오.


1

배치, 39 37 바이트

@cmd/cset/a"m=%1^-~%1,!(m/2*(m+2)-%1)

n=(2k+1)(2k11)m=2k1n=m2(m+2)n


1

Excel, 101107 바이트

@Chronocidal 덕분에 -6 바이트

=AND(ISEVEN(LOG(A1,2)),MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0",LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1)

3 가지 검사를 수행합니다.

  • 홀수 길이
ISEVEN(LOG(A1,2))
  • 중간 문자는 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • 싱글이 있습니다 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
ISODD(LEN(DEC2BIN(A1)))ISEVEN(LOG(A1,2))
Chronocidal


1

VBA, 41 36 바이트

x=2^Int([Log(A1,4)]):?[A1]=2*x^2-x-1

명시 적 선언이 해제 된 상태에서 직접 실행 창에서 실행하십시오. 입력은 A1활성 시트의 셀 입니다. 즉시 창에 True / False를 출력합니다.

Excel Answer 와 동일한 논리를 사용하여 동일한 비트 수의 Cyclops 수 (또는 짝수의 경우 1 비트 더 짧음)를 찾은 다음 입력과 비교합니다.

형태로 줄여 사이클롭스 번호를 계산하는 몇 바이트를 저장한다 y = 2x^2 - x - 1( x = n-1대한 n 번째 사이클롭스 번호 또는 x = 2^Int(Log([A1])/Log(4))변수에 X를 비트 동일 덜 또는 번호와 최대 사이클롭스 번호를 확인하기 위해) 및 기억

( 테일러 스콧 덕분에 5 바이트 !)


1
로그 나누기를 사용하여 로그의 기본을 변환하는 대신 다음과 [...]같은 표기법을 사용하여 직접 로그를 변경할 수 있습니다.[(Log(A1,4)]
Taylor Scott

1

PHP , 74 바이트

function($x){return($c=strlen($a=decbin($x)))&1&&trim($a,1)===$a[$c/2|0];}

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

완전히 수학적이지 않은 수학적 접근 방식, 단지 문자열.

function cyclops( $x ) {
    $b = decbin( $x );     // convert to binary string (non-zero left padded)
    $l = strlen( $b );     // length of binary string
    $t = trim( $b, 1 );    // remove all 1's on either side
    $m = $b[ $l / 2 |0 ];  // get the middle "bit" of the binary string
    return 
        $l & 1 &&          // is binary string an odd length?
        $t === $m;         // is the middle char of the binary string the same as
                           // the string with left and right 1's removed? (can only be '0')
}

또는 60 바이트 Chronocidal의 알고리즘 @에 따라 .

function($x){return decbin($x)==str_pad(0,log($x,2)|1,1,2);}

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


1

하스켈, 82 바이트

import Text.Printf
(`all`[(==)<*>reverse,("0"==).filter(<'1')]).flip($).printf"%b"

그리고 xnor의 Python 솔루션 포트 :

하스켈, 47 바이트

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.