ค้นหาผลรวมไขว้ที่ 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=1ถึง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: นั่นไม่ใช่ผลรวมสลับกัน คุณกำลังเพิ่มคำสองคำแรก
เดนนิส

คำตอบ:


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

ความแตกต่างระหว่างองค์ประกอบในแนวทแยงในแถวที่สอดคล้องกันจากด้านบนและด้านล่าง ( 1และ5และ21และ25; 7และ9และ17และ19) ก็เช่นเดียวกันดังนั้นพวกเขาจะยกเลิกการออกในผลรวมสลับ

ในตัวอย่างนี้

- 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)สองของจำนวนเต็มสมบูรณ์ ( ~หมายถึงค่าที่เหมาะสมไม่ได้) สูตรสำหรับกรณีแปลกสามารถเขียนใหม่เป็น~ n 2 ÷ 2

นอกจากนี้เนื่องจากมีการเพิ่มเทอมแรก ( 1 ) ของผลรวมดั้งเดิมแทนการลบดังนั้นสูตรด้านบนจึงมีข้อผิดพลาด2ซึ่งต้องได้รับการแก้ไข

ดังนั้นที่ n THรวมข้ามสลับเป็นn 2 ÷ 2 + 2ถ้าnเป็นได้และ~ n 2 ÷ 2 + 2ถ้ามันเป็นสิ่งที่แปลก

สุดท้ายค่าที่เหมาะสมไม่เป็นร่วมด้วยเช่น~~ x = xสำหรับทุกx วิธีนี้~~~ x = ~ x , ~~~~ x = xและโดยทั่วไป~ n x (หมายความว่า~ถูกนำไปใช้nครั้ง) คือxถ้าnเป็นเลขคู่และ~ xหากมันแปลก

ดังนั้นเราจึงสามารถเขียนสูตรทั่วไปของเราเป็น~ n n 2 ÷ 2 + 2สำหรับจำนวนเต็มบวกทั้งหมดn

รหัส

²~³¡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

JavaScript, 40 38 22 ไบต์

การใช้โซลูชันรูปแบบใหม่ที่แปลกใหม่และปิดแล้วนั่นคือความโกรธทั้งหมด!

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

ขอบคุณ ThomasKwa ฉันสามารถกำจัดฟังก์ชั่นวนซ้ำได้


คุณเพียงแค่ต้องไม่ bitwise ถ้า n% 2 อันที่จริงผมคิดว่าใน JS มันอาจจะสั้นลงเพียงแค่ทำ(n%2?3-n*n:4+n*n)/2
lirtosiast



3

Minkolang 0.15 , 26 15 13 ไบต์

การใช้อัลกอริธึมบ้าของเดนนิสและออกไปอีกสองไบต์ขอบคุณเขา ผู้ชายคนนั้นรับผิดชอบในการลดจำนวนไบต์ลงครึ่งหนึ่ง!

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

ลองที่นี่!

คำอธิบาย

@VoteToClose n^ 2 ใช้ bitwise NOT nครั้งเพิ่มสี่ลดลงครึ่งหนึ่ง - Thomas Kwa 7 นาทีที่แล้ว

ดูคำตอบของเดนนิสสำหรับคำอธิบายว่าทำไมจึงได้ผล ในความคิดเห็นเกี่ยวกับคำตอบนี้เขาแนะนำการปรับปรุงอื่นที่ใช้งานได้เพราะ:เป็นการหารจำนวนเต็มดังนั้นฉันสามารถลบล้างส่วนบนสุดของสแต็กและไม่ต้องกังวลกับ +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+

นี้ใช้อัลกอริทึมจากคำตอบของวุ้นของฉัน ลองออนไลน์!

มันทำงานอย่างไร

~            # 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's Python 2 คำตอบ

ในขณะที่เขียนคำตอบนี้ฉันจัดการกอล์ฟพอร์ต ES6 ของฉันถึง 17 ไบต์ด้วย!

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


2

Pure Bash, 28

ตอนนี้ที่ @Dennis ได้แสดงให้เราเห็นถึงวิธีการทำสิ่งนี้จำเป็นต้องมีการอัพเดท:

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

คำตอบก่อนหน้า:

ยูทิลิตี Bash + 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ตัวเลือกที่ช่วยให้รายการของตัวละครตัวคั่นซึ่งจะใช้ cyclically


$[-1**$1*$1*$1+4>>1]สั้นกว่า
Neil

2

Julia, 41 40 25 19 16 ไบต์

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

นี่เป็นฟังก์ชั่นนิรนามที่รับจำนวนเต็มและคืนค่าจำนวนเต็ม หากต้องการเรียกใช้กำหนดค่าให้กับตัวแปร

วิธีการที่นี่ออกแบบโดยเดนนิสมีดังต่อไปนี้ ก่อนอื่นเราจะได้พาริตีของnคือn (mod 2) และลบล้างมัน สิ่งนี้ทำให้เรามีค่า 0 สำหรับการป้อนค่าคู่และ -1 สำหรับคี่ เรา XOR แล้วค่าที่เหมาะสมกับn 2 เมื่อnเป็นเลขคู่นี่ก็แค่n 2เพราะ XOR ที่มี 0 คือจำนวน เมื่อnเป็นเลขคี่ XOR ที่มี -1 จะเท่ากับการปฏิเสธบิต ดังนั้นในจุดนี้เราอาจมีn 2หรือค่าที่เหมาะสมไม่ได้n 2 เราจำนวนเต็มหารด้วย 2 แล้วบวก 2 เพื่อให้ได้ผลลัพธ์

บันทึกเป็นไบต์ด้วย Sp3000 ในเวอร์ชันก่อนหน้านี้และบันทึกไว้ 9 ขอบคุณ Dennis ในอันนี้!



1

Python 2, 24 ไบต์

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

วิธีนี้ใช้อัลกอริทึมจากคำตอบ Jelly ของฉันโดยมีการแก้ไขเล็กน้อย:

แทนที่จะใช้~ nคูณเราใช้- nคูณ (โดยการคูณด้วย(-1) n ) นี้จะเทียบเท่าเพราะ~ x = -x - 1และหมวดจำนวนเต็มชั้นในหลามดังนั้น~ x / 2 = (-x - 1) / 2 = -x / 2


1

Pyth, 11 ไบต์

+2/u_GQ*QQ2

ลองออนไลน์ใน Pyth คอมไพเลอร์

มันทำงานอย่างไร

สิ่งนี้ใช้อัลกอริทึมจากคำตอบ Jelly ของฉันโดยมีการแก้ไขเล็กน้อย:

แทนที่จะใช้~ nคูณเราใช้- nคูณ (โดยการคูณด้วย(-1) 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

ลองใช้ออนไลน์ โอทำไมกล่อง Sandbox ของ Ideone 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+pบันทึกสองไบต์
เดนนิส

1

GS2, 9 ไบต์

V,@!α2+''

นี้ใช้อัลกอริทึมจากคำตอบของวุ้นของฉัน ลองออนไลน์!

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.


0

Lua, 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*⊢

นี่ใช้อัลกอริทึมเดียวกับคำตอบ Jelly ของฉัน ทดสอบบนTryAPL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.