이 숫자는 정수 -2입니까?


41

숫자가 2의 거듭 제곱인지 여부를 결정하는 영리한 방법 이 있습니다. 더 이상 흥미로운 문제는 아니므로 주어진 정수가 -2 의 정수 제곱인지 여부를 결정하십시오 . 예를 들면 다음과 같습니다.

-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²

규칙

  • 사용자가 쓸 수 프로그램이나 함수를 상기의 어떠한 사용도 표준 방법 의 입력을 수신하고 출력을 제공한다.

  • 입력은 단일 정수이며, 정수가 -2의 정수 제곱이면 출력이 정확한 값이어야하고 그렇지 않으면 거짓 값이어야합니다. 다른 출력 (예 : 경고 메시지)은 허용되지 않습니다.

  • 일반적인 정수 오버플로 규칙이 적용됩니다. 솔루션은 기본적으로 모든 정수가 바인딩되지 않은 가상의 (또는 아마도 실제) 버전의 언어에서 임의로 큰 정수를 사용할 수 있어야하지만 구현으로 인해 프로그램이 실제로 실패하는 경우 큰 정수를 지원하지 않으면 솔루션이 무효화되지 않습니다.

  • 모든 프로그래밍 언어를 사용할 수 있지만 이러한 허점 은 기본적으로 금지되어 있습니다.

승리 조건

이것은 경연 대회입니다. 선택한 인코딩에서 가장 적은 바이트를 가진 답변이 승자입니다.


17
@KritixiLithos 왜 그런지 모르겠습니다. 다음 i과 같은 정수는 없습니다(-2)^i = 2
Fatalize

2
지수가 양수이거나 2 ^ (-1)-0.5 이므로 유효해야합니다 .
Mr. Xcoder

1
@ Mr.Xcoder, 입력은 항상 정수 값 이므로 음의 지수가 필요하지 않습니다 (또는 가능).
Toby Speight

1
@SIGSEGV 어쩌면 i자연스럽지 않다
Mr. Xcoder

2
@Jason, 귀하의 언어로 지원되는 / 자연스러운 것 – 세 번째 규칙을보십시오. 그리고 여기에 주제가 되는 객관적인 승리 기준 이 필요하기 때문에 코드 골프 입니다.
Toby Speight

답변:


26

매스 매 티카, 22 바이트

EvenQ@Log2@Max[#,-2#]&

온라인으로 사용해보십시오! 이 솔루션도 작동하는 대신 Mathics를 사용하십시오.

나는 비트 연산자를 사용하여 잠시 동안 솔루션을 찾으려고 노력했지만 분명히 존재하지만 더 간단한 것을 찾았습니다.

  • Max[#,-2#]음수이면 입력 값에 -2를 곱합니다 . 다른 인수 -2를 곱해도 값이 -2 의 거듭 제곱인지 여부는 변경 되지 않습니다. 하지만 지금의 모든 홀수 권한은 -2 심지어 힘으로 전환 한 -2 .
  • 그러나 -2의 거듭 제곱도 2의 거듭 제곱도 가능 하므로 단순을 사용 Log2@...하고 결과가 정수인지 확인합니다 ( 2 의 거듭 제곱인지 확인 ). 이것은 이미 2 바이트를 절약합니다 Log[4,...]( -2의 거듭 제곱을 보는 또 다른 방법 ).
  • 추가 보너스로, 값이 정수인지 확인하는 것이 정수인지 확인하는 것보다 짧습니다 . EvenQ대신을 사용하여 3 바이트를 더 절약 할 수 있습니다 IntegerQ.

-2의 거듭 제곱조차도 4의 정수 제곱이라고 생각하는 것이 도움이됩니까? 나는 모든 것을 긍정적으로 얻기 위해 -2를 곱하는 아이디어를 좋아한다.
Toby Speight

5
@TobySpeight 2의 거듭 제곱으로 처리하면 실제로 5 바이트가 절약됩니다. 나는 처음에 4의 힘을 사용하지만, Log[4,...]이상입니다 Log2@...IntegerQ이상이다 EvenQ.
Martin Ender


12

파이썬 , 46 바이트

@ovs 덕분에 -2 바이트

def g(x):
 while x%-2==0!=x:x/=-2
 return x==1

사용법을 가진 기능 :

g(4) # put your number between the brackets

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


print g(8)인쇄False
Felipe Nardi Batista

2
@FelipeNardiBatista해서는 안되나요?
Mr. Xcoder

2
죄송합니다, 내 예 나쁜 일이 있었다는 print g(4)동일하지 않습니다
펠리페 나르디 바티스타

거기에 작은 오류이며, 곧 그것을 고정, 대기
씨 Xcoder

1
;줄 바꿈 대신에 넣었습니다 ... 죄송합니다. @FelipeNardiBatista 수정
Mr. Xcoder

11

젤리 , 6 바이트

b-2S⁼1

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

이것은 Jelly가 정수 N 을 임의의 염기 B 로 변환하는 방법을 기반으로하며 , N 을 배열 로 변환 하여 수행합니다. 각 정수는 ( N ) B 의 숫자 d 이며 값은 0 ≤ V d < B 일 수 있습니다 . 여기서 우리는 오른쪽에서 0- 인 숫자를 사용할 것이므로 모든 숫자는 V d B d 를 더하여 N 을 형성 합니다. V d < BV d B d < BB d = B d +1 이므로 가능한 모든 것( N ) B의 선행 0을 무시하면 N 에는 하나의 고유 한 표현 만 있습니다.

여기에서 d = 입력, B = -2입니다. N = B d = 1 B d = V d B d ⇔1 = V dV d = 1이며, 우리는 다른 B 의 거듭 제곱을 더하지 않기 때문에 다른 모든 V 는 0이됩니다. 배열은 d 0 과 연결된 1이어야합니다 . Jelly는 왼쪽에서 1- 인덱스하기 때문에 배열의 첫 번째 요소가 1이고 다른 모든 요소가 0인지 확인해야합니다.

흠 ... 괜찮아? 아니? 무슨 일이야? 네, 더 좋은 생각이 있습니다! 먼저 배열의 모든 정수의 합을 정수 -2의 숫자가 아닌 정수 배열로 취급합니다. 1이면 1 만 있고 다른 모든 정수는 0임을 의미합니다. 0 -2 의 경우를 제외하고는 선행 0이 없기 때문에(어쨌든 합계는 0 ≠ 1이됩니다) 첫 번째 정수는 0이 아니어야합니다. 배열에서 0이 아닌 정수는 1이므로 첫 번째 정수 여야합니다. 따라서 양의 정수 쌍의 가능한 가장 작은 합이 Σ {1,1} = 2이기 때문에 배열의 모든 정수의 합이 1이되는 유일한 경우입니다. 기본 표현의 모든 정수는 음수가 아니므로, 합계가 1 인 유일한 방법은 하나의 1 만 있고 다른 모든 정수는 0입니다. 따라서 모든 정수의 합계가 배열은 1입니다.

코드는 다음과 같습니다.

b-2S⁼1 Main link. Arguments: d
b-2    Convert d to base -2.
   S   Take the sum.
    ⁼1 Check if the sum is equal to 1.

1
휴, 그 설명은 시간이 걸렸습니다 ...
Outgolfer Erik

나는 긴 프로그램에 대한 설명이 다음과 같은 모습을 보는 것을 싫어한다.
boboquack

1
@boboquack 여기에 기본 변환 항목을 사용하는 이유가 설명되어 있습니다. 긴 프로그램에 대한 설명이 그렇게 길지 않다고 생각합니다. 게시물에는 최대 30000 개의 마크 다운 문자가 포함될 수 있으며 더 긴 프로그램에 대한 설명은 더 간결합니다. 또한, 나는 더 긴 설명을 읽었으며, 그것은 지루하지 않습니다.
Outgolfer Erik



10

엑셀, 40 36 바이트

CallumDA로 4 바이트 절약

Excel은 확실히 할 수 있지만 오류를 수정하면 11 바이트가 추가됩니다.

=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1

입력이 셀에 A1있습니다. 출력은 TRUEFALSE

잘못된 값에 대해 오류 를 반환 FALSE하거나 #NUM!오류를 허용 한 경우 25 바이트에 불과합니다.

=-2^IMREAL(IMLOG2(A1))=A1

약간의 개선이 있습니다 :=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
CallumDA

1
트윗 담아 가기 복소수 함수를 사용하는 방법을 알아 내려고 노력했지만 내가 생각해 낸 모든 것이 더 길었습니다.
엔지니어 토스트

9

05AB1E , 8 바이트

Y(IÄÝm¹å

온라인으로 사용해보십시오! 또는 테스트 스위트

설명

Y(         # push -2
  IÄÝ      # push range [0 ... abs(input)]
     m     # element-wise power
      ¹å   # check if input is in the resulting list

왜 공감해야합니까?
Kritixi Lithos

@KritixiLithos : 누군가가 모든 골프 언어를 다운 보증 한 것 같습니다.
Emigna

6
그것도 주목했다. PPCG를 오랫동안 사용하지는 않았지만 표준 언어의 독창적이고 흥미로운 솔루션이 골프 언어의 3 바이트 솔루션보다 훨씬 더 높이 평가된다는 것을 알게되었습니다. 그러나 불행히도 골프 언어로 매우 독창적 인 솔루션을 공표하는 사람들이 있습니다. 왜냐하면 그들은 모든 것이 내장되어 있다고 생각하기 때문에 알고리즘 (골프 언어로 작성되었지만)이 얼마나 좋은지 이해하지 못하기 때문입니다. 놀라운 솔루션을 위해 +1 @Emigna
Mr. Xcoder

ÄLY(småO8.위한 Y(sÄLm¢Z8 ... 신경 끄시에 대한 모든 8
매직 문어 항아리

9

자바 스크립트 (ES6), 37 28 24 바이트

f=x=>!x|x%2?x==1:f(x/-2)

Arnauld 덕분에 4 바이트를 절약했습니다.

f=x=>!x|x%2?x==1:f(x/-2)

console.log(f(-2));
console.log(f(-1));
console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(3));
console.log(f(4));


"코드 조각 실행"을 클릭하면 왜 (참 / 거짓 값 이전에) 일부 오류가 표시됩니까?
numbermaniac

@numbermaniac 확실하지 않습니다. ES6을 완벽하게 지원하지 않는 브라우저를 사용하고 계십니까?
Tom

웰프, 새로 고침 및 다시 시도, 오류 없음. 처음에 무슨 일이 있었는지 잘 모르겠습니다.
numbermaniac


8

MATL , 9 8 바이트

2_y|:q^m

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

-8예를 들어 입력 을 고려하십시오

2_    % Push -2
      % STACK: -2
y     % Implicit input. Duplicate from below
      % STACK: -8, -2, -8
|     % Absolute value
      % STACK: -8, -2, 8
:     % Range
      % STACK: -8, -2, [1 2 3 4 5 6 7 8]
q     % Subtract 1, element-wise
      % STACK: -8, -2, [0 1 2 3 4 5 6 7]
^     % Power, element-wise
      % STACK: -8, [1 -2 4 -8 16 -32 64 -128]
m     % Ismember. Implicit display
      % STACK: 1

설명을 올바르게 이해하고 input을 입력 하면 중간 단계로 n크기 배열이 생성 n됩니다. 여기서 효율성이 기준이 아니라는 것이 좋습니다!
Toby Speight

2
물론 @ 토비! 이것은 효율성을 걱정하는 코드 골프입니까? :-D
Luis Mendo


6

PHP, 41 바이트

for(;$argn%-2==0;)$argn/=-2;echo$argn==1;

PHP, 52 바이트

echo($l=log(abs($argn),2))==($i=$l^0)&&$argn>0^$i%2;

PHP, 64 바이트

정규식 작업

echo preg_match("#^".($argn>0?1:"1+0")."(00)*$#",decbin($argn));

5

파이썬 3, 34 바이트

lambda n:n==(-2)**~-n.bit_length()

5

자바 스크립트 (ES6), 21 바이트

재귀 함수가 반환 0또는 true.

f=n=>n==1||n&&f(n/-2)

작동 원리

여기에는 입력이 정확한 -2의 거듭 제곱 이 아닌 경우 재귀를 조기에 중지하기위한 n홀수 또는 abs(n)1보다 작은 명시 적 테스트는 포함되지 않습니다 .

때 우리는 종료 n정확하게 중 동일 1또는 0.

그러나 산술 언더 플로로0 인해 IEEE-754 플로트가 2 (또는 -2)로 충분히 나눌 때 결국 반올림 되기 때문에 작동 합니다.

테스트 사례



4

자바 7, 55 바이트

boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

설명:

boolean c(int n){  // Method with integer parameter and boolean return-type
  return n==0 ?    //  If n is zero:
    0>1//false     //   Return false
   : n%-2==0 ?     //  Else-if n mod -2 is zero:
    c(n/-2)        //   Recursive call for the input divided by -2
   :               //  Else:
    n==1;          //   Return if n is one
}                  // End of method

테스트 코드 :

여기에서 시도하십시오.

class M{
  static boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

  public static void main(String[] a){
    for(int i = -2; i <= 4; i++){
      System.out.println(i + ": " + c(i));
    }
  }
}

산출:

-2: true
-1: false
0: false
1: true
2: false
3: false
4: true

비재 귀적 방법은 5 바이트 더 짧습니다 boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}.
Olivier Grégoire

OlivierGrégoire @ 하나에 대한 작업을하지 않는 불행하게도 것이 n=0있기 때문에, 자바 0%-2==0될 것입니다 true그리고 0/-2아직 0내가 추가 한 이유는 무한 루프, 원인, n==0?0>1내 재귀 방법 부분.
Kevin Cruijssen

멋지게 발견되었습니다!
Olivier Grégoire

4

하스켈, 24 23 바이트

f 0=0
f 1=1
f n=f(-n/2)

-2의 거듭 제곱 f을 반환 하는 함수 를 정의합니다 .10

다른 도전 에 대한 첫 번째 제출의 골프 버전 .


3

자바 스크립트 (ES7), 45 바이트

x=>-1**Math.log2(Math.abs(x))*Math.abs(x)==x

Math.abs (x)는 x> 0? x : -x, 11 바이트에서 8 바이트보다 깁니다. 두 번째 Math.abs (x)를 제거하려면 -1 대신 -2 ** ...를 수행 할 수 있어야합니다.
fəˈnɛtɪk

이것에 ES7은 무엇입니까?
Arjun

@ DobbyTheFree-Elf **입니다.
Qwertiy

3

펄 6 , 21 바이트

{$_==(-2)**(.lsb//0)}

시도 해봐

넓히는:

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

  $_                  # is the input
  ==                  # equal to
  (-2)**( .lsb // 0 ) # -2 to the power of the least significant bit of the input
}

참고 0.lsb반환 Nil정의 또는 운영자가 있으므로, 숫자로 사용하는 경우 경고를 생성하는  //데 사용됩니다.
(생각 //으로 ||다른 경사와)

용어가 예상되는 호출자가없는 메소드 호출이 암시 적으로 호출됩니다 $_. ( .lsb)

와 함께 작동합니다.msb .


난이게 좋아!
tale852150


3

파이썬 , 24 바이트

lambda n:n*n&n*n-1<n%3%2

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

비트 트릭 은 2의 거듭 제곱 (또는 ) k&k-1==0인지 확인합니다 . 로 확인하면 2의 거듭 제곱 인지 여부 를 알 수 있습니다.kk==0k=n*nn*n&n*n-1==0abs(n)

n-2의 거듭 제곱 인지 여부를 더 확인하려면 확인 만하면 n%3==1됩니다. 이것은 mod 3, 값 -2가 1과 같기 때문에 그 검정력은 1입니다. 반대로, 그들의 부정은 2 mod 3이며 0은 0 mod 3입니다.

우리는 수표를 결합 n*n&n*n-1==0하고 n%3==1하나의 표현으로. 첫 번째는 음수 가 아니므로 <1for 로 쓸 수 있습니다 ==0. 은 n%3==1동일합니다 n%3%20 또는 1 그래서 우리는 그들을 결합 할 수 있습니다 제공 n*n&n*n-1<n%3%2.


2

R, 22 바이트

stdin에서 입력을 가져 TRUE오거나 FALSE그에 따라 반환합니다 .

scan()%in%(-2)^(0:1e4)

이것이 R의 크기 제한까지의 정수에만 작동하기 때문에 이것이 올바른 대답이라고 100 % 확신하지 못하며 정수가 제한되지 않으면 작동하지 않습니다. 그러나 규칙은 다음과 같이 말합니다.

일반적인 정수 오버플로 규칙이 적용됩니다. 솔루션은 기본적으로 모든 정수가 바인딩되지 않은 가상의 (또는 아마도 실제) 버전의 언어에서 임의로 큰 정수를 사용할 수 있어야하지만 구현으로 인해 프로그램이 실제로 실패하는 경우 큰 정수를 지원하지 않으면 솔루션이 무효화되지 않습니다.

R의 가상 버전에서 않는 무제한의 정수, 우리는 같은 바이트 수를 들어, 다음 코드를 사용할 수 있도록 :

scan()%in%(-2)^(0:Inf)

물론 실제 R에서 위의 코드는을 제공합니다 Error in 0:Inf : result would be too long a vector.


2

기원전 88 바이트

bc -l <<< "n=$1;q=l(sqrt(n*n));p=4*a(1);((n<1)*c(q/l(2)*p/2)+(n>1)*(s(q/l(4)*p)))^2==0"

나는 이것을 파일에 가지고 있으며 다른 힘의 힘을 위해 neg2.sh인쇄 1합니다.-20

정말 길지만 재미있었습니다

테스트

$ for i in {-129..257}; do echo -n "$i: "; ./neg2.sh $i; done | grep ': 1'
-128: 1
-32: 1
-8: 1
-2: 1
1: 1
4: 1
16: 1
64: 1
256: 1

설명

본체에는 두 개의 반쪽이 있으며 모두의 거듭 제곱에 대해 0과 같습니다 -2.

q=l(sqrt(n*n))               % ln of the absolute value of the input
p=4*a(1)                     % pi: arctan(1) == pi/4
q/l(2) -> l(sqrt(n*n))/l(2)  % change of base formula -- this gives
                             % the power to which 2 is raised to equal
                             % sqrt(n*n). It will be an integer for 
                             % numbers of interest
n<1                          % 1 if true, 0 if false. for negative
                             % numbers check for powers of 2
n>1                          % for positive numbers, check for powers
                             % of 4
c(q/l(2)*p/2)                % cos(n*pi/2) == 0 for integer n (2^n)
s(q/l(4)*p)                  % sin(n*pi) == 0 for integer n (4^n)
(....)^2==0                  % square the result because numbers are
                             % not exactly zero and compare to 0

삼각법을 기대하지 않았습니다! 좋은 대답입니다!
Toby Speight


2

푸리에 , 53 바이트

I~X1~N~G0(0-2*G~GX*X~PG*G>P{1}{0~O~N}G{X}{1~O0~N}N)Oo

나중에 골프를 타려고하는데 이것의 개요는 다음과 같습니다.

X = User input
G = N = 1
Loop until N = 0
    G = -2 * G
    P = X*X 
    If G*G > P then
        N = O = 0
    End if
    If G = X then
        O = 1
        N = 0
    End if
End loop
Print O

어디 출력은 0대한 falsey1대한 truthy .

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


알고리즘 설명에서 P 변수를 사용하지 않고 G * G> X * X를 쓴다면 ...?
RosLuP

@RosLuP 그것은 더 나을 것이지만 푸리에는 단순히 그것을 다음과 같이 취급 할 것입니다.(G*G > X)*X
Beta Decay

2

카시오 베이직 , 76 바이트

76 바이트는 내 계산기에서 말하는 것입니다.

?→X
0→O
While Abs(X)≥1
X÷-2→X
If X=1
Then 1→O
IfEnd
WhileEnd
O

이것은 Casio BASIC에 대한 첫 번째 벤처입니다 ... 나는 그런 괜찮은 프로그램을 계산기에 쓸 수 있다는 것을 결코 깨닫지 못했습니다.


1

파이썬 2.7, 40 바이트

a=input()
while a%-2==0:a/=-2
print a==1

학점 씨 Xcoder 원본에 대한 코드 길이 43 바이트. 의견이 충분하지 않아 별도의 답변으로 게시해야했습니다.


나는 내 대답 버전이 보편적했습니다 이후 파이썬 2와 3 모두에서 작동 있도록, 당신은 추가해야 파이썬 3에서이 작업을 수행한다면 그것은, 종류 같은 일의의 int(input())어떤이의 한도를 초과 갈 것입니다 def-like 기능. 또한 파이썬 3에서는 print()1 바이트를 낭비하는 것을 사용해야합니다 . 그 이유는 파이썬 3에서는 길어지기 때문입니다.
Mr. Xcoder

1

망막 , 27 바이트

+`(1+)\1
$1_
^(1|-1_)(__)*$

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

Retina의 표준 인 단항 입력을받습니다. 첫 번째 두 줄은 Tutorial 항목 의 첫 두 줄 코드를 기반으로 부분 단항에서 이진 변환을 수행합니다 (외부 코드는 1어쨌든 일치하지 않을 것입니다). 마지막 줄은 4의 거듭 제곱 또는 음의 홀수 거듭 제곱을 확인합니다 둘 중

+`(1+)\1\1\1
$1_
^(-1)?1_*$

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

이번에는 기본 단항 변환에서 기본 단항 변환을 수행합니다. 4의 ^1_*$거듭 제곱은로 끝나고 2의 음의 거듭 제곱은로 끝납니다 ^-11_*$.

+`\b(1111)*$
$#1$*
^(-1)?1$

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

이번에는 가능한 한 4로 나누고 확인 1하거나 -11끝까지 확인했습니다 .

+`\b(1+)\1\1\1$
$1
^(-1)?1$

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

4로 나누는 또 다른 방법. 그리고 여전히 귀찮게 27 바이트 ...


1

체계, 60 바이트

(define(f n)(cond((= 1 n)#t)((<(abs n)1)#f)(#t(f(/ n -2)))))

재귀 솔루션.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.