Kolakoski เหมือนลำดับการอ้างอิงตนเอง


19

นี่คือวิธีการกำหนดลำดับ Kolakoski (OEIS A000002 ):

ลำดับ Kolakoski เป็นลำดับที่มี 1และ2และnองค์ประกอบที่สามของลำดับคือความยาวของnกลุ่ม th ขององค์ประกอบที่เท่าเทียมกัน (เรียกใช้) ในลำดับนั้น 20 คำแรกของลำดับและความยาวตามลำดับคือ:

1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
- --- --- - - --- - --- --- - --- --- -
1  2   2  1 1  2  1  2   2  1  2   2  1

โดยพื้นฐานแล้วความยาวของกลุ่มขององค์ประกอบที่เท่ากันของลำดับ Kolakoski คือลำดับ Kolakoski นั้นเอง

จนถึงตอนนี้ดีมาก แต่ทำไมเราควร จำกัด ตนเอง1และ2? เราจะไม่ไป! กำหนดสองอินพุตอาร์เรย์ของจำนวนเต็มบวกAและจำนวนเต็มNคืนค่าแรกNเงื่อนไขของ Kolakoski Aเหมือนลำดับที่กำหนดโดยขี่จักรยานผ่าน เพื่อให้เข้าใจได้ดีขึ้นนี่คือตัวอย่างการทำงานที่มีความยาวของกลุ่มที่เพิ่มใหม่ในวงเล็บ:

A = [2, 3, 1]
N = 25

2: [[2], 2 ]
3: [ 2 ,[2], 3 , 3 ]
1: [ 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 ,[1], 1 , 1 , 2 , 2 , 2 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 ,[1], 1 , 2 , 2 , 2 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 ,[1], 2 , 2 , 2 , 3 , 1 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 ,[2], 2 , 2 , 3 , 1 , 2 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 ,[2], 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ,[2], 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 ,[3], 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 ,[1], 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 ,[2], 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
C: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]

นี่เป็นอีกตัวอย่างหนึ่งของการเป็นผู้นำ 1 :

A = [1, 2, 3]
N = 10

1: [[1]]
2: [ 1 ,[2], 2 ]
3: [ 1 , 2 ,[2], 3 , 3 ]
1: [ 1 , 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 1 , 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
C: [ 1 , 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ]

อย่างที่คุณเห็นด้านบนผลลัพธ์สุดท้ายถูกตัดเป็นN = 10องค์ประกอบ nองค์ประกอบ TH ควรจะนานเท่าไหร่nกลุ่ม TH เท่ากับองค์ประกอบคือแม้ว่าองค์ประกอบของตัวเองอยู่ในกลุ่มมันหมายถึง ในกรณีข้างต้นกลุ่มแรก1หมายถึงกลุ่มดังกล่าวกลุ่มแรกซึ่งก็คือกลุ่ม1แรกและกลุ่มแรก2หมายถึงกลุ่มดังกล่าวกลุ่มที่สองซึ่งเริ่มต้นด้วยกลุ่มดังกล่าว

กฎระเบียบ

  • คุณอาจคิดว่าAจะไม่มีองค์ประกอบที่เท่ากันติดต่อกันสองรายการขึ้นไป Aอาจมีจำนวนเต็มมากกว่าหนึ่งครั้ง แต่องค์ประกอบแรกและสุดท้ายจะไม่เท่ากันและAจะมีองค์ประกอบอย่างน้อย 2 (เช่น[1, 2, 2, 3] , [2, 4, 3, 1, 2]และ[3]จะไม่ได้รับ) นั่นเป็นเพราะหากมีองค์ประกอบที่เท่ากันติดต่อกันผลสุดท้ายจะเป็นคำนำหน้าที่ไม่ถูกต้องสำหรับลำดับดังกล่าว
  • คุณอาจจะคิด Aมีจำนวนเต็มบวกเท่านั้น (เช่นลำดับจะไม่ได้กำหนดไว้)
  • คุณอาจจะคิด Nเป็นจำนวนเต็มไม่เป็นลบ ( N >= 0)
  • คุณไม่สามารถคืนข้อกำหนดมากกว่าที่ร้องขอ
  • ใช้ช่องโหว่มาตรฐานใดก็ได้เป็นสิ่งต้องห้ามอย่างเคร่งครัด
  • คุณสามารถใช้วิธีI / O ที่สมเหตุสมผลฉันวิธีการที่เหมาะสม
  • คำตอบของคุณไม่ต้องทำงานเกินขีด จำกัด ของภาษาธรรมชาติ แต่ในทางทฤษฎีอัลกอริทึมของคุณควรจะทำงานสำหรับปัจจัยการผลิตที่มีขนาดใหญ่โดยพลการและจำนวนเต็ม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ

กรณีทดสอบ

[5, 1, 2], 0 -> []
[2, 3, 1], 25 -> [2, 2, 3, 3, 1, 1, 1, 2, 2, 2, 3, 1, 2, 3, 3, 1, 1, 2, 2, 3, 3, 3, 1, 2, 2]
[1, 2, 3], 10 -> [1, 2, 2, 3, 3, 1, 1, 1, 2, 2]
[1, 2], 20 -> [1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1]
[1, 3], 20 -> [1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 1, 1, 3]
[2, 3], 50 -> [2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3]
[7, 4], 99 -> [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4]
[1, 2, 3], 5 -> [1, 2, 2, 3, 3]
[2, 1, 3, 1], 2 -> [2, 2]
[1, 3, 5], 2 -> [1, 3]
[2, 3, 2, 4], 10 -> [2, 2, 3, 3, 2, 2, 2, 4, 4, 4]

sandbox (ผู้ใช้ 2
พัน


@MartinEnder คิดว่าฉันเชื่อมโยงแล้ว
Erik the Outgolfer

คำตอบ:


9

Husk , 8 ไบต์

Ṡωȯ↑⁰`Ṙ¢

ใช้ความยาวก่อนจากนั้นจึงแสดงรายการ ลองออนไลน์!

คำอธิบาย

Ṡωȯ↑⁰`Ṙ¢  Inputs: n=9 and x=[2,1,3]
Ṡωȯ       Apply the following function to x until a fixed point is reached:
           Argument is a list, say y=[2,2,1,3,3,3]
       ¢   Cycle x: [2,1,3,2,1,3..
     `Ṙ    Replicate to lengths in y: [2,2,1,1,3,2,2,2,1,1,1,3,3,3]
   ↑⁰      Take first n elements: [2,2,1,1,3,2,2,2,1]
          Final result is [2,2,1,1,3,2,1,1,1], print implicitly.

8

Pyth, 14 ไบต์

u<s*V]M*QlGGvz

ลองใช้งานออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย:

u                 start with G = input array
       *QlG       repeat input array
     ]M           put every element into its own list
   *V      G      repeat every list vectorized by the counts in G
  s               flatten
 <          vz    take the first (second input line) numbers
                  and assign them to G until you reach fixed point

ทางเลือกที่น่าสนใจ:u&VSvzs*V]M*Ql
Jakube

1
นี่เป็นวิธีการที่ดี
Erik the Outgolfer

5

Java 8, 151 + 19 119 115 ไบต์

a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}

ลองออนไลน์!


1
คุณสามารถลดสี่ไบต์โดยได้รับการกำจัดของสองวงเล็บเปลี่ยน&&ไป&และลบเครื่องหมายจุลภาค: a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}( 115 ไบต์ )
เควิน Cruijssen

แนะนำ(c==i?a:l)[i]แทนc==i?a[i]:l[i]
ceilingcat

5

R , 120 114 108 108 ไบต์

-6 ไบต์ขอบคุณ plannapus

function(A,N){i=inverse.rle
w=length
a=rle(A)
while(w(a$l)<N){a[[1]]=i(a)
a[[2]]=rep(A,l=w(a$l))}
i(a)[0:N]}

ลองออนไลน์!

ฟังก์ชั่นไม่ระบุชื่อ; เนื่องตีความ RLE เปลี่ยนความยาวa[[1]]กับ RLE คว่ำและค่าa[[2]]กับการจำลองแบบความยาวเท่ากับว่าAa$l


@plannapus อาใช่! ฉันลองมันแล้วก็ชน R เพราะในการมอบหมายมันจะสร้างa$lและa$vถ้ามันไม่มีอยู่จริง แต่มันจะไม่ส่งผลกระทบต่อการโทรinverse.rleทำให้เกิดลูปไม่สิ้นสุด ฉันคิดว่าฉันสามารถใช้ได้เฉพาะa$lในwhileเงื่อนไขและrepเงื่อนไข
Giuseppe

5

Haskell , 68 ไบต์

ขอบคุณมากที่ Laikoni และ flawr เพื่อขอความช่วยเหลือในการแก้จุดบกพร่องและการเล่นกอล์ฟคำตอบนี้ในเนต PPCG Haskell, ของ Monads และผู้ชาย ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! ลองออนไลน์!

(.f).take
f a@(z:_)=(z<$[1..z])++do i<-[1..];cycle a!!i<$[1..f a!!i]

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

คำอธิบาย

ครั้งแรกที่เรากำหนดzเป็นหัวหน้าของด้วยa a@(z:_)จากนั้นเราจะเริ่มต้นลำดับด้วย(z<$[1..z])จากนั้นเราจะเริ่มต้นลำดับด้วย

จากนั้น1เป็นต้นมาdo i<-[1..]เราผนวกดังต่อไปนี้ลำดับ: cycle a!!i<$[1..f a!!i]ซึ่งเป็นiสมาชิกของ -th a(ขี่จักรยานไปเรื่อย ๆ ) ต่อท้ายf a!!iครั้ง

ในที่สุดฟังก์ชั่นที่ไม่ระบุชื่อก็จะใช้nเงื่อนไขแรกของลำดับเหมือน Kolaskoski


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