ลำดับของผลรวมของจำนวนเต็มที่ไม่ได้อยู่ในลำดับ


28

พื้นหลัง

พิจารณาลำดับที่กำหนดดังนี้:

  • องค์ประกอบแรกคือ 0;
  • องค์ประกอบที่สองคือ 4;
  • จากองค์ประกอบที่สามเป็นต้นไปค่าสามารถคำนวณได้โดย:
    • การตั้งค่าจำนวนเต็มตั้งแต่ 0 ถึงองค์ประกอบก่อนหน้าของลำดับ (รวมหรือพิเศษไม่สำคัญ);
    • การลบจำนวนเต็มใด ๆ ที่มีอยู่แล้วก่อนหน้านี้ในลำดับจากชุด;
    • การรวมองค์ประกอบที่เหลือของชุดเข้าด้วยกัน นั่นคือคุณค่าที่คุณต้องการ

ที่น่าสนใจลำดับนี้ไม่ได้ดูเหมือนจะอยู่ในOEISเลย

งาน

เขียนโปรแกรมหรือฟังก์ชั่นซึ่งรับจำนวนเต็มnเป็นอินพุตและส่งออกองค์ประกอบที่nของลำดับ

กรณีทดสอบ

องค์ประกอบสองสามอย่างแรกของลำดับคือ:

  • 0
  • 4
  • 6 (1 + 2 + 3)
  • 11 (1 + 2 + 3 + 5)
  • 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
  • 969 (1 + 2 + 3 + 5 + 7 … 10 + 12 … 44)
  • 468930 (1 + 2 + 3 + 5 + 7 … 10 + 12 … 44 + 46 … 968)

ชี้แจง

  • ในทางทฤษฎีโปรแกรมของคุณควรสามารถจัดการกับnเองได้หากทำงานกับภาษาที่มีจำนวนเต็มจำนวนมากและเข้าถึงหน่วยความจำได้ไม่ จำกัด จำนวน (ภาษาที่ไม่มี bignums ไม่น่าจะได้รับเกิน 46,8930 แต่ไม่มีข้อแก้ตัวที่จะ hardcode คำตอบ)
  • คุณอาจเลือกการจัดทำดัชนีตาม 0 หรือ 1 สำหรับลำดับ (เช่นมันขึ้นอยู่กับคุณว่าn = 1 ส่งกลับองค์ประกอบแรก, n = 2 องค์ประกอบที่สองและอื่น ๆ หรือว่าn = 0 ส่งกลับองค์ประกอบแรก , n = 1 องค์ประกอบที่สองและอื่น ๆ )
  • ไม่มีข้อกำหนดเกี่ยวกับอัลกอริทึมที่คุณใช้หรือประสิทธิภาพ คุณอาจใช้คำจำกัดความของลำดับโดยตรง (แม้ว่าจะไม่มีประสิทธิภาพจริงๆ) และคุณอาจใช้อัลกอริทึมที่แตกต่างซึ่งนำไปสู่ผลลัพธ์เดียวกัน

เงื่อนไขชัยชนะ

นี่คือดังนั้นโปรแกรมที่ถูกต้องสั้นที่สุดวัดเป็นไบต์ชนะ


1
ทำไมไม่อนุญาตให้ส่งออกอนันต์แทนการป้อนข้อมูล?
John Dvorak

2
@JanDvorak: เพราะนั่นเป็นการบังคับให้โปรแกรมทั้งหมดใช้อัลกอริทึมที่สร้างทุกคำ วิธีการเขียนคำถามนี้จะทำให้ผู้ตอบทราบว่าพวกเขาต้องการทำอย่างนั้นหรือไม่หรือพวกเขาต้องการใช้สูตรแบบปิด (สมมติว่ามี) ดังนั้นจึงมีทางเลือกมากขึ้นของกลยุทธ์ในการแก้ปัญหา

1
ฉันคิดว่าลำดับไม่อยู่ที่นั่นเพราะ 0,4 เป็นออฟเซ็ตแปลก ๆ
boboquack

1
@boboquack ด้วย (0,3), (0,2), (1,4) หรือรูปแบบที่คล้ายกันลำดับจะคงที่หลังจากผ่านข้อกำหนดสองสามข้อ
เดนนิส

แท็ก [คณิตศาสตร์] เหมาะสมหรือไม่
mbomb007

คำตอบ:


10

เยลลี่ , 13 12 9 ไบต์

rSạo4¥ð@¡

ใช้การจัดทำดัชนีแบบ 0

ลองออนไลน์!

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

rSạo4¥ð@¡  Main link. No arguments. Implicit argument: 0

      ð    Collect everything to the left into a chain and start a new, dyadic one.
           The arity of the first chain is unknown at this point, as it isn't
           prefixed by ø, µ, or ð.
       @   Swap the arguments of the first chain. Swapping  arguments is only
           implemented for dyadic links, so this makes the chain dyadic.
        ¡  Read an integer n from STDIN and execute the chain n times. Taking the
           argument swap into account, the chain is executed first with 0 as left
           and right argument, then with the previous right argument as left
           argument and the previous return value as right argument.
           The return value of the last call is the return value of the quicklink
           and becomes the implicit output.

           Let's call the left argument x and the right argument y.
r            Range; yield [x, ..., y].
 S           Compute the sum of all integers in the range.
     ¥       Convert the two atoms to the left into a dyadic chain, and call that
             chain with arguments x and y.
   o4          Take the logical OR of x and 4, replacing a 0 with 4 and leaving
               positive integers untouched.
  ạ          Take the absolute difference of the sum to the left and the result of
             the logical OR to the right.

10

Python 66 66ไบต์

ขอบคุณ @Dennis ที่โกนหนวด 6 ไบต์!

f=lambda n:n>2and(f(n-1)-~f(n-2))*(f(n-1)-f(n-2))/2or(5-n)*n

มันไม่ได้เป็นส่วนของ golfiest แต่เคยใช้สูตรที่ฉันทำ:

enter image description here

อยู่ที่ไหนxบนขวามือด้านf(n - 1)และเป็นyf(n - 2)

คำอธิบาย:

ผลรวมของจำนวนเต็มต่อเนื่องจากaถึงb(รวม) สามารถอธิบายได้ด้วยสูตรนี้:

amount * average

โดยที่amount(จำนวนตัวเลข) มีคำอธิบายดังนี้:

((a - b) - 1)

และaverage(ค่าเฉลี่ยของตัวเลขทั้งหมด) มีการอธิบายดังนี้:

(a + b) / 2

ดังนั้นสูตรเต็มตอนนี้:

  ((a - b) - 1)(a + b) / 2
= (a - b - 1)(a + b) / 2

วิธีที่เราใช้สูตรนี้ในสูตรสุดท้ายคือการทดแทนaสำหรับf(n - 1), bสำหรับf(n - 2)ซึ่งโดยทั่วไปจะคำนวณผลรวมของทั้งหมดของข้อตกลงใหม่และเพิ่มอีกf(n - 1)(ซึ่งขณะนี้a) บนซึ่งเป็นผลรวมของข้อตกลงก่อนหน้านี้ทั้งหมด

เมื่อรวมเข้าด้วยกันเราจะได้รับ:

  a + ((a - b - 1)(a + b) / 2)
= a + ((a^2 + ab - ab - b^2 - a - b) / 2)
= a + ((a^2 - b^2 - a - b) / 2)
= (a^2 - b^2 - a - b + 2a) / 2
= (a^2 - b^2 + a - b) / 2
= ((a + b)(a - b) + (a - b)) / 2
= (a + b + 1)(a - b) / 2

แทนที่aด้วยxและbด้วยyและเฮ้ presto คุณต้องสูตรข้างต้น



9

Mathematica, 49 48 ไบต์

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]
(* or *)
±2=4;±1=0;±n_:=-Tr@Array[(k=±#)&,n-1]+Tr@Range@k

ใช้การเข้ารหัส CP-1252 กำหนดฟังก์ชั่นPlusMinus (±)ฟังก์ชั่นกำหนด1 การจัดทำดัชนี

คำอธิบาย

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]

±2=4;±1=0;                                        (* Define ±1 and ±2 *)
          ±n_:=                                   (* ±n equals ... *)
               Tr@Range@±(n-1)                    (* Sum of (1, 2, ..., ±(n-1)) ... *)
                              -Tr@Array[±#&,n-1]  (* Minus the sum of previous terms *)

8

โอเอซิส 11 ไบต์

รหัส:

+>bc-*2/640


คำอธิบาย:

จะเห็นภาพความสัมพันธ์ของnลองมาตัวอย่าง 5 วิธีคำนวณf 5ลองดูที่ผลรวมต่อไปนี้:

1 + 2 + 3 + 5 + 7 + 8 + 9 + 10

ส่วนที่หนาเป็นเพียงเช่นเดียวกับเอฟ 4 7 + 8 + 9 + 10ส่วนหนึ่งเป็นช่วง[F n-2 + 1, ฉn-1 - 1] นั่นทำให้สูตรf n-1 + Σ [f n-2 + 1 ... f n-1 - 1] ( ลิงก์ Wolfram ):

f n = 0.5 × (f n-1 2 - f n-2 2 + f n-1 - f n-2 )

ซึ่งสามารถเขียนใหม่เป็น:

f n = 0.5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 ) + (f n-1 - f n-2 ))

f n = 0.5 × ((f n-1 - f n-2 ) (f n-1 + f n-2 + 1)

สูตรใดที่เราจะใช้ในรหัส:


คำอธิบายรหัส

640ส่วนช่วยให้เรามีกรณีฐาน:

a(0) = 0
a(1) = 4
a(2) = 6

รหัสที่จะถูกดำเนินการ (ซึ่งกำหนด(n) ):

+>bc-*2/

+          # Add a(n + 1) and a(n + 2) implicitly
 >         # Add one to get a(n + 1) + a(n + 2) + 1
  b        # Push a(n + 1)
   c       # Push a(n + 2)
    -      # Subtract from each other
     *     # Multiply with the previous result
      2/   # Halve the result

ลองออนไลน์!


3
คำอธิบาย? นี่ทำให้ฉันสงสัยมากกว่าคำตอบอื่น ๆ

@ ais523 ฉันได้เพิ่มคำอธิบายแล้ว
Adnan

5

Julia, 39 33 32 ไบต์

!n=n<3?5n-n^2:sum(!(n-2)+1:!~-n)

0-based

ขอบคุณ @Dennis บันทึก 6 ไบต์

ขอบคุณ @GlenO บันทึกเป็นไบต์

ลองออนไลน์!

คำตอบก่อนหน้า 1 ที่ใช้:

!n=n<4?2(n>1)n:sum(!(n-2)+1:!~-n)

ลองออนไลน์!

คำตอบที่ไม่ได้รับคำตอบก่อนหน้า 1 รายการ:

f(n)=n<4?n<2?0:n*2:sum(f(n-2)+1:f(n-1))

ลองออนไลน์!


1
หากต้องการบันทึกไบต์พิเศษให้ใช้n<3?5n-n^2:แทนn<4?2(n>1)n:- โปรดทราบว่ามันจะเปลี่ยนเป็นการใช้การจัดทำดัชนีแบบ 0
เกลน O

@GlenO ขอบคุณบันทึก 1 ไบต์!
rahnema1

4

JavaScript (ES6), 47 ไบต์

f=(n,b=4,a=6)=>n?--n?f(n,a,(a+b+1)*(a-b)/2):b:0

ใช้ความสัมพันธ์ที่เกิดซ้ำf(n) = sum(range(f(n-2) + 1, f(n-1) + 1))สำหรับ n> 2


4

PowerShell , 84 89 88 87 ไบต์

$OFS='+'
for($a=0,4;$a.Count-le($n="$args")){$a+=("$(1..$a[-1])"|iex)-("$a"|iex)}$a[$n]

ลองออนไลน์!

คำอธิบาย

การทำดัชนีแบบ 0 ใช้งานได้ผ่านn = 6(บนเครื่อง Windows ของฉันเท่านั้นที่เกิดปัญหากับสแตกล้นn = 7 )

ใช้วิธีเดียวกันกับคำตอบของ JungHwan Min (ผลรวมของช่วงลบกับผลรวมของคำก่อนหน้า)

การสรุปช่วง / อาร์เรย์ใน PowerShell นั้นยาวดังนั้นฉันจึงใช้เคล็ดลับในการเข้าร่วมอาร์เรย์+เพื่อสร้างนิพจน์ที่ยาวนาน (เช่น1+2+3+4...etc ) แล้วส่งผ่านiex( Invoke-Expression)

เนื่องจากฉันต้องทำสองครั้งแทนที่จะใช้-joinฉันกำลังตั้งค่าตัวแปรพิเศษ$OFSซึ่งหมายถึงตัวคั่นฟิลด์เอาต์พุต เมื่อคุณทำให้อาร์เรย์เป็นสตริงนี่คืออักขระที่ใช้ในการเข้าร่วมองค์ประกอบ มันเริ่มต้นที่ช่องว่าง ดังนั้นโดยการตั้งค่าให้+ (ครั้งเดียว) ผมสามารถเปลี่ยนสิ่งที่ต้องการด้วย$a-join'+'|iex"$a"|iex

การforวนรอบอย่างง่ายจะดำเนินต่อไปจนกระทั่งการนับลำดับน้อยกว่าหรือเท่ากับจำนวนเต็มอินพุทจากนั้นฉันกลับ$nองค์ประกอบที่


@AdmBorkBork ดีมาก! ฉันคิดว่ามันคุ้มค่ากับคำตอบที่ชัดเจน วิธีการนั้นแตกต่างกันพอที่จะไม่รู้สึกเหมือนตัวเองถ้าฉันใช้มัน
ต้มตุ๋น

1
@AdmBorkBork เป็นคนดี +1 และฉันได้เรียนรู้สิ่งหนึ่งจากสิ่งนั้น: ไม่;จำเป็นหลังจากforลูป ไม่เคยรู้มาก่อนเลยว่า
ต้มตุ๋น

3

MATL , 17 16 ไบต์

OKi:"tP:yX-sv]G)

1ใช้การจัดทำดัชนีตาม รหัสไม่มีประสิทธิภาพมาก สำหรับn = 6มันเกินขีด จำกัด หน่วยความจำของคอมไพเลอร์ออนไลน์แล้ว

ลองออนไลน์!

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

O       % Push 0
K       % Push 4
i       % Input n
:"      % Do the following n times
  t     %   Push a copy of the top array (or number)
  P:    %   Range from 1 to the last element of array
  y     %   Push a copy of the second-top number/array
  X-    %   Set difference
  s     %   Sum
  v     %   Concatenate everything into a column vector
]       % End
G)      % Get n-th entry of the array. Implicity display

สำหรับ20 ไบต์รุ่นต่อไปนี้หลีกเลี่ยงข้อ จำกัด ของหน่วยความจำ แต่ยังคงมีข้อ จำกัด ประเภทข้อมูล ( doubleประเภทสามารถรับประกันได้ว่าจำนวนเต็มจะแสดงได้อย่างถูกต้องสูงสุด2^53) ดังนั้นผลลัพธ์จึงใช้ได้ถึงn = 8เท่านั้น

OKi:"t0)tQ*2/ys-v]G)

ลองออนไลน์ด้วย!


2

Haskell , 42 ไบต์

f 0=0
f 1=4
f 2=6
f n=sum[1+f(n-2)..f$n-1]

ลองออนไลน์!

นี่เป็นการดำเนินการที่เกิดขึ้นโดยตรงn>2ซึ่งf(n)เท่ากับf(n-1)บวกกับผลรวมของช่วงเวลาที่เปิดจากf(n-2)ที่f(n-1)ซึ่งอีกครั้งเท่ากับผลรวมของช่วงเวลาครึ่งที่เปิดจากf(n-2)ถึงf(n-1)รวม

f(0) = 0
f(1) = 4
f(2) = 6 = 1+2+3
f(3) = 11 = 1+2+3+5 = 6 + 5 = 6 + sum]4,6[ = f(2)+ sum]f(1),f(2)[ = sum]f(1),f(2)]
...
f(n) = sum]f(n-2),f(n-1)] = sum[f(n-2)+1,f(n-1)]

2

Haskell, 31 ไบต์

m#s=m:s#sum[m+1..s]
((0:4#6)!!)

ตัวอย่างการใช้งาน: ->((0:4#6)!!) 6468930ลองออนไลน์! .

เรียกซ้ำง่ายที่ติดตามองค์ประกอบสูงสุดเพื่อให้ห่างไกลและความคุ้มค่าต่อไปms


เมื่อใดก็ตามที่ฉันมาถึงการท้าทายใหม่ใครบางคนทำคำตอบ
ฮาเซลได้

ฉันมักจะมาถึงความท้าทายทางคณิตศาสตร์คิดว่า "เฮ้ในที่สุดฉันก็สามารถลองฮาเซล!" CMD-F 'Haskell' - โอ้รอไม่ได้คำตอบนี้ ... เดี๋ยวก่อนอะไรนะ? ให้ขึ้นกับ
Haskell


2

Perl 6 ,  52 49 44  35 ไบต์

{(|(0,4 X 0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

ลองมัน

{(0,(4,0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

ลองมัน

{(0,(4,0),{[+](^.[0])-.[1],.sum}...*)[$_;0]}

ลองมัน

{(0,4,6,{[+] $^a^..$^b}...*)[$_]}

ลองมัน

ขยาย:

{ # bare block lambda with implicit parameter 「$_」

  (
    # generate a sequence

    0, 4, 6,      # seed the sequence

    {             # lambda with placeholder parameters 「$a」 「$b」
      [+]         # reduce with 「&infix:<+>」
          $^a     # n-2
          ^..     # Range that excludes the first value
          $^b     # n-1
    }
    ...           # keep generating values until
    *             # never stop

  )[ $_ ]         # get the value that was asked for (0 based index)
}

2

PowerShell , 77 73 ไบต์

param($n)$a=0,4;1..$n|%{$a+=(0..$a[-1]|?{$_-notin$a})-join'+'|iex};$a[$n]

ลองออนไลน์!

ใช้อัลกอริทึมตามที่กำหนดและได้รับการจัดทำดัชนี 0 อินพุตของ6มากเกินไปสำหรับ TIO ที่จะจัดการ

ชุดที่จะเป็นอาร์เรย์$a [0,4]วนซ้ำจาก1ขึ้นเป็นอินพุต $nในวงเราใช้ช่วงของตัวเลขจาก0จำนวนมากที่สุดที่เรามี$a[-1]และใช้ส่วนWhere-Objectคำสั่ง|?{...}เพื่อดึงเฉพาะตัวเลขที่ไม่ได้มีอยู่ อาเรย์ของตัวเลขนั้นคือ-joinรวมเข้ากับ+s แล้วป้อนไปที่iex(ย่อมาจากInvoke-Expressionและคล้ายกับeval) $aค่าที่ถูกแล้วอาร์เรย์ตัดแบ่งไปยังจุดสิ้นสุดของ ในที่สุดเราก็ออกจากวงของเราและรับ$nหมายเลข th ในอาร์เรย์ของเรา หมายเลขนั้นถูกทิ้งไว้บนไพพ์ไลน์และเอาต์พุตนั้นเป็นนัย



1

แบตช์ 108 ไบต์

@if %1==0 echo 0&exit/b
@set/ab=4,a=6
@for /l %%i in (2,1,%1)do @set/ac=(a+b+1)*(a-b)/2,b=a,a=c
@echo %b%

คำตอบของ JavaScript พอร์ตของฉัน


1

dc , 47 ไบต์

?d1-scd/4*dd[d1+*2/r-dsn+dlnlc1-dsc0<x]sxlc0<xp

ทำงานร่วมกับจำนวนเต็มขนาดใหญ่เท่าที่คุณต้องการจนถึงความจุหน่วยความจำของคอมพิวเตอร์

ลองออนไลน์!

การจัดทำดัชนีตาม 0, อินพุตบน stdin, เอาต์พุตบน stdout (นอกจากนี้ยังมีเอาต์พุตใน stderr ซึ่งจะถูกละเว้น)

ตัวอย่างการวิ่ง:

$ for ((j=0;j<12;j++)){ echo -n "$j ";dc -f sumseq.dc <<<"$j";echo;} 2>/dev/null
0 0

1 4

2 6

3 11

4 45

5 969

6 468930

7 109947436950

8 6044219445882138462810

9 18266294354989892462984673364511343859409730

10 166828754731567805766174036610844675771635260155825966927845486666328\
837158267993261860

11 139159167026428037700805570917048711514125048327321592278500415852500\
422178720517080334552793040951056255170819719745908378102737875659900\
61575545777065220385544711322919415

สิ่งนี้ใช้อัลกอริธึมแบบเดียวกันกับวิธีแก้ไขปัญหาต่อไปนี้ใน bash ซึ่งอ่านได้มากกว่า (เล็กน้อย):

ทุบตีบริสุทธิ์ 60 ไบต์

for((n=s=$1?4:0,k=1;k<$1;k++,s+=(n=n++*n/2-s))){ :;}
echo $n

แต่โปรแกรม bash นั้นใช้งานได้กับอินพุตสูงสุด 7 เท่านั้นเนื่องจากจะมีจำนวนเต็มล้นเกินกว่านั้น



0

C # - 74 ไบต์

int A(int f){int e=4,i=1,s=0;for(;i++<f;)e=e*-~e/2-(s+=e);return f>0?e:0;}

Ungolfed:

int A(int f)
{
    int e = 4, 
        i = 1, 
        s = 0; // e is the last element, s is the sum of all previous elements
    for (; i++ < f; ) // calculate for indexes 1 through max (don't need the index, just a correct number of loop cycles)
        e = e * -~e / 2 - (s += e); // -~e => (e + 1), higher precedence to remove parentheses
    return f > 0 ? e : 0; //handle input 0 as a special case, which is 0
}

อาจมีวิธีการแปลงเป็นแลมบ์ดาเพื่อประหยัดมากขึ้นหรือสิ่งที่ใช้ฟังก์ชั่น. Agregate แม้ว่าในปัจจุบันฉันไม่มีการนำเข้าดังนั้นมันอาจจะออกมาได้บ้าง


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