ลำดับคิมเบอร์ลิง


18

บทนำ

แน่นอนว่าเรามีความท้าทายต่อมากมายดังนั้นนี่คืออีกความท้าทายหนึ่ง

ลำดับ Kimberling ( A007063 ) มีดังต่อไปนี้:

1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...

สิ่งนี้ผลิตโดยการสับซ้ำซ้ำ:

[1] 2  3  4  5  6  7  8

1ในระยะแรกของลำดับคือ หลังจากนั้นเราจะสลับลำดับจนกว่าจะมีการใช้ข้อกำหนดทั้งหมดทางด้านซ้าย right - left - right - left - ...สับมีแบบแผน เนื่องจากไม่มีข้อกำหนดทางด้านซ้ายของ1จึงไม่มีการสับ เราได้รับดังต่อไปนี้:

 2 [3] 4  5  6  7  8  9

เมื่อวันที่ฉันTHย้ำเราทิ้งฉันTHรายการและใส่ที่อยู่ในลำดับของเรา นี่คือการวนซ้ำครั้งที่ 2ดังนั้นเราจึงทิ้งรายการที่2 ลำดับจะกลายเป็น: 1, 3. สำหรับการทำซ้ำครั้งต่อไปเราจะสุ่มการทำซ้ำปัจจุบันด้วยรูปแบบด้านบน เราจะใช้รายการที่ไม่ได้ใช้งานเป็นครั้งแรกที่ทางขวาของฉันTHรายการ 4นี้เกิดขึ้นเป็น เราจะผนวกสิ่งนี้กับการทำซ้ำใหม่ของเรา:

 4

ตอนนี้เรากำลังจะใช้รายการที่ไม่ได้ใช้งานเป็นครั้งแรกที่ด้านซ้ายของฉันTHรายการ 2นี่คือ เราจะผนวกสิ่งนี้กับการทำซ้ำใหม่ของเรา:

 4  2

เนื่องจากมีรายการที่ทิ้งไว้ที่ด้านซ้ายของฉันTHรายการที่เราเพิ่งจะผนวกส่วนที่เหลือของลำดับเพื่อย้ำใหม่:

 4  2 [5] 6  7  8  9  10  11  ...

นี้เป็นของเรา3ซ้ำดังนั้นเราจะทิ้ง35รายการซึ่งเป็น นี่คือรายการที่สามในลำดับของเรา:

 1, 3, 5

หากต้องการรับการวนซ้ำครั้งถัดไปเพียงทำซ้ำกระบวนการ ฉันได้ทำ gif ถ้ายังไม่ชัดเจน:

ป้อนคำอธิบายรูปภาพที่นี่

gif ใช้เวลานานกว่าการเขียนโพสต์จริง

งาน

  • ให้เป็นจำนวนเต็มที่ไม่ใช่เชิงลบnส่งออกคำแรกnของลำดับ
  • คุณอาจมีฟังก์ชั่นหรือโปรแกรม
  • นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

กรณีทดสอบ:

Input: 4
Output: 1, 3, 5, 4

Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8

Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28

หมายเหตุ:เครื่องหมายจุลภาคในเอาต์พุตไม่จำเป็น ตัวอย่างเช่นคุณอาจใช้การขึ้นบรรทัดใหม่หรือส่งออกรายการ ฯลฯ


ฉันกำลังทำงานกับวิธีการใช้การหมุนสแต็ค
Cyoce

@Cyoce ขอให้โชคดี :)
Adnan

มันดูเหมือนว่าฉันต้องการมัน
Cyoce

คำตอบ:


3

Pyth, 22 ไบต์

JS*3QVQ@JN=J.i>JhN_<JN

ลองออนไลน์: สาธิต

เพียงดำเนินการเทคนิคการสับที่อธิบายไว้ใน OP

คำอธิบาย:

JS*3QVQ@JN=J.i>JhN_<JN
JS*3Q                    assign the list [1, 2, ..., 3*input-1] to J
     VQ                  for N in range(Q):
       @JN                  print J[N]
            .i              interleave 
              >JhN             J[N+1:] with
                  _<JN         reverse J[:N]
          =J                assign the resulting list to J

6

จูเลีย78 78ไบต์

n->[(i=j=x;while j<2i-3 j=i-(j%2>0?1-j:j+22;i-=1end;i+j-1)for x=1:n]

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

วิธีการที่นี่เหมือนกับที่อธิบายไว้ใน OEIS

Ungolfed:

# This computes the element of the sequence
function K(x)
    i = j = x
    while j < 2i - 3
        j = i - (j % 2 > 0 ? 1 - j : j + 22
        i -= 1
    end
    return i + j - 1
end

# This gives the first n terms of the sequence
n -> [K(i) for i = 1:n]

บันทึกไปแล้ว 7 ไบต์ขอบคุณ Mauris!


3

Mathematica 130 ไบต์

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&

เราเริ่มต้นด้วยรายการที่ประกอบด้วยช่วงจาก1ถึง3xซึ่งxเป็นจำนวนที่ต้องการของคำศัพท์ลำดับ Kimberling

ในแต่ละขั้นตอนn, TakeDropแบ่งรายการปัจจุบันเป็นรายการที่ด้านหน้าของ2n+1ข้อตกลง (ที่ทำงานจะทำ) และรายชื่อด้านหลัง (ซึ่งจะเข้าร่วมในภายหลังกับนํารายการด้านหน้า) รายการด้านหน้าถูกจับคู่กับรูปแบบต่อไปนี้โดย{t___,z,r___}ที่ z คือคำ Kimberling ที่กึ่งกลางของรายการด้านหน้า rคือRiffle'ย้อนกลับด้านtหลังจากนั้นรายการด้านหลังจะถูกต่อท้าย zจะถูกลบและผนวกเข้ากับ ( AppendTo) ลำดับการเติบโตของ Kimberling

nจะเพิ่มขึ้นโดย1และรายการปัจจุบันจะถูกประมวลผลโดยฟังก์ชั่นเดียวกันผ่านทางNest.


ตัวอย่าง

(n=0;s={};Nest[(n++;AppendTo[s,z=#[[n]]];Flatten[TakeDrop[#,1+2(n-1)]/.{t___,z,r___}:> 
Riffle[{r},Reverse@{t}]])&,Range[3*#],#];s)&[100]

{1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, 42, 35, 33, 46, 53, 6, 36, 23, 2 , 55, 62, 59, 76, 65, 54, 11, 34, 48, 70, 79, 99, 95, 44, 97, 58, 84, 25, 13, 122, 83, 26, 115, 82, 91 , 52, 138, 67, 90, 71, 119, 64, 37, 81, 39, 169, 88, 108, 141, 38, 16, 146, 41, 21, 175, 158, 165, 86, 191, 45 , 198, 216, 166, 124, 128, 204, 160, 12, 232, 126, 208, 114, 161, 156, 151, 249, 236, 263, 243, 101, 121, 72, 120, 47, 229 }


2

Python 2, 76 ไบต์

for a in range(input()):
 b=a+1
 while-~b<2*a:b=a-(b^b%-2)/2;a-=1
 print a+b

คำอธิบาย

นี่คือสูตร OEIS หลังจากการแปลงกอล์ฟหลายครั้ง! มันทำงานออกมาอย่างสวยงาม รหัสเดิมคือ

i=b=a+1
while b<2*i-3:b=i-(b+2,1-b)[b%2]/2;i-=1
print i+b-1

ก่อนอื่นฉันต้องกำจัดiแทนที่ด้วยa+1ทุกที่และขยายการแสดงออก:

b=a+1
while b<2*a-1:b=a+1-(b+2,1-b)[b%2]/2;a-=1
print a+b

จากนั้นเขียนb<2*a-1เป็น-~b<2*aเพื่อประหยัด byte ของช่องว่างและย้าย+1ในการเลือกที่หารด้วย 2 และปฏิเสธ:

while-~b<2*a:b=a-(b,-b-1)[b%2]/2;a-=1

จากนั้น-b-1เป็นเพียงเพื่อให้เราสามารถเขียน~b (b,~b)[b%2]นี้จะเทียบเท่ากับการใช้ประกอบการแฮคเกอร์หรืออีกทางเลือกหนึ่งb^0 if b%2 else b^-1b^b%-2

while-~b<2*a:b=a-(b^b%-2)/2;a-=1

2

Pyth, 29 25 ไบต์

VQ+.W<hHyN-~tN/x%Z_2Z2hNN

Jakube บันทึก 4 ไบต์ แต่ฉันไม่มีเงื่อนงำในการอ่านรหัสอีกต่อไป

นี่คือทางออกเก่า:

VQKhNW<hKyN=K-~tN/x%K_2K2)+KN

แปลคำตอบของฉันหลาม ฉันไม่ค่อยเก่งเท่าพีพีเอสดังนั้นอาจจะมีวิธีที่สั้นลง

VQ                              for N in range(input()):
  KhN                             K = N+1
     W<hKyN                       while 1+K < 2*N:
           =K-~tN/x%K_2K2)         K = (N--) - (K%-2 xor K) / 2
                          +KN     print K + N

คุณสามารถใช้.Wการกอล์ฟปิด 4 VQ+.W<hHyN-~tN/x%Z_2Z2hNNไบต์:
Jakube

มันเยี่ยมมาก - คุณช่วยอธิบายได้ว่ามันทำงานอย่างไร
ลินน์

1
.Wมีแบบฟอร์ม: .W<condition><apply><start-value>. ผมใช้ค่าเริ่มต้นเช่นเดียวกับที่คุณทำในhN เปลี่ยนค่านี้ตราบใดที่เป็นจริง ผมใช้เงื่อนไขเดียวกับคุณ สภาพเป็นแลมบ์ดาฟังก์ชั่นที่มีพารามิเตอร์ดังนั้นมูลค่าปัจจุบัน (ในรหัสของคุณ) เป็น และผมก็ยังใช้เหมือนกันคำสั่งที่คุณฉันเท่านั้นแทนที่ด้วยเพราะคำสั่งเป็นแลมบ์ดาฟังก์ชั่นที่มีพารามิเตอร์ เราสามารถละเว้น, จัดการนี้ มันจะแทนที่ค่าเก่าด้วยค่าที่คำนวณได้ ในตอนท้ายพิมพ์KhN.W<condition><hHyNHKH<apply>KZ<apply>Z=K.W+...N
Jakube

2

APL, 56 44 ไบต์

{⍵<⍺+⍺-3:(⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵⋄⍺+⍵-1}⍨¨⍳

นี่คือขบวนรถไฟ monadic ที่รับชื่อจำนวนเต็มทางด้านขวาและส่งคืนอาร์เรย์ มันประมาณวิธีการเช่นเดียวกับคำตอบของฉันจูเลีย

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

{⍵<⍺+⍺-3:                                    ⍝ If ⍵ < 2⍺ - 3
         (⍺-1)∇⍺-4÷⍨3+(1+2×⍵)ׯ1*⍵           ⍝ Recurse, incrementing a and setting
                                             ⍝ ⍵ = ⍺ - (3 + (-1)^⍵ * (1 + 2⍵))/4
                                   ⋄⍺+⍵-1}   ⍝ Otherwise return ⍺ + ⍵ - 1

ด้วยการที่อยู่ในมือเราสามารถรับเงื่อนไขแต่ละลำดับ อย่างไรก็ตามปัญหากลายเป็นว่านี่เป็นฟังก์ชันdyadicซึ่งหมายความว่ามันต้องมีการขัดแย้งทั้งสองด้าน เข้าสู่ผู้ประกอบการ! กำหนดฟังก์ชั่นfและการป้อนข้อมูลx, เป็นเช่นเดียวกับf⍨x x f xดังนั้นในกรณีของเราอ้างถึงฟังก์ชั่นดังกล่าวเป็นfเราสามารถสร้างรถไฟ monadic ต่อไปนี้:

f⍨¨⍳

เราสมัคร fกับจำนวนเต็มแต่ละค่าตั้งแต่ 1 ถึงอินพุตเพื่อให้ได้อาร์เรย์

บันทึก 12 ไบต์ขอบคุณ Dennis!

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