n 번째 교차 교호 합 찾기


17

단일 양의 정수를 입력하면 해당 정수에 해당하는 "교차 교호 합"을 출력합니다.

입력 예제를 보자 n=5. 교차 대치 합계를 찾으려면 먼저 n왼쪽에서 오른쪽으로, 위에서 아래로 읽으 1면서 각 위치 에서 시작 하여 하나씩 증가하는 너비와 높이의 사각형 격자를 만듭니다 .

 1  2  3  4  5
 6  7  8  9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

그런 다음 "십자형"(즉, 두 대각선이 결합 된)을 형성하는 격자에서 합계를 가져옵니다.

 1           5
    7     9
      13
   17    19
21          25

1 5 7 9 13 17 19 21 25

마지막으로이 순서의 교호를 취하십시오.

1+5-7+9-13+17-19+21-25

-11

에 대한 또 다른 예 n=6는 다음과 같습니다 (짝수에 대한 십자가 모양을 보여주기 위해 n).

 1  2  3  4  5  6
 7  8  9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36

 1              6
    8       11
      15 16
      21 22
   26       29
31             36

1+6-8+11-15+16-21+22-26+29-31+36

20

이것이 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

n=1to n=100에 대한 올바른 출력은 다음과 같습니다 . 테스트 출력으로 사용할 수 있습니다.

1
4
-3
10
-11
20
-23
34
-39
52
-59
74
-83
100
-111
130
-143
164
-179
202
-219
244
-263
290
-311
340
-363
394
-419
452
-479
514
-543
580
-611
650
-683
724
-759
802
-839
884
-923
970
-1011
1060
-1103
1154
-1199
1252
-1299
1354
-1403
1460
-1511
1570
-1623
1684
-1739
1802
-1859
1924
-1983
2050
-2111
2180
-2243
2314
-2379
2452
-2519
2594
-2663
2740
-2811
2890
-2963
3044
-3119
3202
-3279
3364
-3443
3530
-3611
3700
-3783
3874
-3959
4052
-4139
4234
-4323
4420
-4511
4610
-4703
4804
-4899
5002

8
Nit pick : 교류가 아닙니다. 처음 두 용어를 추가하고 있습니다.
Dennis

답변:


26

젤리, 21 19 11 10 7 바이트

²~³¡H+2

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

생각

최종 합의 첫 번째 항을 더하기보다는 빼는 것으로 가정하십시오.

n을 양의 정수로 하자 .

심지어 경우

 1              6
    8       11
      15 16
      21 22
   26       29
31             36

행의 아래쪽 절반에있는 대각선 요소의 차이는 첫 번째 n ÷ 2 홀수 자연수입니다. 이후 1 + 3 + 5 + ... + (2K + 1) K = 2 , 그들은 합계가 (N ÷ 2) 2 = N 2 ÷ 4 .

이 예에서

- 1 + 6 - 8 + 11 - 15 + 16 - 21 + 22 - 26 + 29 - 31 + 36  =
-(1 - 6)-(8 - 11)-(15 - 16)-(21 - 22)-(26 - 29)-(31 - 36) =
(    5   +   3    +    1  )+(   1    +    3    +    5   ) =
             9             +              9               = 18

따라서 합은 2 × n 2 ÷ 4 = n 2 ÷ 2 입니다.

홀수 케이스

 1           5
    7     9
      13
   17    19
21          25

위와 아래의 해당 행에있는 대각선 요소 ( 15, 및 21, 25; 79, 1719)의 차이는 동일하므로 대체 합계에서 취소됩니다.

이 예에서

- 1 + 5 - 7 + 9 - 13 + 17 - 19 + 21 - 25  =
-(1 - 5)-(7 - 9)- 13 +(17 - 19)+(21 - 25) =
    4   +   2   - 13 -    2    -    4     = -13

남은 것은 중앙 요소의 음수이며, 첫 번째와 마지막 숫자의 산술 평균이므로 -(n 2 + 1) ÷ 2 로 계산할 수 있습니다 .

일반적인 경우

이후 ~ X = - (X + 1) 2의 보수 정수 (위한 ~ 나타낸다는 NOT 비트 단위), 홀수의 경우의 수식과 같이 다시 쓸 수 ~ N 2 ÷ 2 .

또한 원래 합계 의 첫 번째 항 ( 1 )을 빼기 대신 더하기 때문에 위의 수식은 2 의 오차를 남깁니다 . 이는 수정되어야합니다.

따라서, N 번째의 상호 대체 합계 인 N 2 ÷ 2 + 2 경우 N 짝수이고, ~ N 2 ÷ 2 + 2 가 홀수 인 경우.

마지막으로, 비트 NOT은 모든 x에 대해 ~~ x = x 의 진화 입니다. 이 방법 ~ ~ ~ X = X , ~~~~ X = X , 그리고, 일반적으로, ~ N X (즉 ~가 인가 N 배) 인 X 경우 n이 짝수이고 ~ X 가 홀수 인 경우.

따라서 모든 양의 정수 n에 대해 일반 공식을 ~ n n 2 ÷ 2 + 2 로 다시 쓸 수 있습니다 .

암호

²~³¡H+2    Main link. Input: n

²          Yield n².
 ~         Apply bitwise NOT to n²...
  ³¡           n times.
    H      Halve the result.
     +2    Add 2.

1
간단한 공식이 있다는 것을 알고 있었지만 설명과 실행은 놀랍습니다. +1
ETHproductions

5

자바 스크립트, 40 38 22 바이트

새로운 분노를 불러 일으키는 멋진 폐쇄 형 솔루션을 사용하십시오.

n=>(n%2?3-n*n:4+n*n)/2

ThomasKwa 덕분에 값 비싼 재귀 함수를 제거 할 수 있습니다.


n % 2이면 비트 단위로 한 번만 입력하면됩니다. 실제로, JS에서는 그냥하는 것이 더 짧을 수도 있다고 생각합니다.(n%2?3-n*n:4+n*n)/2
lirtosiast



3

Minkolang 0.15 , 26 15 13 바이트

Dennis의 미친 알고리즘을 사용하고 그 덕분에 또 다른 2 바이트를 골랐습니다. 그 사람은 바이트 수의 절반을 담당합니다!

n2;d[~]4+2:N.

여기 사용해보십시오!

설명

@VoteToClose n^ 2, 비트 NOT n시간을 적용하고 4를 반으로 추가하십시오. – Thomas Kwa 7 분 전

왜 작동하는지에 대한 설명은 Dennis의 답변 을 참조하십시오 . 이 답변에 대한 의견에서 그는 :정수 나누기 때문에 작동하는 또 다른 개선 사항을 제안 했으므로 스택 맨 위를 부정하고 이진 보수를 수행하는 +1에 대해 걱정할 필요가 없습니다. 또한, n과 n ^ 2는 동일한 패리티를 가지므로 스왑이 필요하지 않습니다.

n                Take number from input - n
 2;              n**2
   d             Duplicates top of stack
    [~]          For loop that negates the top of stack n times
       4+        Add 4
         2:      Divide by 2
           N.    Output as number and stop.

2

GolfScript, 12 바이트

~2?.{~}*2/2+

이것은 Jelly 답변 의 알고리즘을 사용합니다 . 온라인으로 사용해보십시오!

작동 원리

~            # Evaluate the input.
 2?          # Square it.
   .         # Push a copy of the square.
    {~}      # Push a code block that applies bitwise NOT.
       *     # Execute it n² times. Since n² and n have the same parity,
             # this is equivalent to executing in only n times.
        2/   # Halve the result.
          2+ # Add 2.

2

ES7, 17 바이트

n=>-1**n*n*n+4>>1

@Dennis의 Python 2 답변의 간단한 포트.

이 답변을 쓰는 ​​동안 ES6 포트를 17 바이트로 골프를 쳤습니다!

n=>(n*n^-n%2)/2+2


2

퓨어 배쉬, 28

이제 @Dennis 가이를 수행하는 방법을 모두 보여 주었으므로 업데이트해야합니다.

echo $[-1**$1*($1*$1+1)/2+2]

이전 답변 :

배쉬 + GNU 유틸리티, 77

시작은 다음과 같습니다.

a=$1
(seq 1 $[a+1] $[a*a]
seq $1 $[a>1?a-1:1] $[a*a])|sort -un|paste -sd+-|bc

N은 명령 행 매개 변수로 전달됩니다.

paste교류 합계를 생성하는 데 정말 편리합니다. 이 -d옵션은 주기적으로 사용되는 구분 문자 목록을 허용합니다.


$[-1**$1*$1*$1+4>>1]더 짧습니다.
Neil

2

줄리아, 41 40 25 19 16 바이트

n->-n%2$n^2÷2+2

이것은 정수를 허용하고 정수를 리턴하는 익명 함수입니다. 호출하려면 변수에 지정하십시오.

Dennis가 고안 한 여기의 접근 방식은 다음과 같습니다. 먼저 우리는 n 의 패리티 , 즉 n (mod 2) 을 얻고 그것을 부정합니다. 이것은 짝수 입력에 대해 0을, 홀수에 대해 -1을 제공합니다. 그런 다음 n 2의 비트 단위 XOR입니다 . 언제 n이 짝수이고, 이것은 단지 인 N 2 0 XOR 단지 수 있기 때문이다. 경우 N 홀수, XOR은 -1로 부정 비트와 동일하다. 따라서이 시점에서 우리는 n 2 또는 비트 NOT n 2 입니다. 정수를 2로 나누고 2를 더하여 결과를 얻습니다.

이전 버전의 Sp3000 덕분에 바이트를 절약하고 Dennis는 Dennis 덕분에 9 개를 절약했습니다!



1

파이썬 2, 24 바이트

lambda n:(-1)**n*n*n/2+2

이 알고리즘은 Jelly answer 약간 수정하여 사용합니다.

~ n 번 을 적용하는 대신 , (-1) n 을 곱하여 - n 번 을 적용 합니다. ~ x = -x-1 및 Python의 정수 나누기 플로어이므로 ~ x / 2 = (-x-1) / 2 = -x / 2 이므로 동등 합니다.


1

Pyth, 11 바이트

+2/u_GQ*QQ2

Pyth Compiler 에서 온라인으로 사용해보십시오 .

작동 원리

이것은 내 젤리 답변 의 알고리즘을 사용합니다. 약간 수정하여 사용합니다.

~ n 번 을 적용하는 대신 , (-1) n 을 곱하여 - n 번 을 적용 합니다. 이 동등하기 때문에 ~ X = -x - 1 Pyth 및 정수 나눗셈 바닥 때문에 ~ X / 2 = (-x - 1) / 2 = -x / 2 .

+2/u_GQ*QQ2  Evaluated input: Q

       *QQ   Yield Q².
   u  Q      Set G = Q². For each non-negative integer below Q:
    _G         Set G = -G.
             Return G.
  /       2  Halve the result.
+2           Add 2.

1

dc, 17

Dennis의 동일한 시도 및 테스트 수식을 사용합니다.

?dd*1+r_1r^*2/2+p

온라인으로 사용해보십시오 . 왜 Ideone bash 샌드 박스에 포함되지 않습니까?dc 않습니까?

명령 줄 테스트 :

for i in {1..100}; do echo $i | dc -e '?dd*1+r_1r^*2/2+p'; done 

?2^1+2~2*1-*2+p2 바이트를 절약합니다.
Dennis

1

GS2, 9 바이트

V,@!α2+''

이것은 Jelly 답변 의 알고리즘을 사용합니다 . 온라인으로 사용해보십시오!

V,@e 7+''

똑같이 짧지 만 비 ASCII 문자는 포함하지 않습니다.

작동 원리

V          Parse the input as an integer n.
 ,         Compute n².
  @        Push a copy of n².
   !       Bitwise NOT.
    α      Make a block of the previous instruction.
     2     Execute the block n² times. Since n² and n have the same parity,
           this is equivalent to executing in only n times.
      +    Halve the result.
       ''  Increment twice.

1

J, 16 바이트

[:<.2%~4+*:*_1^]

이것은 내 젤리 답변과 동일한 알고리즘을 사용합니다. J.js로 테스트하십시오 .


0

루아, 33 바이트 ( 온라인 시도 )

i=(...)print((-1)^i*i*i/2-.5*i%2)

작동 방식 :

i=(...)print((-1)^i*i*i/2-.5*i%2)
i=(...)                           Take input and store to i
       print(
             (-1)^i               Raise (-1) to the i-th power: -1 if odd, 1 if even
                   *i*i/2         Multiply by i squared and halved.
                         -.5*i%2  i%2 is the remainder when i is divided by 2
                                  if i is odd, then i%2 will be 1, and this expression
                                  will evaluate to -0.5
                                  but if i is even, then i%2 will be 0, which makes
                                  this expression evaluate to 0
                                )

0

Dyalog APL, 13 바이트

⌊2+.5××⍨ׯ1*⊢

이것은 내 젤리 답변과 동일한 알고리즘을 사용합니다. TryAPL에서 테스트하십시오 .

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