덧셈과 뺄셈 만 사용하여 모든 제곱을 최대 x까지 계산


11

목표는 x더하기와 빼기 까지 모든 제곱을 계산하는 것입니다 .

규칙 :

  1. 코드는 생성하는 데 총 제곱 수를 사용하고 해당 제곱을 모두 포함하는 배열을 반환하는 함수 여야합니다.
  2. 제곱을 계산하기 위해 문자열, 구조, 곱하기, 나누기 또는 내장 함수를 사용할 수 없습니다 .
  3. 배열, 정수 (정수), 더하기, 빼기 만 사용할 수 있습니다. 다른 운영자는 허용되지 않습니다!

이것은 질문이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


이것은 본질적으로 제곱을 증가시키는가장 최적화 된 알고리즘입니다. 또는 적어도 거의 동일한 대답을 얻습니다.
피터 테일러

2
@PeterTaylor 아니요, 제곱을 증가시키는 가장 최적화 된 알고리즘과 동일하지는 않지만 제 질문은 더하기와 빼기 만 요구합니다.
칫솔

같은 것입니다. 증인으로서 :이 질문에 대한 현재 답변은 이전 질문에 대한 대다수의 답변과 정확히 동일합니다.
피터 테일러

@PeterTaylor 편견이있을 수도 있지만 실제로는 전혀 같지 않다고 생각합니다.
칫솔

3
질문에는 다른 곳에서 이미 답변 있을 수 있지만 다른 질문 과 중복 되는 질문 은 아닙니다 .
Blacklight Shining

답변:



6

C, 55 52 바이트

int s(int n,int*r){for(int i=0,j=-1;n--;*r++=i+=j+=2);}

홀수를 간단히 합산

  • n: 계산할 제곱 수
  • r: 결과를 저장하기위한 출력 배열
  • j: 연속적인 값 1, 3, 5, 7, ...을 취합니다.
  • i: j각 반복마다 증가합니다 .

편집하다

암시 적 int 선언 (> C99)을 사용하여 4 개의 문자를 저장할 수 있지만 for초기화 프로그램이> C99의 선언을 포함 할 수 없으므로 1 문자의 비용이 듭니다 . 그런 다음 코드는

s(int n,int*r){int i=0,j=-1;for(;n--;*r++=i+=j+=2);}

용법

void main() {
    int r[20];
    s(20, r);
    for (int i = 0; i < 20 ; ++i) printf("%d\n", r[i]);
}  

산출

1
4
9
16
25
36
49
(...)
361
400

1
그 논리는 훌륭합니다! 당신은 +1 자격
Mukul을 쿠마

5

GolfScript, 17 자

{[,{.+(1$+}*]}:F;

사용법 ( 온라인 예제도 참조 ) :

10 F     # => [0 1 4 9 16 25 36 49 64 81]

참고 : * 곱셈 연산자가 아닌 루프입니다.


확인; 어떻게 작동합니까?
칫솔

@toothbrush ,는 입력을 받아 배열로 변환합니다 [0 1 ... n-1]. 그런 다음 *주어진 코드 블록을 배열에 삽입합니다. 이 블록은 먼저 현재 항목 ( .+)을 두 배로 빼고 하나 ( )를 뺀 (다음 이전 결과를 더합니다 1$+(즉, 2j-1이전 사각형 번호에 더함). []새 배열을 반환하기 위해 모든 것을 포함합니다.
Howard

큰! GolfScript를 모르므로 어떻게 작동하는지 궁금했습니다.
칫솔

5

윈도우 배치, 115 바이트

setlocal enabledelayedexpansion&for /l %%i in (1 1 %1)do (set a=&for /l %%j in (1 1 %%i)do set /a a+=%%i
echo.!a!)

이것은 cmd에서 실행되는 대신 배치 파일에 배치해야하며 목록을 콘솔에 출력합니다. 첫 번째 명령 줄 인수에서 만들려면 제곱의 수가 필요합니다. 줄 &바꿈 대신 사용하는 대부분의 경우 여전히 하나가 필요하며 2 바이트로 계산됩니다.

지연된 변수 확장이 활성화되어 있어야합니다 cmd /v:on. 그렇지 않다고 가정하면 setlocal enabledelayedexpansion&시작시에 여분의 것이 필요했습니다 (스크립트가 없으면 83 바이트).


4

하스켈-30

f n=scanl1(\x y->x+y+y-1)[1..n]

이것은 사실을 사용합니다 (n+1)^2=n^2+2n+1


4

펄, 27 바이트

sub{map{$a+=$_+$_-1}1..pop}

수학 :

수학

함수를 호출하여 10 개의 사각형을 인쇄하는 스크립트 :

#!/usr/bin/env perl
$square = sub{map{$a+=$_+$_-1}1..pop};
use Data::Dumper;
@result = &$square(10);
print Dumper \@result;

결과:

$VAR1 = [
          1,
          4,
          9,
          16,
          25,
          36,
          49,
          64,
          81,
          100
        ];

편집 :


난 당신이 왜 당신의 서브 이름을 지정 해야하는지 이유가 없습니다. IOW "sub {map {$ a + = $ _ + $ _- 1} 1..shift}"는 합법적 인 것으로 보이며 두 글자를 절약 할 수 있습니다.
skibrianski

@skibrianski : 익명 함수도 함수입니다. 단점은 함수 호출이 조금 더 번거 롭다는 것입니다.
Heiko Oberdiek 2014 년

맞습니다.하지만 그것은 발신자입니다. 익명의
하위

그리고 인수가 하나만 있기 때문에 shift () 대신 pop ()을 사용하여 다른 두 문자를 저장할 수 있습니다.
skibrianski

@skibrianski : 감사합니다.
Heiko Oberdiek

4

자바 스크립트-32 자

for(a=[k=i=0];i<x;)a[i]=k+=i+++i

변수 x가 존재한다고 가정하고 a값의 제곱 배열 을 만듭니다 1..x.

ECMAScript 6 ~ 27 자

b=[f=i=>b[i]=i&&i+--i+f(i)]

호출 f(x)하면 배열 b에 값의 제곱 이 채워집니다 0..x.


물어봐야합니다 ... i+++i마지막에 ...?
WallyWest

2
k+=i+++i것과 동일 k += i + (++i)같은 인 k+=i+i+1다음i=i+1
MT0

아, 그건 천재입니다 ... 필요한 경우 다음 코드 골프에서 구현해야합니다! :)
WallyWest 2016 년

함수 선언을 배열 내부로 이동하여 한 문자를 저장할 수 있습니다 (예 :) b=[f=i=>b[i]=i&&i+--i+f(i)].
칫솔

고마워-세미콜론을 제거하기 위해 물건을 둥글게 움직여 맨 위의 답변에 한 문자를 저장했습니다.
MT0

4

줄리아-33

홀수의 합으로 모든 제곱을 쓸 수 있습니다.

julia> f(x,s=0)=[s+=i for i=1:2:(x+x-1)];f(5)
5-element Array{Int64,1}:
  1
  4
  9
 16
 25

안녕하세요, CG.se에 오신 것을 환영합니다! 간결하고 훌륭합니다. 줄리아에 대해 들어 본 적이 없지만 흥미로운 것 같습니다.
Jonathan Van Matre

Julia에서 "2 배"가 곱셈이 아닙니까? 대신 x + x라고 말하면 1 바이트 밖에 들지 않습니다.
Glenn Randers-Pehrson

당신은 옳고 (알려진 통지) 편집되었습니다.
CCP

줄리아에 익숙하지는 않지만 온라인 설명서 docs.julialang.org/en/release-0.2 에서 찾아 보았습니다. "숫자 리터럴 계수 : 일반적인 숫자 공식과 표현을 더 명확하게하기 위해 Julia는 변수를 허용합니다. 곧바로 숫자 리터럴이 앞에 와서 곱셈을 의미합니다. " 예, 2 배는 곱셈입니다.
Glenn Randers-Pehrson

2

C ++ 99 81 78 80 78

int* f(int x){int a[x],i=1;a[0]=1;while(i<x)a[i++]=a[--i]+(++i)+i+1;return a;}  

코드 골프에서의 첫 시도

이 코드에 기초
A = 2 XN - 1
여기서, N 기간 카운트이며, A는 이고 n은 일련의 다음 번째 기간
1, 3, 5, 9, 11, 13 .....
제 2 개 측면 = 2의 합 제곱

처음 3 개의 항의 합 = 3 제곱


2
문이 하나뿐이기 때문에 루프 {}후에 중괄호를 제거 할 수 있다고 생각합니다 for. 이렇게하면 문자 수를 2 줄일 수 있습니다
user12205

1
main () 이외의 함수에서 일정하지 않은 크기의 배열을 선언하면 허용됩니다.
Mukul Kumar

1
이 코드에는 정의되지 않은 동작이 있습니다.
Kerrek SB

1
반환하는 동안 파괴 된 스택의 데이터에 대한 포인터를 반환합니다.
VX

1
@MukulKumar addition, subtraction, 난 단지 그것들을 사용하고 있습니다
mniip

2

DCPU-16 어셈블리 (90 바이트)

나는 허구의 프로세서를 위해 이것을 어셈블리로 썼는데 왜 그렇지 않습니까?

:l
ADD I,1
SET B,0
SET J,0
:m
ADD J,1
ADD B,I
IFL J,I
SET PC,m
SET PUSH,B
IFL I,X
SET PC,l

이 숫자는 X 레지스터에있을 것으로 예상되고 다른 레지스터는 0이 될 것으로 예상됩니다. 결과는 스택으로 푸시되며 16 비트 아키텍처로 인해 65535에 도달하면 중단됩니다. SUB PC, 1끝에 테스트 를 추가 하여 테스트 할 수 있습니다. 컴파일 된 프로그램은 20 바이트 (10 워드) 여야합니다.


2

하스켈

f x=take x [iterate (+y) 0 !! y | y<- [0..]]

이것은 기본적으로 곱셈을 만들어 내고, 그 자체를 사용하며, 모든 수에이를 곱합니다. f 10= [0,1,4,9,16,25,36,49,64,81]. 또한 f 91= [0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529,576,625,676,729,784,841,900,961,1024,1089,1156,1225,1296,1369,1444,1521,1600,1681,1764,1849,1936,2025,2116,2209,2304,2401,2500,2601,2704,2809,2916,3025,3136,3249,3364,3481,3600,3721,3844,3969,4096,4225,4356,4489,4624,4761,4900,5041,5184,5329,5476,5625,5776,5929,6084,6241,6400,6561,6724,6889,7056,7225,7396,7569,7744,7921,8100].


데모를 10보다 약간 크게 확장 할 수 있습니까?
Glenn Randers-Pehrson

2

하스켈, 34/23

n#m=m+n:(n+2)#(m+n)
f n=take n$1#0

또는 수입품이 괜찮다면 :

f n=scanl1(+)[1,3..n+n]

산출:

λ> f 8
[1,4,9,16,25,36,49,64]

1

자바 스크립트 47

function f(n,a){return a[n]=n?f(n-1,a)+n+n-1:0}

r=[];f(12,r);console.log(r) 반환 :
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144]


큰! EcmaScript 6에서 : f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0.
칫솔

1
ECMAScript 6이 실제로 주류 사용에 들어갈 때까지 기다릴 수 없습니다. 그것은 그것을 배우는 완벽한 변명 일 것입니다.
Isiah Meadows

1
ECMAScript 6 사양의 Arrow Function 부분은 버전 22부터 FireFox에 있습니다.
MT0

1

스몰 토크, 52

f:=[:n||s|(s:=1)to:n collect:[:i|x:=s.s:=s+i+i+1.x]]

새 배열을 반환합니다 (예 : 기존 배열을 채우거나 추가하지 않음).

요구:

f 값 : 10

-> # (14 9 16 25 36 49 64 81100)


1

파이썬-39

a=0
for i in range(5):a+=i+i+1;print(a)

5임의의 값으로 교체하십시오 . 어떤 제안?


1

배쉬- 92 85 62 61 59 57

declare -i k=1;for((i=0;i++<$1;k+=i+i+1));do echo $k;done

결과:

$ ./squares.sh 10
1
4
9
16
25
36
49
64
81
100

편집 : 내부 루프를 @mniip의 Haskell 솔루션의 알고리즘으로 대체했습니다.


1

APL 및 J에서 위와 동일한 방법 :

APL : F←{+\1+V+V←¯1+⍳⍵}(17 자)는 대부분의 APL 변형에서 작동합니다 ( 여기에서 시도 하십시오 ).

NGN APL을 사용하면 더 적은 수 (14 자만 가능) : F←{+\1+V+V←⍳⍵}( 여기 참조 )

J : f=:+/\@(>:@+:@:i.)(18 자)

편집 : APL의 더 나은 솔루션 : F←{+\¯1+V+V←⍳⍵}(15 자)


1

C # (82)

int[] s(int n){int i,p=0;var r=new int[n];while(i<n){p+=i+i+1;r[i++]=p;}return r;}

1

C #-93

int[]s(int l){int[]w=new int[l];while(l>=0){int i=0;while(i<l){w[l-1]+=l;i++;}l--;}return w;}

동일한 클래스의 다른 메소드에서 호출되면 [1,4,9,16,25,36...]최대 - l요소 까지 배열-을 리턴합니다 .


int[]와 사이의 공백을 제거하려고 했 sq습니까? C #을 모르지만 작동해야한다고 생각합니다.
user12205

아니요, 작동하지 않습니다. 첫 번째 int []는 "sq"메소드의 리턴 유형입니다. 메소드 이름을 "s"로 줄일 수 있습니다. :)
Rajesh

int[]sq대신 int[] sqint[]res대신 사용 하는 것을 의미 int[] res합니다. 이것은 두 문자를 저장하는 데 도움이되며 컴파일 오류가 발생하지 않았습니다. 또한 sq및에 단일 문자 식별자를 사용해야합니다res 당신이 제안.
user12205

답에 문제가있는 것 같습니다
user12205

공백이 4 개인 코드를 들여 쓰기하여 고정 폭 글꼴이있는 코드 블록에 넣습니다.
luser droog

1

포트란 II | IV | 66 | 77, 134 122 109 105

  SUBROUTINES(N,M)
  INTEGERM(N)
  K=0
  DO1I=1,N
  K=K+I+I-1
1 M(I)=K
  END

편집 : 내부 루프를 제거하고 대신 @mniip의 Haskell 알고리즘을 사용했습니다.

편집 : 서브 루틴 및 드라이버가 유효한 포트란 II 및 IV인지 확인

운전사:

  INTEGER M(100)
  READ(5,3)N
  IF(N)5,5,1
1 IF(N-100)2,2,5
2 CALLS(N,M)
  WRITE(6,4)(M(I),I=1,N)
3 FORMAT(I3)
4 FORMAT(10I6)
  STOP  
5 STOP1
  END

결과:

$ echo 20 | ./a.out
   1     4     9    16    25    36    49    64    81   100
 121   144   169   196   225   256   289   324   361   400

@ mniip, 감사합니다. 내 루프를 코드로 바꿨습니다.
Glenn Randers-Pehrson

1

파이썬-51

여기서는 규칙에서 요청한대로 함수를 정의합니다.

sum홀수 사용 :

f=lambda n:[sum(range(1,i+i+3,2))for i in range(n)]

이것은 sum(더하기를 수행하는 내장)과 range(더하기를 사용하여 배열을 만드는 내장 ) 만 사용합니다 . 에 반대하면 다음 sum과 같이 할 수 있습니다 reduce.

def g(n):v=[];reduce(lambda x,y:v.append(x) or x+y,range(1,i+i+3,2));return v

1

PHP, 92 바이트

물론 "짧은 태그"옵션을 활성화해야합니다 (시작시 3 바이트를 줄이려면).

<? $x=100;$a=1;$r=0;while($r<=$x){if($r){echo"$r ";}for($i=0,$r=0;$i<$a;$i++){$r+=$a;}$a++;}

산출:

1 4 9 16 25 36 49 64 81 100 

1

넷째-48 바이트

: f 1+ 0 do i 0 i 0 do over + loop . drop loop ;

용법:

7 f

산출:

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