N보다 작은 홀수 제곱 합


19

입력 값보다 작은 홀수 제곱수 (OEIS # A016754) 의 합계출력 하는 프로그램 또는 함수 를 작성하십시오 . n

시퀀스에서 처음 44 개의 숫자는 다음과 같습니다.

1, 9, 25, 49, 81, 121, 169, 225, 289, 361, 441, 529, 625, 729, 841, 961, 1089, 
1225, 1369, 1521, 1681, 1849, 2025, 2209, 2401, 2601, 2809, 3025, 3249, 3481, 
3721, 3969, 4225, 4489, 4761, 5041, 5329, 5625, 5929, 6241, 6561, 6889, 7225, 7569

시퀀스의 공식은 a(n) = ( 2n + 1 ) ^ 2입니다.

노트

  • 프로그램의 동작이 정의되지 않았을 수 있습니다 n < 1(즉, 모든 유효한 입력은) >= 1.

테스트 사례

1 => 0
2 => 1
9 => 1
10 => 10
9801 => 156849
9802 => 166650
10000 => 166650

1
이것에 대한 가까운 이유 중 어느 것도 도전을 닫는 유효한 이유가
아닙니다

답변:


22

젤리, 6 바이트

½Ċ|1c3

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

배경

모든 양의 정수 k 에 대해 1² + 3² + ⋯ + (2k-1) ² = k (2k-1) (2k +1) ÷ 3 입니다.

m C r = m 이 있으므로 ! ÷ ((mr)! r!) r -m 요소 집합의 조합으로 위의 값은 (2k + 1) C 3 = (2k + 1) 2k (2k-1) ÷ 6 = k (2k -1) (2k + 1) ÷ 3.

공식을 적용하려면 (2k-1) ² <n 과 같이 가장 높은 2k + 1을 찾아야합니다 . 잠시 동안 패리티를 무시하면 (m-1) ² <n as m = ceil (srqt (n)) 과 같이 가장 높은 m을 계산할 수 있습니다 . 짝수 인 경우 조건부로 m을 증가 시키려면 간단히 m | 1 (비트와 OR 1 ).

작동 원리

½Ċ|1c3  Main link. Argument: n

½       Compute the square root of n.
 Ċ      Round it up to the nearest integer.
  |1    Bitwise OR with 1 to get an odd number.
    c3  Compute (2k + 1) C 3 (combinations).

6

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

f=(n,i=1)=>n>i*i&&i*i+f(n,i+2)

f(1)false 대신 0을 리턴해야하는 경우 31 바이트 :

f=(n,i=1)=>n>i*i?i*i+f(n,i+2):0

6

05AB1E , 10 8 바이트

암호:

<tLDÉÏnO

설명:

<         # Decrease by 1, giving a non-inclusive range.
 t        # Take the square root of the implicit input.
  L       # Generate a list from [1 ... sqrt(input - 1)].
   DÉÏ    # Keep the uneven integers of the list.
      n   # Square them all.
       O  # Take the sum of the list and print implicitly.

유용 할 수 있습니다 : t;L·<nO.

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오! .


6

하스켈, 30 바이트

f n=sum[x^2|x<-[1,3..n],x^2<n]

놀랍게도 정상적인 모습.


4

C #을 126 131 바이트

새로운 질문에 맞게 편집 된 버전 :

class P{static void Main(){int x,s=0,n=int.Parse(System.Console.ReadLine());for(x=1;x*x<n;x+=2)s+=x*x;System.Console.Write(s);}}

하드 코딩 된 한계 사용 :

using System;namespace F{class P{static void Main(){int x,s=0;for(x=1;x<100;x+=2)s+=x*x;Console.Write(s);Console.Read();}}}

4
프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 여기서 응답 헤더의 합의 된 형식은 # Language name, number bytes일관성을위한 것입니다.
고양이

2
Console.Read마지막에합니까?
Martin Ender

1
namespace단일 파일에는 필요하지 않습니다.
ASCII 전용

1
또한 System.Console.Write(s);작동 하는 경우와를 필요로하지 않으면 몇 바이트를 절약 할 수 있습니다 Console.Read.
ASCII 전용

2
@Thomas VS에서 Ctrl + F5를 사용하여 프로그램을 실행할 수 있습니다.이 경우 프로그램이 종료 된 후에도 창이 열립니다.
마틴 엔더

4

젤리, 7

’½R²m2S

온라인으로 시도하거나 여러 값을 위해 수정 된 버전 을 사용해보십시오.

...... 데니스가 자고있어 ...

도움을 요청한 Sp3000에 감사합니다!

설명:

’½R²m2S
’           ##  Decrement to prevent off-by-one errors
 ½R²        ##  Square root, then floor and make a 1-indexed range, then square each value
    m2      ##  Take every other value, starting with the first
      S     ##  sum the result

9
데니스는 실제로 깨어 있습니다.
Dennis

@Dennis Ahh! 그리고 분명히 경고합니다 ...
FryAmTheEggman


4

R, 38 36 바이트

function(n,x=(2*0:n+1)^2)sum(x[x<n])

@Giuseppe x는 인수 목록 으로 이동 하여 중괄호를 저장하여 2 바이트 를 절약했습니다. 멋진 아이디어!

언 골프

function(n, x = (2*(0:n) + 1)^2)  # enough odd squares (actually too many)
  sum(x[x < n])                   # subset on those small enough
}

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


2
PPCG에 오신 것을 환영합니다!
Martin Ender

이 사이트는 굉장합니다, 감사합니다!
Michael M

x기본 함수 인수로 이동 하여 2 바이트를 절약 한 다음 중괄호를 제거 할 수 있습니다.
주세페

3

C, 51, 50 48 바이트

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

왜 가장 장황한 언어 중 하나로 골프를하지 않습니까? (이봐, 적어도 자바는 아니다!)

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

테스트 I / O가 포함 된 전체 언 골프 프로그램 :

int main()
{
    int s;
    f(10, &s);
    printf("%d\n", s);
    char *foobar[1];
    gets(foobar);
}

f(n,s,i)int*s;{for(*s=0,i=1;i*i<n;i+=2)*s+=i*i;}

most verbose languagesPython, C #, LISP, Forth 등보다 골프에 더 많은 C는 실제로 골프에 아주 좋습니다
cat

@ cat 파이썬보다 더 골프라고 생각하지 않습니다. Java, rust 및 C #보다 확실히 낫지 만이 도전에 대한 모든 파이썬 답변은 < 50 bytes입니다. 또한 관련 메타 게시물이 있습니다 .
DJMcMayhem


3

옥타브, 23 바이트

@(x)(x=1:2:(x-1)^.5)*x'

테스트 :

[f(1); f(2); f(3); f(10); f(9801); f(9802); f(10000)]
ans =    
        0
        1
        1
       10
   156849
   166650
   166650

3

CJam, 15 바이트

qi(mq,2%:)2f#1b

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

하드 코딩 된 10000 솔루션 :

마틴의 12 바이트 솔루션 :

99,2%:)2f#1b

내 원래 13 바이트 솔루션 :

50,{2*)2#}%:+

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


귀하의 코드는 14 바이트 (링크에 후행 줄 바꿈이 있음)이지만 입력 값 보다 작은 사각형을 요구하기 때문에 입력 9801에 적합하지 않다고 생각합니다 .
Martin Ender

@MartinButtner 네, 맞습니다. 나는 우아한 수정을 찾을 수 있는지 볼 것이다
A Simmons

2

Pyth, 10 바이트

s<#Qm^hyd2

테스트 스위트

설명:

s<#Qm^hyd2
    m          Map over the range of input (0 ... input - 1)
       yd      Double the number
      h        Add 1
     ^   2     Square it
 <#            Filter the resulting list on being less than
   Q           The input
s              Add up what's left

대안 (10 바이트) :s<#Q%2t^R2
Leaky Nun

2

Mathcad, 31 "바이트"

enter image description here

Mathcad는 키보드 단축키를 사용하여 정의 및 모든 프로그래밍 연산자를 포함한 여러 연산자를 입력합니다. 예를 들어 ctl-]은 while 루프를 입력합니다. 입력 할 수 없으며 키보드 단축키 또는 프로그래밍 도구 모음을 통해서만 입력 할 수 있습니다. "바이트"는 Mathcad 항목을 입력하는 데 필요한 키보드 작업 수 (예 : 변수 이름 또는 연산자)로 간주됩니다.

이 경쟁에서 이길 기회가 없기 때문에 직접 공식 버전으로 약간의 다양성을 추가 할 것이라고 생각했습니다.


MathCAD는 어떻게 점수가 매겨 집니까? 어디서 구할 수 있습니까?
고양이

당신이주는 점수에 대한 설명은 좀 ... flimsy, IMO
cat

1
이 언어의 점수를 매기기 위해 메타 질문을해야합니다.
Mego

메타 질문이 좋습니다. 점수에 대한 희미한 외식을 제공하는 것은 전쟁과 평화로 빠르게 변할 것입니다.
Stuart Bruff

2

라켓, 57 바이트

(λ(n)(for/sum([m(map sqr(range 1 n 2))]#:when(< m n))m))

2

MATL , 10 바이트

qX^:9L)2^s

편집 (2016 년 7 월 30 일) : 연결된 코드는 다음 9L으로 대체 됩니다.1L 언어의 최근 변화에 적응합니다.

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

q    % Implicit input. Subtract 1
X^   % Square root
:    % Inclusive range from 1 to that
9L)  % Keep odd-indexed values only
2^   % Square
s    % Sum of array

1

파이썬, 39 바이트

f=lambda n,i=1:+(i*i<n)and i*i+f(n,i+2)

에 대해 n=1, False대신 에 출력 하는 것이 유효한 경우0 기본 케이스 변환을 피하여 37 바이트를 얻을 수 있습니다.

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

내가 얻을 수있는 짧은 방법을 찾을 수없는 것을 이상하다 0를 위해 i*i>=n하고 아니면 0이 아닌 값을. 파이썬 2에서는 여전히 39 바이트를 얻습니다.

f=lambda n,i=1:~-n/i/i and i*i+f(n,i+2)

boolint파이썬에서 서브 클래스이며 이는 False허용되는 값입니다 0.
고양이


1

파이썬, 42 38 바이트

f=lambda n,i=1:i*i<n and i*i+f(n,i+2)

1

파이썬 2, 38 바이트

s=(1-input()**.5)//2*2;print(s-s**3)/6

을 사용하여 Dennis의 공식을 기반 으로 s==-2*k합니다. 플로트를 출력합니다. 실제로, 입력 값은 제곱근이되고 감소 된 후 다음 짝수로 올림됩니다.


1

PARI / GP , 33 32 26 바이트

Dennis의 코드 에서 적응 :

n->t=(1-n^.5)\2*2;(t-t^3)/6

간단한 다항식을 사용하는 첫 번째 아이디어 (30 바이트) :

n->t=((n-1)^.5+1)\2;(4*t^3-t)/3

이것은 효율적인 구현이며 실제로 필자가 작성하지 않은 ungolfed 버전과 크게 다르지 않습니다.

a(n)=
{
  my(t=ceil(sqrtint(n-1)/2));
  t*(4*t^2-1)/3;
}

각 사각형을 반복하는 대체 구현 (37 바이트) :

n->s=0;t=1;while(t^2<n,s+=t^2;t+=2);s

임시 변수없이 합산을 보여주는 또 다른 대체 솔루션 (35 바이트) :

n->sum(k=1,((n-1)^.5+1)\2,(2*k-1)^2)

L 2 규범을 사용하는 또 다른 솔루션, 특히 경쟁력이없는 (40 바이트) . 단계 크기 인덱스가있는 벡터를 지원하는 경우 더 좋습니다. ( n->norml2([1..((n-1)^.5+1)\2..2])8 바이트를 떨어 뜨릴 구문 을 상상할 수 있습니다.)

n->norml2(vector(((n-1)^.5+1)\2,k,2*k-1))

1

하스켈, 32 31 바이트

 n#x=sum[x^2+n#(x+2)|x^2<n]
 (#1)

사용 예 : (#1) 9802 -> 166650.

편집 : @xnor는 똑똑한 목록 이해와 함께 바이트를 저장했습니다. 감사!


그것은 가드를 멀리 속이 바이트 짧다 :n#x=sum[x^2+n#(x+2)|x^2<n]
XNOR

1

줄리아, 29 바이트

f(n,i=1)=i^2<n?i^2+f(n,i+2):0

정수를 받아들이고 정수를 반환하는 재귀 함수입니다.

인덱스는 1에서 시작하고 그 제곱이 입력보다 작 으면, 제곱을 취하고 인덱스 + 2에 대한 재사용 결과를 추가하여 짝수를 건너 뛰도록하고 그렇지 않으면 0을 반환합니다.


1

Oracle SQL 11.2, 97 바이트

SELECT NVL(SUM(v),0)FROM(SELECT POWER((LEVEL-1)*2+1,2)v FROM DUAL CONNECT BY LEVEL<:1)WHERE v<:1;

1

줄리아, 26 바이트

x->sum((r=1:2:x-1)∩r.^2)

이것은 n 이하의 모든 홀수, 양의 정수의 범위를 구성합니다. 범위와 그 범위에있는 정수의 제곱의 배열을 구성한 다음 두 반복 가능에서 정수의 합을 계산합니다.

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


1

Reng v.3.3, 36 바이트

0#ci#m1ø>$a+¡n~
:m%:1,eq^c2*1+²c1+#c

여기 사용해보십시오!

설명

1 : 초기화

 0#ci#m1ø

세트 c0(카운터)과 입력 I받는 mAX.다음 줄로갑니다.

2 : 루프

:m%:1,eq^c2*1+²c1+#c

:현재 값 (제곱 홀수)을 복제하고 [I mm도끼를 내립니다. 나는 여기에 사용하는 또 다른 대답에서 덜 트릭을 사용했습니다. %:1,eSTOS <TOS인지 확인합니다. 그렇다면 q^루프에서 빠져 나옵니다. 그렇지 않으면:

         c2*1+²c1+#c

c카운터를 내려 놓고 2*두 배로 1+늘리고 1을 더한 다음 ²제곱합니다.c1+#C증분c 하고 루프가 다시 진행됩니다.

3 : 최종

        >$a+¡n~

$마지막 값을 삭제하고 (원하는 것보다 큼) a+¡스택 길이가 1이 될 때까지 추가하고 n~출력하고 종료합니다.



1

Mathematica 30 바이트

Total[Range[1,Sqrt[#-1],2]^2]&

이 명명되지 않은 함수는 입력 ( Range[1,Sqrt[#-1],2]) 보다 작은 모든 홀수를 제곱 하여 더합니다.


1

PHP, 64 바이트

function f($i){$a=0;for($k=-1;($k+=2)*$k<$i;$a+=$k*$k);echo $a;}

넓히는:

function f($i){
    $a=0;
    for($k=-1; ($k+=2)*$k<$i; $a+=$k*$k);
    echo $a;
}

의 각 반복에서 forK 경우 루프는 K와 검사 2를 추가한다 (2)는 이하보다 $i그것이 추가 K이면, 2$a.


1

R, 60 바이트

function(n){i=s=0;while((2*i+1)^2<n){s=s+(2*i+1)^2;i=i+1};s}

n = 1의 경우 0을 반환하는 것을 포함하여 도전에 설명 된대로 정확하게 수행합니다. Degolfed, ';' R에서 줄 바꿈을 나타내며 아래 무시됩니다.

function(n){         # Take input n
i = s = 0            # Declare integer and sum variables
while((2*i+1)^2 < n) # While the odd square is less than n
s = s + (2*i+1)^2    # Increase sum by odd square
i = i + 1            # Increase i by 1
s}                   # Return sum, end function expression

1

자바 (8), 128 (119) 117 (111) 49 바이트

n->{int s=0,i=1;for(;i*i<n;i+=2)s+=i*i;return s;}

@Thomas 의 C # 솔루션 기반 .

설명:

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

n->{           // Method with integer as both parameter and return-type
  int s=0,     //  Sum, starting at 0
      i=1;     //  Index-integer, starting at 1
  for(;i*i<n;  //  Loop as long as the square of `i` is smaller than the input
      i+=2)    //    After every iteration, increase `i` by 2
    s+=i*i;    //   Increase the sum by the square of `i`
  return s;}   //  Return the result-sum

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