정사각형이 엉덩이


44

도전

음, 우리는 제곱 숫자 나 다른 모양의 숫자로 작동하는 많은 난제들이 있지만, 간단히 묻는 것은 없습니다.

입력으로 정수 n(where n>=0)가 주어지면 n완전한 제곱이면 true 값을, 그렇지 않으면 false 값을 반환합니다.


규칙

  • 표준 I / O 규칙 에서 허용하는 한 합리적이고 편리한 수단으로 입력 할 수 있습니다 .
  • 선택한 언어가 기본적으로 처리 할 수있는 것보다 부동 소수점 부정확성을 초래하는 것보다 큰 입력을 처리 할 필요는 없습니다.
  • 출력은 두 가지 일관된 진실 / 거짓 값 중 하나 여야합니다 (예 : true또는 false, 1또는 0). 입력이 완벽한 제곱이면 진실이고 그렇지 않으면 거짓입니다.
  • 이것은 이므로 바이트 수가 가장 적습니다.

테스트 사례

Input:  0
Output: true

Input:  1
Output: true

Input:  64
Output: true

Input:  88
Output: false

Input:  2147483647
Output: false

@ 닐 나는 내 실수를 깨달았다. 나는 그 제안을 철회하는 대신 제공 18014398509481982( 2**54-2있는) 입니다 이중으로 표현할 수있는, 사용이 있다는 응답 원인이 sqrt실패합니다.
Mego

@ Mego 아마 틀렸거나 당신이 말하는 것을 오해하지만 2**54-2, 적어도 JavaScript에서 더블 핸들이 안전하게 처리 할 수있는 것보다 여전히 큽니다.18014398509481982 > 9007199254740991
Tom

@ Mego 제한 값은 9007199515875288이라고 생각합니다. 94906267의 제곱이 아닙니다. 더블로 표현할 수 없기 때문에 제곱근을 취하면 그 정수를 결과로 얻습니다.
Neil

@Tom 2**54-2JS 콘솔에 입력 하고 얻은 18014398509481982값 (정확한 값)을 비교하십시오. JS는 정확한 값을 출력하므로 2**54-2이중으로 표현할 수 있습니다. 그래도 확신하지 못하면 이진 데이터를 가져 와서 0100001101001111111111111111111111111111111111111111111111111111IEEE-754 배정 밀도 부동 소수점으로 해석하고 얻는 가치를 확인하십시오.
Mego

3
죄송합니다. 점심 먹으러갔습니다. 그리고 나는 이것이 좋은 간단한 도전이라고 생각했습니다! 선택한 언어에서 부동 소수점 부정확성을 초래하는 입력을 처리 할 필요가없는 규칙을 추가 할 수 있습니까?
얽히고 설킨

답변:


27

Neim , 2 바이트

q𝕚

설명:

q      Push an infinite list of squares
 𝕚     Is the input in that list?

'무한'이라고 말하면 최대 long 값 (2 ^ 63-1)에 도달 할 때까지 의미가 있습니다. 그러나 Neim은 이론적으로 무한히 큰 BigInteger로 (천천히) 전환하고 있습니다.

시도 해봐!


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Dennis

흥미 롭군 그렇다면이 목록을 사전 버퍼링합니까, 아니면 입력이 끝날 때까지 계속 입력을 확인하는 생성기 / 반복기입니까?
Patrick Roberts

@PatrickRoberts 채팅으로 대화 할 수 있습니까?
Okx

물론, The Nineteenth Byte 에서 저를 핑합니다 . 나는 가끔 거기에있다.
Patrick Roberts

글쎄, 이것은 ... 진짜 기능
Chromium


8

TI 기본, 4 바이트

not(fPart(√(Ans

0이 아닌 분수 / 소수 부분을 찾아 제곱근이 정수인지 간단히 확인하십시오.


TIO (또는 이와 동등한)를 추가 할 수 있습니까?
얽히고 설킨

@ Shaggy 나는 아무것도 없다고 생각합니다. TI-Basic은 독점적이며 계산기에서 ROM을 실행하는 TI의 계산기 및 에뮬레이터에서만 실행되므로 계산기를 소유하지 않은 경우 법적으로 TI-Basic을 사용할 수 없습니다.
Adám

1
@Shaggy ROM이있는 경우 에뮬레이터 (내 환경 설정은 jstified)를 사용하여 온라인으로 시도해 볼 수 있습니다.
Timtech

8

C #, 27 바이트

n=>System.Math.Sqrt(n)%1==0

이를위한보다 정확하고 정확한 방법 은 다음과 같습니다.

n=>System.Math.Sqrt(n)%1<=double.Epsilon*100

double.Epsilon은 이러한 유형의 검사에 쓸모가 없습니다 . tl; dr : 숫자> 2를 비교할 때 Double.Epsilon은 기본적으로 0과 같습니다. 100을 곱하면 그 비트 만 지연됩니다.
Robert Fraser

@RobertFraser 나는 단지 연결된 SO 게시물로 갔고 그것에 대해 많이 읽지 않았습니다. 어느 쪽이든 그것은 더 큰 숫자에서 유용하지 않은 것은 쓸모가 없습니다.
TheLethalCoder

...<int>==0있다 ...!<int>생각
스탠 스트 럼에게

@StanStrum C #에 없음
TheLethalCoder

7

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

n=>!(n**.5%1)

n의 제곱근이 정수이면 true를 반환합니다.

단편:

f=
n=>!(n**.5%1)

console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(4));
console.log(f(8));
console.log(f(16));
console.log(f(88));
console.log(f(2147483647));


7

dc, 9

0?dvd*-^p

truey이면 1을 출력하고 false이면 0을 출력합니다.

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

0            # Push zero.  Stack: [ 0 ]
 ?           # Push input.  Stack: [ n, 0 ]
  dv         # duplicate and take integer square root.  Stack: [ ⌊√n⌋, n, 0 ]
    d        # duplicate.  Stack: [ ⌊√n⌋, ⌊√n⌋, n, 0 ]
     *       # multiply.  Stack: [ ⌊√n⌋², n, 0 ]
      -      # take difference. Stack: [ n-⌊√n⌋², 0 ]
       ^     # 0 to power of the result.  Stack: [ 0^(n-⌊√n⌋²) ]
        p    # print.

dc^지수 명령을주는 0 0 = 1, 0 , N = 0, N> 0.


아름다운! dc독창적 인 방식으로 사용하기 위해 +1 .
와일드 카드

6

레티 나 , 18 바이트

.+
$*
(^1?|11\1)+$

온라인으로 사용해보십시오! @MartinEnder의 대답 뻔뻔스럽게 조정되었습니다 . 그러나 기본 변환에는 6 바이트의 비용이 포함되어 있습니다.

이 숫자가 삼각형입니까? 삼각형 숫자로 0을 지원하는 데 필요한 이유가 없었기 때문에 적응의 일부는 앞에 ?1을 선택적으로 지정하여 그룹을 빈 문자열과 일치시킬 수 있도록 0을 입력하는 것이 었습니다. 그러나 이제 빈 문자열과 일치하면 +연산자가 반복을 중지 하여 빈 문자열과 탐욕스럽게 일치하는 경우 무한 루프가 발생하지 않도록합니다 (결국 ^1?계속 일치하게 됨). 이것은 그룹의 다른 대안과도 일치하지 않기 때문에 2, 6, 12 등의 일치를 피합니다. @MartinEnder가 지적했듯이 빈 문자열과 일치하는 동안 피하는 간단한 방법은 동일한 바이트 수에 대해 그룹을 선택적으로 만들면서 시작시 일치를 고정하십시오 ^(^1|11\1)*$.


당신의 설명을 기대하는 이유는 일치하지 않는 2, 6또는 형태의 다른 숫자 n^2-n. ;) (같은 바이트 수에 대한 설명을 피하는 방법은 다음과 같습니다 ^(^1|11\1)*$.)
Martin Ender

@MartinEnder 당신이 사용할 수 없었던 것과 같은 이유 (^|1\1)+$라고 생각합니다.
Neil

그래 맞아. 아마도 대부분의 사람들이 삼각 답변에 대한 내 의견을 읽지 않았기 때문에 언급하는 것이 좋을 것이라고 생각했습니다.이 경우 골프를 칠 수없는 이유와는 달리 솔루션이 올바른 이유와 실제로 관련이 있습니다. ).
Martin Ender 2016 년

레코드의 +경우 빈 대안이 더 이상 없으면 (예 :의 경우) 루핑이 중지됩니다 ((?(1)11\1|1?))+. 빈 반복이 있으면 비어 있는지 여부에 관계없이 더 이상 시도하지 않습니다.
Martin Ender 2016 년

@MartinEnder 실제로, "즉시 일치하는 것"대신 "지금 일치하는 것"을 의미했습니다. 결정된.
Neil


6

MATL , 5 4 바이트

1 바이트 더 긴 코드를 2 바이트 씩 줄여서 가장 짧은 코드로 만든 Luis에게 감사합니다.

t:Um

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

설명:

         % Implicit input
t        % Duplicate it
 :       % Range from 1 to input value
  U      % Square the range, to get 1 4 9 ... 
   m     % ismember, Checks if the input is a member of the range of perfect squares

오래된 답변 :

X^1\~

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

        % Implicit input
X^      % Square root of input
  1\    % Modulus 1. All perfect squares will have 0, the rest will have decimal value
     ~  % Negate, so the 0 becomes 1, and the decimal values become 0

@Mego 동의하지 않습니다. MATL도 할 수 없습니다 mod(2**127-, 1000). 않는 마지막 4 개 자리는 0입니다 ....
스튜이 그리핀

을 사용할 수도 있습니다 t:Um. 부동 소수점 제한 정밀도로 인해 최대2^53 입력 까지 작동합니다.
Luis Mendo

나는 이것이 당신의 편집과 비슷하다는 것을 알았습니다, 조금 더 짧습니다 :-)
Luis Mendo

잘 숨겨진 사각형 명령! U: str2num / string to array / square. 사각형 함수가 있어야한다는 것을 알았지 만 찾을 수 없었습니다 ...
Stewie Griffin

1
@cairdcoinheringaahing 부분적으로 의도적이었습니다. 하나는 5 바이트이고 다른 하나는 6 바이트였습니다. Luis는 6으로 1 바이트에서 2 바이트를 떨어 뜨 렸습니다. 따라서 그 덕분에 2 바이트를 절약 할 수 있었지만 점수에 1 바이트 만 저장했습니다.
Stewie Griffin

6

파이썬 3 , 40 38 바이트

2 바이트를 절약 한 오징어 덕분에!

lambda n:n in(i*i for i in range(n+1))

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

2147483647적절한 시간 내에 답변을 반환하기에는 너무 느립니다 . (하지만 바이트를 사용하지 않기 때문에 메모리를 절약하기 위해 생성기를 사용하여 작성했습니다.)

파이썬 2에서도 작동하지만 거대한 입력으로 시도하면 OverflowError가능성이 range있습니다. (A MemoryError로 인해 Python 2에서도 가능성이 높습니다 range.)



5

예를 들어, 많은 작동하지 않습니다4111817668062926054213257208
Emigna

@Emigna 오 오래 걸리기 때문에? 05AB1E는 Python 3을 사용한다고 생각했습니다.
Erik the Outgolfer

큰 입력에 실패합니다 (주어진 입력은 2**127-1메르 센 소수입니다).
Mego

파이썬 3을 사용합니다. 문제는 제곱근에 많은 수의 반올림 오류가 있다는 것입니다.
Emigna

@Emigna 오 ... 나는 다른 방법을 찾아야 할 것 같아요. 힘들지 않아야합니다.
아웃 골퍼 에릭

5

파이썬 3 , 19 바이트

lambda n:n**.5%1==0

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


큰 입력에 실패합니다 (예 :) 4111817668062926054213257208.
L3viathan

25 바이트로 수정 :lambda n:int(n**.5)**2==n
L3via 11

4
@ L3viathan (와 관련된 모든 솔루션과 함께 sqrt)와 같이 double 범위를 벗어난 값 에서는 실패합니다 2**4253-1.
Mego

@totallyhuman float 후에 %1는 확실히 <1이므로 제안은 모든 입력에 대해 true를 반환합니다. 참고 n**.5부동이다.
Leaky Nun


5

Japt , 3 바이트

¬v1

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

Japt Interpreter2**54-2 에서 잘 작동하는 것 같지만 어떤 이유로 TIO에서 실패합니다 ...


큰 입력에 실패합니다 (입력은 2**127-1Mersenne 소수 임).
Mego

@ Mego, 솔루션이 언어가 처리 할 수있는 것보다 더 큰 수를 처리 할 필요가없는 것은 아닌가?
얽히고 설킨

@Shaggy Japt는 배정 밀도 부동 소수점을 사용하는 JavaScript를 기반으로합니다. 2**127-1이중 범위 내에 있습니다.
Mego

2
@Mego JavaScript의 max safe int 2**53-1아닌가요?
Tom

3
@Mego 그러나 JavaScript의 숫자는 정밀도가 53 비트이므로 JS 2**127-1을 숫자로 정확하게 나타낼 수 없습니다 . 얻을 수있는 가장 가까운 것은입니다 2**127.
ETHproductions



5

MathGolf , 1 바이트

°

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

나는 설명이 필요하다고 생각하지 않습니다. 언어가 수학 관련 골프 문제를 처리하도록 설계 되었기 때문에이 과제를보기 전에 "완벽한 정사각형"연산자가 필요하다는 것을 알았습니다. MathGolf는 정수를 사용하여 부울을 표시하므로 0 또는 1을 리턴합니다.


4

PHP, 21 바이트

<?=(-1)**$argn**.5<2;

제곱근이 정수가 아닌 경우 (-1)**$argn**.5입니다 NAN.


이것을 어떻게 실행합니까?
Titus

@Titus -F플래그 및 파이프 라인 : echo 144 | php -F script.php.
user63956

아 나는 f그 편지를 잊었다. 감사.
Titus

4

루비, 25 바이트

Math.sqrt(gets.to_i)%1==0

아마도 더 짧은 방법이 있지만 그것이 내가 찾은 전부입니다.

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


:) PPCG에 오신 것을 환영합니다 당신은 추가 할 수 TIO 이에 (또는 동급)을하십시오?
얽히고 설킨

그러나 TIO를 추가해 주셔서 감사하지만 출력을 반환하지 않는 것 같습니다.
얽히고 설킨

내 나쁜, 나는 그것을 업데이트했다.
Gregory

아직 작동하지 않습니다.
얽히고 설킨

3

CJam , 8 바이트

ri_mQ2#=

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

설명

정수 제곱근, 제곱, 원래 숫자와 비교합니다.


나는 이것 에 따르면 , 당신은 처음 2 바이트가 필요하지 않습니다
Chromium

또는 대안 으로이 답변 의 아이디어를 사용하여 mq1%0=6 바이트를 수행 할 수도 있습니다.
Chromium

@Chromium 고맙지 만,이 경우 코드를 함수로 만들기 위해 {... }같은 바이트 수를 만들어야합니다.
Luis Mendo

실제로 중괄호를 추가할지 여부는 약간 혼란 스럽습니다. Cuz 당신이 그것들을 추가하지 않으면, 그것은 실제로 허용되는 프로그램입니다.
Chromium

@Chromium 프로그램은 입력을 받아야하므로 ri그 경우에 필요합니다
Luis Mendo

3

Mathematica, 13 바이트

AtomQ@Sqrt@#&

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


내장되어 있지 않습니까? Odd ....
TheLethalCoder

1
AtomQ대신 사용할 수 있습니다 IntegerQ.
Martin Ender 2016 년

1
얽히고 설킨 ...
J42161217

1
계속 사용할 수 있습니다 @*.
Martin Ender 2016 년

4
AtomQ@*Sqrt의 동의어입니다 AtomQ@Sqrt@#&. 예를 들어, AtomQ@*Sqrt@4Returns Trueand AtomQ@*Sqrt@5returns False. (우선 순위 AtomQ@*Sqrt[4]로 돌아가서 제대로 작동하지 않습니다 AtomQ@*2.)
Greg Martin


3

AWK , 27 + 2 바이트

{x=int($0^0.5);$0=x*x==$1}1

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

임의 정밀도로 플래그 +2를 사용하기 위해 바이트를 추가하십시오 -M. 원래는 문자열 비교를 사용했지만 많은 수는 같지 않았지만 동일하게 비교했지만 sqrt부정확 한 값을 반환했습니다. 2^127-2완벽한 사각형이되어서는 안됩니다.


3

T-SQL, 38 바이트

SELECT IIF(SQRT(a)LIKE'%.%',0,1)FROM t

제곱근에서 소수점을 찾습니다. IIFMS SQL에만 적용되며 MS SQL Server 2012에서 테스트 및 작동합니다.

입력 규칙은 입력 테이블 에 따라 기존 테이블 t 의 열 a 에 있습니다.


3

, 2 바이트

Ʋ

CP-437인코딩을 사용합니다 .

설명

암시 적 입력-> 완벽한 정사각형 내장-> 암시 적 출력 ...


3

자바 8, 20 바이트

n->Math.sqrt(n)%1==0

입력은입니다 int.

여기에서 시도하십시오.


논란의 여지가 없다 :이 질문은 "정수 n (여기서 n> = 0)"이라고 명시 적으로 말한다. 가장 짧은 답변이 가장 좋습니다. 편집 : 가장 짧은 답변이 첫 번째가 될 때까지 +1하지 않습니다 : p
Olivier Grégoire

@ OlivierGrégoire 흠, 그것을 보는 좋은 방법입니다. 하지만 당신은 여전히이인지 모르겠다 int, long, short. 그리고 그들이 정수를 요구하지만 입력 형식이 융통성있는 질문으로 때로는 바이트 입력을 사용하여 바이트를 절약합니다. 개인적으로 사용하는 n->것이 좋다고 생각 하므로 유형이 무엇인지 말해야하지만 모든 사람이 이에 동의하지는 않습니다. 반면에, 자바 7 응답 역사에서 오는 것 int c(int n){return ...;}(int n)->...비해 차종 더 의미 n->...(개인적 물론 짧은 이후로 두 번째를 선호에도 불구하고).
Kevin Cruijssen

2
@ OlivierGrégoire 좋아, 나는 그것을 바꿨다. 이 답변 에서 토론을 읽은 후 입력이 Java에서 정수라고 말하는 것은 입력이 CJam에있는 두 개의 문자열 목록 또는 MATL에있는 문자열의 셀 배열 이라고 말하는 것과 차이가 없다는 결론에 도달했습니다 .
Kevin Cruijssen


3

추가 ++ , 24 13 11 바이트

+?
S
%1
N
O

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

상단에서 어수선한 기능을 제거하고 11 바이트를 제거하기 위해 질문 본문에 다시 작성했습니다.

첫 번째 섹션은 아래에서 이미 설명 했으므로 새 부품의 작동 방식 만 알아 보겠습니다.

S   Square root
%1  Modulo by 1. Produced 0 for integers and a decimal for floats
N   Logical NOT

이전 버전, 24 바이트

D,i,@,1@%!
+?
^.5
$i,x
O

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

상단 ( D,i,@,1@%!) 의 기능 은 프로그램의 주요 부분이므로 더 자세히 살펴 보겠습니다.

D,     Create a function...
  i,   ...called i...
  @,   ...that takes 1 argument (for this example, let's say 3.162 (root 10))
    1  push 1 to the stack; STACK = [1, 3.162]
    @  reverse the stack;   STACK = [3.162, 1]
    %  modulo the stack;    STACK = [0.162]
    !  logical NOT;         STACK = [False]

+?     Add the input to accumulator (x)
^.5    Square root (exponent by 0.5)
$i,x   Apply function i to x
O      Output the result

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