삼각 제곱수


11

제곱 숫자n^2n이 정수인 형식입니다 . 이것을 제곱근이라고도합니다. 왜냐하면 제곱근을 취하면 정수가되기 때문입니다.

처음 10 개의 제곱 숫자는 다음과 같습니다. ( OEIS )

0, 1, 4, 9, 16, 25, 36, 49, 64, 81


삼각형 숫자 는 정삼각형을 형성 할 있는 숫자입니다. n 번째 삼각형 수는 1에서 n까지의 모든 자연수의 합과 같습니다.

처음 10 개의 삼각형 숫자는 다음과 같습니다. ( OEIS )

0, 1, 3, 6, 10, 15, 21, 28, 36, 45


정사각형 삼각형 숫자 는 정사각형과 삼각형 모두의 숫자입니다.

처음 10 제곱 삼각 숫자는 다음과 같습니다. ( OEIS )

0, 1, 36, 1225, 41616, 1413721, 48024900, 1631432881, 55420693056, 1882672131025, 63955431761796


무한한 수의 제곱 수, 삼각형 수 및 제곱 삼각 숫자가 있습니다.

입력 (매개 변수 또는 stdin) 숫자가 주어진 프로그램 또는 명명 된 함수를 작성하고 n, n제곱 삼각형 숫자를 계산 하고 출력 / 반환합니다. 여기서 n은 0이 아닌 양의 숫자입니다. (n = 1 인 경우 0을 반환)

프로그램 / 함수가 유효한 제출이 되려면 적어도 2 ^ 31-1보다 작은 모든 정사각형 삼각형 숫자를 반환 할 수 있어야합니다.

보너스

2 ^ 63-1 미만의 모든 정사각형 삼각형 숫자를 출력 할 수있는 -4 바이트

이론적으로 모든 크기의 정사각형 삼각형 수를 출력 할 수있는 -4 바이트

비 다항식 시간이 걸리는 솔루션에 +8 바이트 페널티.

보너스 스택.

이것은 코드 골프 챌린지이므로 가장 적은 바이트를 가진 답이 이깁니다.


더 빠른 코드를 목표로하는 사람들에게 더 공정하게 만들기 위해> O (n) 시간이 걸리는 솔루션에 8 바이트 페널티를 추가했습니다.
rodolphito

@Rodolvertice 나는 당신이 선형 시간을 의미한다고 생각하지 않습니다. 내가 가진 반복 솔루션은 n단계 가 있기 때문에 2 차 시간 이며 각 단계에서 숫자의 수가 선형으로 증가하기 때문에 산술에 선형 시간이 걸립니다 n. 나는 선형 시간이 가능하다고 생각하지 않습니다. 산술 연산이 일정한 시간을 말하는 것이 아니라면?
xnor

1
@Rodolvertice 나는 반복 솔루션이 O (n)이 아니라는 것을 의미합니다. 더 깨끗한 것은 "다항식 시간"이라고 말하는 것입니다. 선형 시간 산술을 가정하면 상수 시간이라고하는 지수를 사용하는 솔루션과 같은 이상한 일이 발생합니다. 할부 상환은 여기서 이루어지지 않습니다.
xnor


2
"처음 10 개의 사각형 삼각 숫자 ..." 확실히 11을 의미 했습니까? : P
Alex A.

답변:


8

CJam, 12 8 바이트

XUri{_34*@-Y+}*;

Wikipedia 기사의 반복 관계를 사용합니다.

코드 길이는 16 바이트이며 두 보너스를 모두 충족합니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

작동 원리

내 코드는 변수 대신 CJam의 스택을 사용한다는 점을 제외하고는 항상 모든 측면에서 xnor의 코드와 동일한 것으로 나타났습니다.

XU               e# Push 1 and 0 on the stack.
                 e# Since 34 * 0 - 1 + 2 = 1, this compensates for 1-based indexing.
  ri{        }*  e# Do int(input()) times:
     _34*        e#   Copy the topmost integer and multiply it by 34.
         @-      e#   Subtract the bottommost integer from the result.
           Y+    e#   Add 2.
               ; e# Discard the last result.

매우 큰 입력에 대해 즉시 실행되지만 3000 이상에서는 온라인 인터프리터에서 Javascript 범위 오류가 발생합니다. 자바 구현에서 시도해 볼 것입니다.
rodolphito

@ Rodolvertice : 반복적 인 접근 방식으로 전환했습니다. 실제로 짧고 메모리 집약도가 적습니다.
Dennis

8

파이썬 2, 45-4-4 = 37

a=1;b=0
exec"a,b=b,34*b-a+2;"*input()
print a

재귀를 사용하여 반복

f(0) = 1
f(1) = 0
f(k) = 34*f(k-1)-f(k-2)+2

이론적으로 이것은 모든 크기의 숫자를 지원하지만 기하 급수적으로 실행되므로 보너스를받을 수 없습니다. 어떤 크기의 숫자에서도 작동합니다. 예를 들어 100의 경우

1185827220993342542557325920096705939276583904852110550753333094088280194260929920844987597980616456388639477930416411849864965254621398934978872054025

재귀 솔루션은 41자를 사용하지만 지수 시간이 걸리기 때문에 자격이 없어야합니다.

f=lambda k:k>2and 34*f(k-1)-f(k-2)+2or~-k

문자열 곱셈에 의한 '루프', 하하.
rodolphito 2016 년

@Rodolvertice : 전혀 시끄럽지 않습니다. 오히려 영리하고 실제로 사이트에서 상당히 일반적입니다.
Alex A.

귀하의 재귀 솔루션이 보너스 # 1을받을 자격이 있다고 생각합니다 exec. 이 솔루션 과 관련이 있습니다. 재귀 제한을 변경할 수 있으면 모든 크기의 정사각형 삼각형 수를 계산하여 # 2에 적합하게 만들 수도 있습니다. 그러나 그것이 그 자격이 있는지 확실하지 않습니다 (@Rodolvertice).
Kade

7

Pyth, 16-4-4 = 8 바이트

OEIS 기사의 재귀 수식을 사용합니다.

K1uhh-*34G~KGtQZ

꽤 새롭고 정말 멋진 사후 할당 명령을 사용합니다. n-11 기반 인덱싱으로 인해 반복 사용 시간이 줄어 듭니다 .

K1            Set K=1
u       tQ    Reduce input()-1 times
         Z    With zero as base case
 hh            +2
  -           Subtract
   *34G       34 times iterating variable
   ~K         Assign to K and use old value
    G         Assign the iterating variable.

n 번 반복되고 각 반복마다 수학 및 대입을 수행하기 때문에 다항식처럼 보이지만 컴퓨터 과학자는 아닙니다. n = 10000을 거의 즉시 완료합니다.

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


나는 1,0이 아닌 0,1에서 하나의 반복을 시작하면 입력에서 1을 빼는 것을 피할 수 있다고 생각합니다. 내 파이썬 답변을 참조하십시오.
xnor

@ xnor : 나는 그가 이미 그렇게 생각합니다. 그러나 루프가 반환하는 결과는 b입니다.
Dennis

5

오아시스 , 7-4-4 = -1 (비경쟁)

34*c-»T

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

용도 a(0) = 0, a(1) = 1; for n >= 2, a(n) = 34 * a(n-1) - a(n-2) + 2

Oasis는 임의의 정밀 정수를 지원하므로 스택 오버플로가 발생하지 않는 한 임의의 숫자까지 올라갈 수 있습니다. 스택 오버플로로 인해 보너스로 계산되지 않는 경우 알려주십시오. 이 특정 알고리즘이 다항식이 아닌 경우도있을 수 있습니다.

언어는 날짜가 어려워 경쟁이되지 않습니다.

설명:

34*c-»T -> 34*c-»10

a(0) = 0
a(1) = 1
a(n) = 34*c-»

34*c-»
34*    # 34*a(n-1)
   c-  # 34*a(n-1)-a(n-2)
     » # 34*a(n-1)-a(n-2)+2

대체 솔루션 :

-35*d+T

대신에 a(n) = 35*(a(n-1)-a(n-2)) + a(n-3)


질문은 For n=1 return 0이지만 1을 반환합니다. -O 옵션추가하여 해결할 수 있습니다 .
그리미

4

자바 스크립트 (ES6), 29-4 = 25 바이트

n=>n>1?34*f(n-1)-f(n-2)+2:n|0

@IsmaelMiguel 덕분에 5 바이트를 절약했습니다 !

무한 재귀를 피하기 위해 0, 1 및 음수를 하드 코딩해야했습니다.

콘솔, 함수의 이름을 다음과 f같이 지정했습니다 .

f(1);  // 0
f(13); // 73804512832419600
f(30); // 7.885505171090779e+42 or 7885505171090779000000000000000000000000000

편집 : JavaScript가 숫자를 16 (15) 자릿수 (사양)로 반올림하면 숫자가 너무 커서 오버플로가 발생합니다. JavaScript 콘솔에 714341252076979033을 넣고 직접 찾으십시오. JavaScript의 한계가 있습니다.


나는 이것이 보너스를받을 자격이 없다고 생각합니다. 아닌, f(15)반환해야합니다 . 8517034385318045667685170343853180450000
Dennis

@Dennis JavaScript가 잘 려야합니다. .-. 그래, 자바 스크립트 라운드 16 자리
Downgoat

이것을 시도하십시오 : n=>n?n<2?0:34*f(n-1)-f(n-2)+2:1(31 바이트). 나는 다섯 번째 숫자까지 테스트했습니다.
Ismael Miguel

1
여기에 29 바이트 길이의 솔루션이 n=>n>1?34*f(n-1)-f(n-2)+2:!!n있습니다.. falseon 0, trueon 136on을 반환합니다 2. 당신이 숫자를 반환하려는 경우, 당신은 대체 할 수 !!n와 함께 +!!n.
Ismael Miguel

1
문제를 해결했습니다. 이것을 사용하십시오 : n=>n>1?34*f(n-1)-f(n-2)+2:n|0(동일 바이트 수, 이제 항상 숫자를 반환합니다)
Ismael Miguel

3

Excel VBA-90 바이트

Wikipedia 페이지에서 되풀이 관계 사용 :

n = InputBox("n")
x = 0
y = 1
For i = 1 To n
Cells(i, 1) = x
r = 34 * y - x + 2
x = y
y = r
Next i

실행되면 n을 입력하라는 프롬프트가 표시되고 n까지의 시퀀스가 ​​열 A에 출력됩니다.

산출

오버플로 오류가 발생하기 전에 n = 202까지 실행할 수 있습니다.


2

[경쟁 불가] Pyth (14-4-4 = 6 바이트)

K1u/^tG2~KGQ36

OEIS 에서 첫 번째 반복을 사용 했는데, 0,1,36 후에 A n = (A n-1 -1) 2 / A n-2를 찾을 수 있습니다. A이 솔루션은 36에서 시작하기 때문에 경쟁하지 않습니다. 더 낮아지면 0으로 나눕니다 (따라서 0을 입력하면 36이됩니다). 또한 36을 하드 코딩해야했습니다.

여기 사용해보십시오


2

자바, 53-4 = 49 바이트

그것은 또 다른 간단한 재귀이지만, 종종 <50 점수로 Java를 게시하지 못합니다.

long g(int n){return n<2?n<1?1:0:34*g(n-1)-g(n-2)+2;}

이제 뭔가를 -recursive, 그것은 꽤 길어집니다. 이것은 더 길고 (112-4 = 108) 느리기 때문에 반복적 인 것을 제외하고 게시하는 이유를 모르겠습니다.

long f(int n){long a=0,b,c,d=0;for(;a<1l<<32&n>0;)if((c=(int)Math.sqrt(b=(a*a+a++)/2))*c==b){d=b;n--;}return d;}

2

줄리아, 51 바이트-4-4 = 43

f(n)=(a=b=big(1);b-=1;for i=1:n a,b=b,34b-a+2end;a)

이는 Wikipedia 페이지에 나열된 첫 번째 반복 관계를 사용하여 정사각형 삼각형 수를 사용합니다. 0.006 초에서 n = 1000을, 6.93 초에서 n = 100000을 계산합니다 . 그것은 몇 바이트 이상 재귀 솔루션보다 있어요하지만 그건 방법 빨리.

언 골프 + 설명 :

function f(n)
    # Set a and b to be big integers
    a = big(1)
    b = big(0)

    # Iterate n times
    for i = 1:n
        # Use the recurrence relation, Luke
        a, b = b, 34*b - a + 2
    end

    # Return a
    a
end

예 :

julia> for i = 1:4 println(f(i)) end
0
1
36
1225

julia> @time for i = 1:1000 println(f(i)) end
0
... (further printing omitted here)
elapsed time: 1.137734341 seconds (403573226 bytes allocated, 38.75% gc time)

2

PHP, 65 59 56-4 = 52 바이트

while($argv[1]--)while((0|$r=sqrt($s+=$f++))-$r);echo$s;

의 제곱근 때까지 반복 $s∈ℤ입니다 : 추가 $f$s, 증가 $f;
반복 $argv[1]시간.
출력 합계.


1

프롤로그, 70 74-4-4 = 66

n(X,R):-n(X,0,1,R).
n(X,A,B,R):-X=0,R=A;Z is X-1,E is 34*B-A+2,n(Z,B,E,R).

n(100,R)출력을 실행 :

X = 40283218019606612026870715051828504163181534465162581625898684828251284020309760525686544840519804069618265491900426463694050293008018241080068813316496

n(10000,X)내 컴퓨터 에서 실행 하는 데 약 1 초가 걸립니다 .

편집 : 66 버전은 꼬리 재귀입니다. 이전 비 꼬리 재귀 버전은 다음과 같습니다.

n(X,[Z|R]):-X>1,Y is X-1,n(Y,R),R=[A,B|_],Z is 34*A-B+2;X=1,Z=1,R=[0];Z=0.

바이트 길이는 동일하지만 비 재귀 재귀는 특정 지점 (내 컴퓨터에서 약 20500)을지나 스택 오버플로를 생성합니다.


1

자바 스크립트 ES6, 77 75 71 자

// 71 chars
f=n=>{for(q=t=w=0;n;++q)for(s=q*q;t<=s;t+=++w)s==t&&--n&console.log(s)}

// No multiplication, 75 chars
f=n=>{for(s=t=w=0,q=-1;n;s+=q+=2)for(;t<=s;t+=++w)s==t&&--n&console.log(s)}

// Old, 77 chars
f=n=>{for(s=t=w=0,q=-1;n;s+=q+=2){for(;t<s;t+=++w);s==t&&--n&console.log(s)}}
  • 해결책은 선형입니다.
  • 이 솔루션은 숫자 유형으로 인해 2 ^ 53보다 작은 모든 숫자를 출력 할 수 있습니다.
  • 알고리즘 자체는 무제한으로 사용할 수 있습니다.

테스트:

f(11)

0
1
36
1225
41616
1413721
48024900
1631432881
55420693056
1882672131025
63955431761796


1

젤리 , 13-8 = 5 바이트

이것은 두 보너스 모두에 해당됩니다.

×8‘,µÆ²Ạ
0Ç#Ṫ

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

채팅 에서 caird 공동 창업 과 함께 완료했습니다 .

설명

× 8 ', µÆ²Ạ ~ 도우미 링크.

숫자의 × 8 ~ 8 배.
  '~ 증가.
   , ~ 현재 번호와 쌍을 이룹니다.
    µ ~ 새로운 모나 딕 (1-arg) 링크를 시작합니다.
     Ʋ ~ Vectorized "Is Square?"
       Ạ ~ 모두. 둘 다 진실 인 경우에만 1을 리턴하십시오.



0Ç # Ṫ ~ 메인 링크.

0 # ~ 0부터 시작하여 첫 번째 N 정수를 적용하여 정확한 결과를 얻습니다.
 Ç ~ 모나드로서의 마지막 링크.
   Ṫ ~ 마지막 요소. 암시 적으로 출력합니다.



0

APL (NARS), 67 자, 134 바이트

r←f w;c;i;m
c←0⋄i←¯1⋄r←⍬
→2×⍳0≠1∣√1+8×m←i×i+←1⋄r←r,m⋄→2×⍳w>c+←1

테스트:

  f 10
0 1 36 1225 41616 1413721 48024900 1631432881 55420693056 1882672131025 

f는 2 차 순서로 삼각형 숫자 인 요소도 검색하므로 APL의 삼각형 검사 공식을 따라야합니다.

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