Tìm tổng xen kẽ thứ n


17

Cho một đầu vào của một số nguyên dương duy nhất, xuất ra "tổng thay thế chéo" tương ứng với số nguyên đó.

Lấy ví dụ về đầu vào n=5. Để tìm tổng xen kẽ, trước tiên, hãy tạo một lưới vuông có chiều rộng và chiều cao n, đọc từ trái sang phải và từ trên xuống dưới, bắt đầu tại 1và tăng theo từng vị trí:

 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

Sau đó, lấy tổng từ lưới tạo thành một "chữ thập" (nghĩa là cả hai đường chéo kết hợp):

 1           5
    7     9
      13
   17    19
21          25

1 5 7 9 13 17 19 21 25

Cuối cùng, lấy tổng số xen kẽ của chuỗi này:

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

-11

Một ví dụ khác, cho n=6(chỉ để hiển thị hình chữ thập trông như thế nào cho số chẵn 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

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Sau đây là các kết quả đầu ra chính xác cho n=1đến n=100, mà bạn có thể sử dụng như trường hợp thử nghiệm:

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: Đó không phải là một khoản tiền xen kẽ. Bạn đang thêm hai thuật ngữ đầu tiên.
Dennis

Câu trả lời:


26

Thạch, 21 19 11 10 7 byte

²~³¡H+2

Hãy thử trực tuyến!

Ý tưởng

Giả sử trong một giây rằng số hạng đầu tiên của tổng cuối cùng bị trừ thay vì được thêm vào.

Đặt n là số nguyên dương.

Ngay cả trường hợp

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

Sự khác biệt giữa các phần tử đường chéo ở nửa dưới của các hàng là số tự nhiên n ÷ 2 lẻ đầu tiên . Vì 1 + 3 + 5 + Hoài + (2k + 1) = k 2 , nên chúng tổng hợp thành (n ÷ 2) 2 = n 2 4 .

Trong ví dụ này

- 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

Do đó, tổng là 2 × n 2 4 = n 2 2 .

Trường hợp kỳ lạ

 1           5
    7     9
      13
   17    19
21          25

Sự khác biệt giữa các phần tử đường chéo trên các hàng tương ứng từ bên trên và bên dưới ( 15, 2125, 79, 1719) là như nhau, vì vậy chúng sẽ hủy trong tổng số xen kẽ.

Trong ví dụ này

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

Tất cả những gì còn lại là âm của phần tử trung tâm, là trung bình số học của số đầu tiên và số cuối cùng, vì vậy nó có thể được tính là - (n 2 + 1) 2 .

Trường hợp chung

~ x = - (x + 1) cho hai số nguyên bổ sung ( ~ biểu thị bit bit KHÔNG), nên công thức cho trường hợp lẻ có thể được viết lại thành ~ n 2 ÷ 2 .

Ngoài ra, do thuật ngữ đầu tiên ( 1 ) của tổng ban đầu được thêm vào thay vì bị trừ, các công thức trên để lại sai số 2 , phải sửa.

Do đó, tổng xen kẽ thứ n là n 2 2 + 2 nếu n chẵn và ~ n 2 2 + 2 nếu là số lẻ.

Cuối cùng, bitwise KHÔNG là một phép tính, nghĩa là, ~ ~ x = x với mọi x . Cách này ~~~ x = ~ x , ~~~ ~ x = x , và, nói chung, ~ n x (có nghĩa là ~ được áp dụng n lần) là x nếu n chẵn và ~ x nếu là số lẻ.

Do đó, chúng ta có thể viết lại công thức chung của chúng tôi là ~ n n 2 2 + 2 cho tất cả các số nguyên dương n .

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

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

1
Tôi biết có một số loại công thức đơn giản, nhưng giải thích và thực hiện của bạn chỉ là tuyệt vời. +1
Sản phẩm điện tử

5

JavaScript, 40 38 22 byte

Sử dụng giải pháp hình thức khép kín mới lạ, đó là tất cả những cơn thịnh nộ!

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

Nhờ ThomasKwa, tôi có thể loại bỏ chức năng đệ quy tốn kém của mình.


Bạn chỉ cần bitwise KHÔNG một lần nếu n% 2. Trên thực tế, tôi nghĩ trong JS có thể ngắn hơn để làm(n%2?3-n*n:4+n*n)/2
lirtosiast 6/2/2016



3

Chồn 0,15 , 26 15 13 byte

Sử dụng thuật toán điên rồ của Dennis và đánh bại hai byte khác nhờ anh ta. Gã đó chịu trách nhiệm giảm một nửa số byte!

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

Hãy thử nó ở đây!

Giải trình

@VoteToC Đóng n^ 2, áp dụng bitwise KHÔNG nlần, thêm bốn, một nửa. - Thomas Kwa 7 phút trước

Xem câu trả lời của Dennis để biết giải thích lý do tại sao điều đó hoạt động. Trong một nhận xét về câu trả lời này, ông đã đề xuất một cải tiến khác hoạt động vì :phân chia số nguyên, vì vậy tôi có thể phủ định đỉnh ngăn xếp và không lo lắng về +1 khi thực hiện bổ sung nhị phân. Hơn nữa, n và n ^ 2 có cùng tính chẵn lẻ, loại bỏ sự cần thiết phải trao đổi.

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 byte

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

Điều này sử dụng thuật toán từ câu trả lời Jelly của tôi . Hãy thử trực tuyến!

Làm thế nào nó hoạt động

~            # 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 byte

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

Cổng đơn giản của câu trả lời Python 2 của @ Dennis.

Trong khi viết câu trả lời này, tôi đã quản lý để chơi cổng ES6 của mình tới 17 byte!

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


2

Bash thuần khiết, 28

Bây giờ @Dennis đã chỉ cho chúng tôi tất cả cách thực hiện việc này, điều này cần cập nhật:

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

Câu trả lời trước:

Tiện ích Bash + GNU, 77

Đây là một khởi đầu:

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

N được truyền dưới dạng tham số dòng lệnh.

pastethực sự tiện dụng ở đây để sản xuất tổng xen kẽ. Các -dtùy chọn cho phép một danh sách các ký tự phân cách, được sử dụng theo chu kỳ.


$[-1**$1*$1*$1+4>>1]thậm chí còn ngắn hơn.
Neil

2

Julia, 41 40 25 19 16 byte

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

Đây là một hàm ẩn danh chấp nhận một số nguyên và trả về một số nguyên. Để gọi nó, gán nó cho một biến.

Cách tiếp cận ở đây, được Dennis nghĩ ra, như sau. Đầu tiên chúng ta có được tính chẵn lẻ của n , tức là n (mod 2) và phủ định nó. Điều này cho chúng ta 0 cho đầu vào chẵn và -1 cho lẻ. Chúng tôi sau đó bitwise XOR với n 2 . Khi n chẵn, đây chỉ là n 2 vì XOR với 0 chỉ là số. Khi n là số lẻ, XOR với -1 giống như phủ định bitwise. Vì vậy, tại thời điểm này, chúng ta hoặc có n 2 hoặc bitwise KHÔNG của n 2 . Chúng tôi chia số nguyên này cho 2 và thêm 2 để có kết quả.

Đã lưu một byte nhờ Sp3000 trên phiên bản trước và lưu 9 nhờ Dennis trên cái này!



1

Python 2, 24 byte

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

Điều này sử dụng thuật toán từ câu trả lời Jelly của tôi , với một sửa đổi nhỏ:

Thay vì áp dụng ~ n lần, chúng tôi áp dụng - n lần (bằng cách nhân với (-1) n ). Điều này tương đương vì ~ x = -x - 1 và các tầng phân chia số nguyên trong Python, vì vậy ~ x / 2 = (-x - 1) / 2 = -x / 2 .


1

Bình thường, 11 byte

+2/u_GQ*QQ2

Dùng thử trực tuyến trong Trình biên dịch Pyth .

Làm thế nào nó hoạt động

Điều này sử dụng thuật toán từ câu trả lời Jelly của tôi , với một sửa đổi nhỏ:

Thay vì áp dụng ~ n lần, chúng tôi áp dụng - n lần (bằng cách nhân với (-1) n ). Điều này tương đương vì ~ x = -x - 1 và các tầng phân chia số nguyên trong Pyth, vì vậy ~ 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

đc, 17

Sử dụng cùng một công thức đã thử và thử nghiệm từ Dennis:

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

Dùng thử trực tuyến Oh, tại sao hộp cát bash Ideone dckhông bao gồm ?

Kiểm tra dòng lệnh:

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

?2^1+2~2*1-*2+ptiết kiệm hai byte.
Dennis

1

GS2, 9 byte

V,@!α2+''

Điều này sử dụng thuật toán từ câu trả lời Jelly của tôi . Hãy thử trực tuyến!

V,@e 7+''

cũng ngắn không kém, nhưng đáng chú ý là không chứa các ký tự không phải ASCII.

Làm thế nào nó hoạt động

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 byte

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

Điều này sử dụng thuật toán tương tự như câu trả lời Jelly của tôi. Thử nghiệm nó với J.js .


0

Lua, 33 byte ( Dùng thử trực tuyến )

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

Làm thế nào nó hoạt động:

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

APL Dyalog, 13 byte

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

Điều này sử dụng thuật toán tương tự như câu trả lời Jelly của tôi. Kiểm tra nó trên TryAPL .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.