ลำดับการกระโดด


19

พิจารณาลำดับต่อไปนี้:

0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...

ดูลวดลายน้อยลงใช่มั้ย นี่คือวิธีการทำงาน เริ่มต้นด้วยการ0กระโดดขึ้นnจำนวนเต็มด้วยราคาเริ่มต้นที่n 1นั่นคือหมายเลขถัดไปในลำดับ จากนั้นจึงเพิ่มหมายเลขใด ๆ ที่ "ข้าม" และที่ยังไม่เคยเห็นมาก่อน จากนั้นเพิ่มnและกระโดดจากหมายเลขสุดท้ายต่อท้าย ทำซ้ำรูปแบบนี้

ดังนั้นสำหรับตัวอย่างเช่นเมื่อเราไปถึงเราจะอยู่ที่11 n=5เราเพิ่มnเป็นn=6กระโดดขึ้น17แล้วผนวกต่อ13 14 15 16เนื่องจากสิ่งที่ยังไม่เห็น กระโดดต่อไปของเราคือเพื่อให้องค์ประกอบในลำดับถัดไปคือn=723

ความท้าทาย

รับอินพุตxส่งออกxเทอมที่ของลำดับนี้xเทอมแรกของลำดับหรือสร้างรายการอนันต์ของเทอมของลำดับ คุณสามารถเลือก 0- หรือ 1 การจัดทำดัชนี

I / O และกฎ

  • อินพุตและเอาต์พุตจะได้รับโดยวิธีการที่สะดวกใด
  • อินพุตและเอาต์พุตสามารถสันนิษฐานได้ว่าเหมาะสมกับชนิดของหมายเลขในภาษาของคุณ
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

เห็นได้ชัดว่ามันไม่ (ยัง?) ในOEIS
JayCe

@ JayCe ฉันไม่แปลกใจ - มันเป็นลำดับโดยพลการสวย
AdmBorkBork

คำตอบ:


24

JavaScript (ES7), 41 ไบต์

ส่งคืนคำศัพท์n-thของลำดับ 0-indexed

n=>(d=(n--*8-23)**.5)%1?n:'121'[n]^n-~d/2

ลองออนไลน์!

อย่างไร?

กรณีหลัก: n>3

สี่ข้อแรกของลำดับนั้นเป็นแบบพิเศษดังนั้นเรามาดูกันก่อน

สำหรับลำดับจะเป็นดังนี้:n>3

 n  | [4] 5 [6] 7 8 [ 9] 10 11 12 [13] 14 15 16 17 [18] 19 20 21 22 23 [24] 25 26 27 ...
----+------------------------------------------------------------------------------------
a(n)| [5] 4 [8] 6 7 [12]  9 10 11 [17] 13 14 15 16 [23] 18 19 20 21 22 [30] 24 25 26 ...
----+------------------------------------------------------------------------------------
 k  |  2  -  3  - -   4   -  -  -   5   -  -  -  -   6   -  -  -  -  -   7   -  -  - ...

เราสามารถสังเกตเห็นได้ว่าในความเป็นจริงมีสองลำดับย่อยของ interleaved:

  • ค่าส่วนใหญ่เป็นของลำดับย่อยที่เรามี:A

    A(n)=n-1
  • ค่าอื่น ๆ อยู่ในลำดับย่อย (เน้นด้วยวงเล็บในแผนภาพด้านบน) ซึ่งดัชนีเป็นไปตามลำดับเลขคณิต3, 3, 4, 6, 9, 13, 18, 24 ... และที่เรามี:B

    B(n,k)=n+k-1

    ที่เป็นดัชนีในลำดับหลักและkเป็นดัชนีในย่อยลำดับBnkB

ดัชนีของในลำดับหลักได้รับจาก:B

nk=k2-k+62

รับเรารู้ว่าคำที่เกี่ยวข้องในลำดับหลักเป็นของBถ้าnเป็นวิธีการแก้ปัญหาจำนวนเต็มของสมการกำลังสอง:nBn

x2-x+6-2n=0

ซึ่งเลือกปฏิบัติคือ:

Δ=1-4(6-2n)=8n-23

และคำตอบเชิงบวกคือ:

x=1+Δ2

เราคาดหวังเป็นจำนวนเต็ม ดังนั้นการทดสอบ:Δ

(d = (n-- * 8 - 23) ** .5) % 1

กรณีพิเศษ: 0n3

สำหรับ , จำแนกเป็นลบและสละผลรากตารางในน่าน สำหรับn = 3 , จำแนกเป็น1 ดังนั้นเหล่านี้สี่ข้อแรกของลำดับจะถือว่าเป็นของย่อยลำดับBn<3n=31B

เราควรจะใช้สูตรมาตรฐานn - ~ d / 2เราจะได้:

-12,12,32,3

แทน:

0,1,3,2

นี่คือเหตุผลที่เรา XOR ผลลัพธ์เหล่านี้มีตามลำดับ0,1,2 และ 1


10

Huskขนาด 12 ไบต์

Θṁṙ_1C+ḣ2tNN

ลองออนไลน์!

เอาต์พุตเป็นรายการที่ไม่มีที่สิ้นสุด นี่เป็นรุ่นที่พิมพ์แรกN

คำอธิบาย

Θṁṙ_1C + ḣ2tNN - โปรแกรมเต็มรูปแบบ ไม่รับอินพุตเอาต์พุตไปยัง STDOUT
         tN - สร้างรายการไม่มีที่สิ้นสุดของจำนวนธรรมชาติเริ่มต้นจาก 2
      + ḣ2 - และต่อท้าย [1, 2] ผลตอบแทน [1,2,2,3,4,5,6,7,8,9,10,11, ... ]
     CN - ตัดรายการอนันต์ของจำนวนเต็มบวกเป็นชิ้นส่วนเหล่านั้น
               ขนาด Yields [[1], [2,3], [4,5], [6,7,8], [9,10,11,12], ... ]
 ṁ - จัดทำแผนที่และแผ่ผลลัพธ์ออกมาหลังจากนั้น
  ṙ_1 - หมุนไปทางขวาทีละ 1 หน่วย
               ผลตอบแทน [1,3,2,5,4,8,6,7,12,9,10,11, ... ]
Θ - เตรียม 0. อัตราผลตอบแทน [0,1,3,2,5,4,8,6,7,12,9,10,11, ... ]


4

เยลลี่ 15 ไบต์

+‘ɼṪRṙ-œ|@
0Ç¡ḣ

นี่เป็นโปรแกรมเต็มรูปแบบที่ให้nพิมพ์รายการnแรกของลำดับ

ลองออนไลน์!

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

0Ç¡ḣ        Main link. Argument: n

0           Set the return value to 0.
 Ç¡         Call the helper link n times, first with argument 0, then n-1 times
            with the previous return value as argument.
   ḣ        Head; extract the first n items of the last return value.


+‘ɼṪRṙ-œ|@  Helper link. Argument: A (array)

 ‘ɼ         Increment the value in the register (initially 0) and yield it.
+           Add that value to all items in the sequence.
   Ṫ        Tail; extract the last item.
    R       Range; map k to [1, .., k].
     ṙ-     Rotate -1 units to the left, yielding [k, 1, ..., k-1].
       œ|@  Perform multiset union of A and the previous return value.

3

C (gcc), 73 67 64 ไบต์

t,d;f(x){for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);t=x<4?x^x/2:x-1;}

ลองออนไลน์!

กำหนดฟังก์ชั่นfที่รับดัชนี 0 nและสร้างnหมายเลข th ในลำดับ

เราสามารถวิเคราะห์ลำดับดังนี้:

f(n)  = n   where n = 0, 1

f(2)  = 3   // 2 and 3 are swapped
f(3)  = 2

f(4)  = 5   // (+2,+3)
f(6)  = 8   // (+3,+4)
f(9)  = 12  // (+4,+5)
f(13) = 17  // (...)
...

f(n)  = n-1 // for all cases not yet covered

ก่อนอื่นเราจัดการส่วนตรงกลาง:

for(t=4,d=2;d<x;t+=d++)x-t||(d+=x+=d);

โปรดทราบว่าอาร์กิวเมนต์ทางด้านซ้าย (4, 6, 9, 13, ... ) เป็นไปตามรูปแบบ: เพิ่มสองครั้งแรกจากนั้นเพิ่มสามจากนั้นเพิ่มสี่และต่อไปเรื่อย ๆ เราเริ่มต้นt=4และเพิ่มd(ซึ่งเริ่มต้นที่ 2) การวนซ้ำของลูปแต่ละครั้งเพิ่มขึ้นdในกระบวนการ

ร่างกายของวงนั้นน่าสนใจยิ่งขึ้น จำไว้ว่าเราต้องการแมป 4 ถึง 5, 6 ถึง 8, 9 ถึง 12, ฯลฯ นั่นเป็นเพียงการเพิ่มd-1ถ้าเป็นx tอย่างไรก็ตามตรรกะนี้มาก่อนคดีสุดท้ายf(n) = n - 1ดังนั้นเราจึงรู้ว่าเราจะลบ 1 ในตอนท้าย ดังนั้นเราสามารถเพิ่มdถ้าx == t( x-t||(x+=d)) อย่างไรก็ตามเราจะต้องแยกวงออกทันทีหลังจากนี้ - ดังนั้นเราจึงเพิ่มสิ่งนั้นเพื่อdให้ดูไร้สาระd+=x+=dซึ่งจะทำให้d<xสภาพล้มเหลวเสมอ

สิ่งนี้ครอบคลุมทุกอย่างยกเว้นค่าสี่ค่าแรก มองไปที่พวกเขาในรูปแบบไบนารีเราจะได้รับ:

00 -> 00
01 -> 01
10 -> 11
11 -> 10

2 <= x < 4ดังนั้นเราจึงต้องการที่จะพลิกบิตสุดท้ายถ้า x^x/2นี่คือความสำเร็จกับ x/2ให้บิตที่มีนัยสำคัญน้อยที่สุดเป็นอันดับที่สองดังนั้น XOR จึงใช้หมายเลขเดิมพลิกบิตสุดท้ายหากจำนวนคือ 2 หรือ 3


3

เยลลี่ ,  13  10 ไบต์

-3 ต้องขอบคุณเดนนิส (ใช้การจัดทำดัชนี 0 เพื่อบันทึก 2 จากการตั้งค่าผลรวมสะสมและการลดลงครั้งสุดท้าย)

Ḷ»2Äi+_>2$

ลิงก์ monadic ที่รับจำนวนเต็ม0 -indexed nซึ่งคืนค่าจำนวนเต็มa (n)

ลองออนไลน์! หรือดูชุดทดสอบ


ดี! ฉันมีḶÄ+3i+’แต่ไม่มีความคิดวิธีจัดการกรณีขอบ
Dennis

ฉันยังมีḶ»ạ¥3ให้Ḋ3,2;- รู้สึกเหมือนควรมี terer สำหรับบิตนี้
Jonathan Allan

Ḷ»2Äi+_>2$บันทึก 3 ไบต์พร้อมการจัดทำดัชนีแบบ 0
Dennis

โอ้กอล์ฟที่ยอดเยี่ยม! ฉันติดอยู่ในดินแดน 1 ดัชนี
Jonathan Allan


2

MATL , 22 ไบต์

1y:"t0)@+h5M:yX-h]qw:)

เอาต์พุตnเงื่อนไขแรกของลำดับ

ลองออนไลน์!

คำอธิบาย

1         % Push 1
y         % Implicit input: n. Duplicate from below
":        % For each k in [1 2 ... n]
  t0)     %   Duplicate sequence so far. Get last entry, say m
  @+      %   Add k: gives m+k
  h       %   Concatenate horizontally
  5M      %   Push m+k again
  :       %   Range [1 2 ... m+k]
  y       %   Duplicate from below
  X-      %   Set difference
  h       %   Concatenate horizontally
]         % End
q         % Subtract 1, element-wise
w         % Swap. Brings original copy of n to the top
:)        % Keep the first n entries. Implicit display

ฉันชอบรอยยิ้มตอนท้ายตอนนี้ฉันต้องการให้โปรแกรม MATL ทั้งหมดของฉันจบลงด้วยรอยยิ้ม :)
sundar - Reinstate Monica

@sundar ใช่ฉันมีความสุขที่มันเป็นสำนวนที่ค่อนข้างธรรมดาใน MATL :-D
Luis Mendo



1

QBasic, 58 ไบต์

DO
b=r+j
?b
r=b
FOR x=a+1TO b-1
?x
r=x
NEXT
a=b
j=j+1
LOOP

เอาท์พุทไปเรื่อย ๆ คุณอาจต้องการเพิ่มSLEEP 1วงในหรือสร้างมันLOOP WHILE b<100หรืออะไรทำนองนั้นเพื่อดูผลลัพธ์

นี่เป็นเพียงแค่การใช้ข้อมูลจำเพาะ สังเกตว่าตัวเลขที่เราย้อนกลับไปนั้นจะเป็นตัวเลขระหว่างหมายเลข jump-to number ล่าสุดกับ jump-to number ก่อนหน้านั้นเสมอ ดังนั้นเราจึงจัดเก็บขอบเขตเหล่านี้เป็นaและbใช้การFORวนซ้ำเพื่อพิมพ์ตัวเลขทั้งหมดระหว่างพวกเขา



1

R , 70 ไบต์

function(e){for(i in 1:e)F=c(setdiff((F+i):1-1,F),F[1]+i,F);rev(F)[e]}

ลองออนไลน์!

  • 1 การจัดทำดัชนี
  • -4 ไบต์ใช้Fอย่างต่อเนื่องต้องขอบคุณคำแนะนำ @JAD
  • -5 ไบต์ย้อนกลับรายการขอบคุณ @Giuseppe ข้อเสนอแนะ
  • -2 ไบต์ลบวงเล็บปีกกาที่ไร้ประโยชน์สำหรับการวนรอบขอบคุณคำแนะนำ @JAD
  • -2 ไบต์ใช้setdiffแทนx[x %in% y]

รุ่นก่อนหน้า (79 ไบต์)



@ JAD: ฉันมักจะลืมที่จะใช้ F / T ... ฉันไม่สามารถช่วยฉันมีแนวโน้มที่จะหลีกเลี่ยง "รหัสที่ไม่ปลอดภัย": D
digEmAll

1
การสร้างรายการในทางกลับกันจะบันทึก5 bytesและทำให้เกิดคำเตือนมากมาย!
Giuseppe

มันไม่ปลอดภัยแม้แต่น้อยหากF/Tไม่ได้นิยามไว้ที่นิยามฟังก์ชัน มันไม่ได้ (IIRC) แก้ไขค่าทั่วโลกสำหรับF/T
JAD


1

Python 2 , 123 ไบต์

def f(z):[s.extend([s[-1]+n]+[x for x in range(s[-1]+1,s[-1]+n)if not x in s]) for n in range(1,z)if len(s)<z];return s    

ลองออนไลน์!

รับอินพุต x, ให้ผลลัพธ์เทอม x แรกของลำดับ,

ฉันเรียนรู้ Python และความท้าทายนี้ทำให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้น

แก้ไข: โกนพื้นที่ว่างบางส่วน


ยินดีต้อนรับสู่ PPCG! คุณสามารถกำจัดของพื้นที่เพิ่มเติมบางส่วนใน:for n in range(1,z) if len(s) < z]; return s for n in range(1,z)if len(s)<z];return s
Laikoni

0

เยลลี่ขนาด 16 ไบต์

RÄṬŻk²Ḋ$ṙ€-Ø.;Fḣ

ลองออนไลน์!

หนึ่งไบต์ยาวกว่าคำตอบของเยลลี่ที่มีอยู่ แต่สิ่งนี้สามารถเล่นกอล์ฟได้เล็กน้อย RÄṬŻk²Ḋ$อาจจะสั้นกว่านี้

18 ไบต์

RÄṬŻk²Ḋ$‘ṙ€1FŻŻỤ’ḣ

อีกต่อไป แต่แตกต่างกัน



0

Perl 6 , 52 ไบต์

(0,{((^max @_)∖@_).min.?key//(1+@_[*-1]+$++)}...*)

ลองออนไลน์!

นี่คือนิพจน์ตัวสร้างโดยใช้...โอเปอเรเตอร์ มันมองหาช่องว่างในลำดับก่อนหน้า@_ผ่าน((^max @_)∖@_).min.?key:

      @_  # prior sequence values         [0,1,3]
  max @_  # largest prior sequence value       3
 ^        # the Range 0..max @_            0,1,2
(       )∖@_  # set subtract prior seq     -0,1  -> (2=>True)
            .min  # smallest unseen value  2=>True
                .?key  # set yields pairs  2

เป็นสิ่งจำเป็นสำหรับค่าเริ่มต้นที่ไม่ได้? .keyหากไม่พบช่องว่างก็จะเพิ่ม n (ที่นี่ใน$ตัวแปร) เป็นค่าสุดท้ายในรายการบวกหนึ่งสำหรับปิดด้วย 0 ข้อผิดพลาด


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