+,-연산을 사용하지 않고 정수가 2의 거듭 제곱인지 확인 [닫기]


30

정수가 2의 거듭 제곱인지 확인하는 프로그램을 작성하십시오.


샘플 입력 :

8

샘플 출력 :

Yes

샘플 입력 :

10

샘플 출력 :

No

규칙 :

  • +, -작업을 사용하지 마십시오 .

  • 숫자를 얻으려면 일종의 입력 스트림을 사용하십시오. 입력은 변수에 초기에 저장되어서는 안됩니다.

  • 가장 짧은 코드 (바이트)가 이깁니다.

진실 / 거짓 응답을 사용할 수 있습니다 (예 : true/ false). 입력 번호가보다 크다고 가정 할 수 있습니다 0.


1
"yes"대신 "true"를 출력하고 "no"대신 "false"를 출력 할 수 있습니까?
ProgramFOX

2
예, 긍정적 / 부정적 반응을 사용할 수 있습니다. 질문이 업데이트되었습니다.
gthacoder

1
pred함수는 정수 n에 적용될 때 n-1을 반환합니다. 금지 된 연산자 주위의 얇은 변장 같은 함수도 금지됩니까?
Wayne Conrad

1
@Wayne은 golfscript )또는 대부분의 c 기반 언어와 같습니다 --.
Doorknob

2
나는 우리가 미래에 3 년이라는 것을 알고 있지만, "+/- 연산자"는 관찰 할 수 없거나 최소한 약하게 정의되어 있습니다.
ATaco

답변:


13

GolfScript, 6 자, 감소 없음

~.3/&!

다음 x & (x-1)어떤 형태로든 메소드를 사용하지 않는 솔루션입니다 . x & (x/3)대신 사용 합니다. ;-) 참 0이면 거짓이면 출력 1합니다.

설명:

  • ~ 입력 문자열을 회피하여 숫자로 변환
  • .그것을 복제합니다 (다음에 &).
  • 3/ 3으로 나눕니다 (잘라 내기).
  • & 원래 값으로 나눈 값의 비트 AND를 계산합니다. 입력이 0이거나 2의 거듭 제곱 (즉, 최대 하나의 비트 세트가있는 경우) 인 경우에만 0이됩니다.
  • ! 0을 1로, 다른 모든 값을 0으로 매핑하여 논리적으로 이것을 무시합니다.

노트:

  • 명확한 규칙에 따라 0은 유효한 입력이 아니므로1 입력이 0 인 경우 에도 출력되지만이 코드는 정상 입니다.

  • GolfScript 감소 연산자 (가 허용되면 aditsu게시 한 5 자 솔루션 이면 충분합니다. 그러나 그것은 문자가 아니라면 규칙의 정신에 위배 되는 것 같습니다 .~.(&!

  • 나는 x & (x/3)Fun With Perl 메일 링리스트에서 몇 년 전에 트릭을 생각 해냈다. (저는 그것을 처음 발견 한 것이 아니라고 생각하지만, 독립적으로 (재) 발행했습니다.) 여기 에는 실제로 작동한다는 증거를 포함 하여 원본 게시물에 대한 링크가 있습니다.


골프 스크립트를 사용하면 실제로 규칙을 어 기지 않고 OP가 제외하고 싶었던 정확한 솔루션을 작성할 수 있습니다.
Tim Seguine

1
@Tim : 좋아, 여기에 감소가없는 것이있다. ;)
Ilmari Karonen

이게 어떻게 작동할까요? 예를 들어 7/3 = 2 (0010), 7 & 2 = 0111 & 0010 = 0010마지막 비트가 1이 아닌 것이 분명합니다
phuclv

@ LưuVĩnhPhúc : 아니요,하지만 두 번째 비트입니다. 이진수로 3으로 긴 나누기를 시도하십시오. 배당에 하나 이상의 비트 세트가있는 경우 이것이 왜 발생하는지는 분명합니다.
Ilmari Karonen

아 나는 이것을 "2로 나눌 수있다"라고 잘못 읽었습니다
phuclv

15

APL (7)

예, 7 바이트 입니다. 유니 코드 대신 IBM 코드 페이지 907을 사용하고 각 문자가 바이트 인 순간을 가정하십시오. :)

0=1|2⍟⎕

0 = mod(log(input(),2),1)


궁금하거나, 0 또는 음수를 주면 어떻게됩니까?
aditsu

@aditsu 무한 모드 1이 무엇인지 모르지만 확실히 0이 되어서는 안됩니다 .
Tim Seguine

1
@TimSeguine Mathematica는 Indeterminate내가 시도 할 때 나 에게줍니다 .
LegionMammal978

7

GolfScript, 11 (1 (참) 및 0 (거짓))

.,{2\?}%?0>

스택에 숫자를 넣은 다음 실행하십시오.

GolfScript, 22 (예 / 아니오)

.,{2\?}%?0>'Yes''No'if

변환 어떻게 사랑 1/ 0Yes/ No도전 자체가 많은 코드로합니다 : D를

경고 : 매우 비효율적 인;) 최대 10000까지의 숫자에는 정상적으로 작동하지만 일단 그 높이에 도달하면 약간의 지연이 발생하기 시작합니다.

설명:

  • .,: ( 복제, 0..n 범위) n로 바뀝니다.n 0..n.,
  • {2\?}: 2의 거듭 제곱
  • %: "0..n"위에 "power of 2"를 매핑하여 n [1 2 4 8 16 ...]
  • ?0>: 배열에 숫자가 포함되어 있는지 확인합니다 (0이 인덱스보다 큼)

1
예 / 아니오의 경우 1 바이트 더 짧음 : .,{2\?}%?0<'YesNo'3/=; 또한 "스택에 숫자를 넣으십시오"라고 요청하여 부정 행위를하고 있다고 생각합니다 ~.
aditsu

1
1에서 실패, 2 ^ 0
Joachim Isaksson

6

매스 매 티카 28

Numerator[Input[]~Log~2]==1

2의 정수 제곱의 경우 밑이 2 인 로그의 분자는 1이됩니다 (로그가 단위 분수임을 나타냄).

여기에서는 추정 입력을 표시하도록 함수를 약간 수정합니다. 우리 는 순수한 기능을 정의하기 위해 #대신 사용 Input[]하고 추가 &합니다. 사용자가 위 함수에 숫자를 입력하면 반환되는 것과 동일한 답변을 반환합니다.

    Numerator[#~Log~2] == 1 &[1024]
    Numerator[#~Log~2] == 1 &[17]


거짓

한 번에 여러 숫자를 테스트합니다.

    Numerator[#~Log~2] == 1 &&/@{64,8,7,0}

{참, 참, 거짓, 거짓}


4

Perl 6 (17 자)

say get.log(2)%%1

이 프로그램은 STDIN get함수 에서 한 줄을 가져오고 밑이 2 인 로그 ( log(2))를 계산 하고 결과가 1 ( %%1, 여기서 %%연산자로 나눔)로 나뉘 는지 확인합니다 . GolfScript 솔루션만큼 짧지는 않지만 이것이 허용됩니다 (GolfScript는 모든 것을 이깁니다). 그러나 Perl 6이 느리다는 것을 고려하더라도 더 빠릅니다.

~ $ perl6 -e 'say get.log(2)%%1'
256
True
~ $ perl6 -e 'say get.log(2)%%1'
255
False

2
하는 이유 +-경우 때문에이 문제에 대한 금지이며, x & (x - 1)IS가 동일 0하고 x(2)의 힘
ProgramFOX가

@ProgramFOX : 알겠습니다. 재미있는 트릭.
Konrad Borowski

1
@ProgramFOX 그러나 x&~(~0*x)여전히 작동합니다. 길이는 2 자에 불과합니다.
orlp

4

옥타브 ( 15 23)

편집 : 사용자 입력 요구 사항으로 인해 업데이트되었습니다.

~mod(log2(input('')),1)

사용자가 값을 입력하고 1은 true, 0은 false를 출력합니다.

Octave에서 테스트되었으며 Matlab에서도 작동합니다.


Matlab에서도 작동 :)
jub0bs

4

13

Perl 솔루션을 기반으로합니다. 반환 FALSE또는 TRUE.

!log2(i)%%1

매개 변수 i는 입력 변수를 나타냅니다.

사용자 입력이있는 대체 버전 :

!log2(scan())%%1

4

골프 스크립트, 5

1을 true로, 0을 false로 출력합니다. user3142747의 아이디어를 기반으로 :

~.(&!

참고 : (같은 희망은 계산하지 않습니다, 감소입니다 -:)
는 않습니다 (그리고 OP의 코멘트가 수도하는 것이 좋습니다) 경우, 다음을 참조하십시오 Ilmari 카로 넨의 솔루션 대신.
Y / N 출력의 'NY'1/=경우 끝에 7 바이트를 더하십시오.


4

파이썬, 31

print 3>bin(input()).rfind('1')

31면bin(input()).rfind('1')<3
Blender

@Blender 잘 발견되었습니다. 나는 2==그것이 양수가 아닌 숫자에서도 작동해야한다고 생각했기 때문에 사용 했습니다. 그것은 규칙에 의해 명시 적으로 요구되지 않기 때문에 ...
boothby

1
+1. print bin(input()).count('1')<2총 31 자로 게시하려고 했지만 너무 비슷합니다.
Steven Rumbalski

4

C, 48

main(x){scanf("%i",&x);puts(x&~(x*~0)?"F":"T");}

단항 부정이 허용되면 더 짧을 수 있고 음수 상수가 허용되지 않으면 더 길 수 있습니다. 2의 보수를 가정합니다.
orlp

*binary보다 우선 순위가 높으므로 &parens가 필요하지 않습니다. 그리고 반환 값이 수락되면 (방금 요청한) exit(x&x*-1)훨씬 짧습니다.
Kevin

있습니다 -: x*-1.
klingt.net

@ klingt.net 예, 그러나 그것은 숫자 상수의 일부입니다. 엄밀히 말하면, 현재는 오퍼레이터 만이 -금지되어 있습니다.
Kevin

1
@ klingt.net 기호를 사용하지 않는 버전으로 교체했습니다.
orlp

4

인구 수 또는 측면 수 (1 비트 수)의 을 기반으로 다른 접근법을 사용하기로 결정했습니다 . 아이디어는 2의 모든 거듭 제곱은 정확히 하나의 1비트를 가지며 다른 숫자는 없다는 것입니다. 골프 경기에서 확실히 이길 수는 없지만 JavaScript 버전을 추가했습니다.

J, 14 15 자 (출력 0 또는 1)

1=##~#:".1!:1]1

자바 스크립트, 76 자 (참 또는 거짓 출력)

alert((~~prompt()).toString(2).split("").map(Number).filter(Boolean).length)

이것은 도전에 의해 배제되는 덧셈을 사용합니다.
FUZxxl

허. 이 글을 쓸 때 내가 무슨 생각을했는지 모르겠다. 이제 규칙을 따르도록 수정했다.
FireFly

4

클립 , 9 8 7

!%lnxWO

stdin에서 숫자를 읽습니다.

설명:

시작하는, Z= 0, W= 2O= 1이 허용의 배치 WO사용하는 반면, 서로 이웃 2하고 1분액 공간 (원하지 않는 추가적인 문자)없이 숫자 (21)로 해석 될 것이다. Clip에서 모듈러스 함수 ( %)는 정수가 아닌 정수에서 작동하므로 일부 값 v이 정수인지 확인하려면 vmod 1 = 0 인지 확인합니다. Clip 구문을 사용하면이 값이로 작성됩니다 =0%v1. 그러나 부울이 1(또는 다른 것) 으로 저장되어 있기 때문에 0무언가가 같은지 확인하는 0것은 단지 '하지 않습니다. 이를 위해 Clip에는 !연산자가 있습니다. 내 코드에서 v입니다 lnx2. xstdin의 입력입니다.n문자열을 숫자로 변환하고의 lablog base b입니다 a. 따라서이 프로그램은 (더 읽기 쉽게)로 번역됩니다 0 = ((log base 2 of parseInt(readLine)) mod 1).

예 :

8

출력

1

10

출력

0

편집 1 : 대체 0, 1그리고 2Z, OW.

편집 2 :로 대체 =Z되었습니다 !.

또한:

파이스 , 5

Pyth에는 일반 로그 (a, b) 대신 이미 평가 된 입력 및 log2 (a) 함수에 대해 Q가 있으므로 클립 버전을 더욱 압축합니다.

!%lQ1

3

자바 스크립트 (37)

a=prompt();while(a>1)a/=2;alert(a==1)

2로 반복해서 나누고 나머지를 확인하는 간단한 스크립트.


1
for루프 와 같은 아이디어 (또한 37 문자)for(i=prompt();i>1;i/=2){}alert(i==1)
수학 칠러

3

매스 매 티카 (21)

IntegerQ@Log2@Input[]

입력이 없으면 조금 짧습니다

IntegerQ@Log2[8]

참된

IntegerQ@Log2[7]

그릇된


⌊#⌋==#&@Log2@Input[]
alephalpha

1
@alephalpha UTF-8 문자에 24 바이트를 사용합니다. 다른 21 바이트 프로그램은 Log2@Input[]~Mod~1==0입니다.
LegionMammal978

2

JavaScript, 41 40 자

l=Math.log;alert(l(prompt())/l(2)%1==0);

작동 방식 : 2를 사용하여 로그를 가져옵니다. l(prompt()) / l(2) 결과 모듈로 1이 0이면 2의 거듭 제곱입니다.

예를 들어, log on base on 8 2을 얻으면을 얻습니다 3. 3 modulo 10과 같으므로 true를 반환합니다.

밑이 2 인 7의 로그를 취하면을 얻습니다 2.807354922057604. 2.807354922057604 modulo 1이 같으 0.807354922057604므로 false를 반환합니다.


입력을 숫자로 캐스트 할 필요는 없습니다. Math.log이미 할 것입니다 : "다음 Math 객체 함수의 각 인수 각각에 ToNumber 추상적 인 연산자를 적용 ..."
apsillers

수치 적으로 부정확하지 않습니까?
Mark Jeronimus

@ MarkJeronimus : 나는 실제로 모른다. 그럴 수도 있지만 아직 잘못된 결과가 발생하지 않았습니다.
ProgramFOX

2

자바 스크립트, 35

바이트에서 작동합니다.

alert((+prompt()).toString(2)%9==1)

46 자 버전 , 16 비트 숫자에서 작동합니다.

x=(+prompt()).toString(2)%99;alert(x==1|x==10)

이 트릭은 대부분의 동적 언어에서 작동합니다.

설명 : 숫자를 기수 2로 변환하고 해당 문자열을 기수 10으로 해석하고 모듈로 9를 수행하여 숫자 합계 (1이어야 함)를 가져 오십시오.


0x2ff베이스 2에서 어떤 것은 1111111111?
피터 테일러

@PeterTaylor 당신 말이 맞아요
복사

그래서 당신이하는 일은 나머지없이 모듈로 10을 확인하는 것이지만 9를 사용하여 코드의 문자를 면도했습니다 +1!
Math chiller

이것은 다소 부정 행위이지만 또 다른 방법입니다.alert(!(Number.MAX_VALUE%prompt()))
Pluto


2

파이썬 3, 38

print(1==bin(int(input())).count('1'))

파이썬, 32

그러나 코드가 모든 버전에서 작동하지는 않습니다.

print 1==bin(input()).count('1')

솔루션은 0 (인쇄 False)에도 작동합니다.


이것이 내 솔루션이기 때문에 공감되었습니다.
Josh Caswell

1
로 교체 ==하면 &어떻게됩니까?
SimonT

@SimonT 이것은 사실이 아닙니다. '=='을 '&'로 바꾸면 이진 표현에서 홀수 '1'을 갖는 모든 숫자에 대해 1이 인쇄됩니다. 예를 들어 7 = 111을 확인하십시오. 3 = 11 개가 있습니다. 11 & 1 = 1을 반환합니다.
Gari BN

2

루비 — 17 자 (4 번째 시도)

p /.1/!~'%b'%gets

내 현재 최고는 @steenslag의 답변과 내 자신의 융합입니다. 아래는 나의 이전 시도입니다.

루비 — 19 자 (세 번째 시도)

p /10*1/!~'%b'%gets

루비 — 22 자 (두 번째 시도)

p !('%b'%gets)[/10*1/]

루비 — 24 자 (첫 번째 시도)

p !!('%b'%gets=~/^10*$/)

there's still a "+" in your program
phuclv

I know. :-/ I've asked for clarification whether '+' and '-' are strictly forbidden, or whether they can be used in other contexts besides addition and subtraction. I'm in the process of rewriting regardless.
O-I

Great improvement. It seems like it's the best Ruby result so far. I updated the leaders table in the question text.
gthacoder

@gthacoder Just combined steenslag's regex with my binary formatting. Definitely can't take all the credit.
O-I

2

K/Kona (24 17)

d:{(+/(2_vs x))~1

Returns 1 if true and 0 if false. Any power of 2 has a single bit equal to 1:

2_vs'_(2^'(!10))
(,1
1 0
1 0 0
1 0 0 0
1 0 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0)

(this prints out all the powers of 2 (from 0 to 9) in binary)

So I sum up all the components of the binary expression of x and see if it's equal to 1; if yes then x=2^n, otherwise nope.

...knew I could make it smaller


@gthacoder: I made the code smaller, hope you can update you main post to reflect this!
Kyle Kanos

Doesn't this use addition? And doesn't the question, err, forbid that?
zgrep

2

C# (54 characters)

 Math.Log(int.Parse(Console.ReadLine()),2)%1==0?"Y":"N"

The task clearly states that input is not stored in a variable, it should be obtained from an input stream of some kind (like stdin), also, this is code-golf, try shortening your code a little, at least by removing whitespace
mniip

I think you just mean Int32, not ToInt32...
Chris

Ya ya. Thanks for pointing out Chris. Earlier it was Convert.ToInt32 and I wanted to change it to Int32.Parse to shorten it. :D
Merin Nakarmi

2
use int instead of Int32 for 2 fewer characters.
Rik

2

Rebmu (9 chars)

z?MOl2A 1

Test

>> rebmu/args [z?MOl2A 1] 7
== false

>> rebmu/args [z?MOl2A 1] 8 
== true

>> rebmu/args [z?MOl2A 1] 9 
== false

Rebmu is a constricted dialect of Rebol. The code is essentially:

z? mo l2 a 1  ; zero? mod log-2 input 1

Alternative

14 chars—Rebmu does not have a 'mushed' bitwise AND~

z?AND~aTIddA 3

In Rebol:

zero? a & to-integer a / 3


1

Python, 35

print bin(input()).strip('0')=='b1'

Doesn't use not only +/- operations, but any math operations aside from converting to binary form.

Other stuff (interesting, but not for competition):

I have also a regexp version (61):

import re;print re.match(r'^0b10+$',bin(input())) is not None

(Love the idea, but import and match function make it too long)

And nice, but boring bitwise operations version (31):

x=input();print x and not x&~-x

(yes, it's shorter, but it uses ~-x for decrement which comtains - operation)


boothby's answers uses the same idea as my first, but is shorter :(
Ivan Anishchuk

1

Python 2.7 (30 29 39 37)

EDIT: Updated due to user input requirement;

a=input()
while a>1:a/=2.
print a==1

Brute force, try to divide until =1 (success) or <1 (fail)


1
not a%2 can be written as a%2==0. Granted, this would be longer in many languages, but not Python.
Konrad Borowski

@xfix Thanks, tested and updated.
Joachim Isaksson

1
or even better, a%2<1.
boothby

you have a space after 2. Removing that would save a byte!
Keerthana Prabhakaran

1

Python (33)

print int(bin(input())[3:]or 0)<1

int(bin(input()*2)[3:])<1 also works from the python shell with only 25 chars.
gmatht


1

APL (12 for 0/1, 27 for yes/no)

≠/A=2*0,ιA←⍞ 

or, if we must output text:

3↑(3x≠/A=2*0,ιA←⍞)↓'YESNO '

Read in A. Form a vector 0..A, then a vector 20..2A (yes, that's way more than necessary), then a vector comparing A with each of those (resulting in a vector of 0's and at most one 1), then xor that (there's no xor operator in APL, but ≠ applied to booleans will act as one.) We now have 0 or 1.

To get YES or NO: multiply the 0 or 1 by 3, drop this number of characters from 'YESNO ', then take the first 3 characters of this.


1

C, 65 bytes

main(k){scanf("%i",&k);while(k&&!(k%2))k/=2;puts(k==1?"T":"F");}

You can cut off 5 chars by using main(k){..., relying on the implicit int typing. It might be UB, but this is code golf. NEVER use something like that in production, of course.
Kevin

1

Haskell (52 50)

k n=elem n$map(2^)[1..n]
main=interact$show.k.read
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.