목표는 x
더하기와 빼기 까지 모든 제곱을 계산하는 것입니다 .
규칙 :
- 코드는 생성하는 데 총 제곱 수를 사용하고 해당 제곱을 모두 포함하는 배열을 반환하는 함수 여야합니다.
- 제곱을 계산하기 위해 문자열, 구조, 곱하기, 나누기 또는 내장 함수를 사용할 수 없습니다 .
- 배열, 정수 (정수), 더하기, 빼기 만 사용할 수 있습니다. 다른 운영자는 허용되지 않습니다!
이것은 코드 골프 질문이므로 바이트 단위의 가장 짧은 코드가 이깁니다!
목표는 x
더하기와 빼기 까지 모든 제곱을 계산하는 것입니다 .
규칙 :
이것은 코드 골프 질문이므로 바이트 단위의 가장 짧은 코드가 이깁니다!
답변:
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$+}*]}:F;
사용법 ( 온라인 예제도 참조 ) :
10 F # => [0 1 4 9 16 25 36 49 64 81]
참고 : *
곱셈 연산자가 아닌 루프입니다.
,
는 입력을 받아 배열로 변환합니다 [0 1 ... n-1]
. 그런 다음 *
주어진 코드 블록을 배열에 삽입합니다. 이 블록은 먼저 현재 항목 ( .+
)을 두 배로 빼고 하나 ( )를 뺀 (
다음 이전 결과를 더합니다 1$+
(즉, 2j-1
이전 사각형 번호에 더함). []
새 배열을 반환하기 위해 모든 것을 포함합니다.
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 바이트).
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
];
편집 :
pop
대신 shift
(-2 바이트, skibiranski 덕분에 )for(a=[k=i=0];i<x;)a[i]=k+=i+++i
변수 x
가 존재한다고 가정하고 a
값의 제곱 배열 을 만듭니다 1..x
.
b=[f=i=>b[i]=i&&i+--i+f(i)]
호출 f(x)
하면 배열 b
에 값의 제곱 이 채워집니다 0..x
.
i+++i
마지막에 ...?
k+=i+++i
것과 동일 k += i + (++i)
같은 인 k+=i+i+1
다음i=i+1
b=[f=i=>b[i]=i&&i+--i+f(i)]
.
홀수의 합으로 모든 제곱을 쓸 수 있습니다.
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
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 제곱
등
{}
후에 중괄호를 제거 할 수 있다고 생각합니다 for
. 이렇게하면 문자 수를 2 줄일 수 있습니다
addition, subtraction
, 난 단지 그것들을 사용하고 있습니다
나는 허구의 프로세서를 위해 이것을 어셈블리로 썼는데 왜 그렇지 않습니까?
: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 워드) 여야합니다.
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]
.
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]
f=(n,a)=>a[n]=n?f(n-1,a)+n+n-1:0
.
배쉬- 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 솔루션의 알고리즘으로 대체했습니다.
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 #을 모르지만 작동해야한다고 생각합니다.
int[]sq
대신 int[] sq
및 int[]res
대신 사용 하는 것을 의미 int[] res
합니다. 이것은 두 문자를 저장하는 데 도움이되며 컴파일 오류가 발생하지 않았습니다. 또한 sq
및에 단일 문자 식별자를 사용해야합니다res
당신이 제안.
포트란 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