ลำดับนี้มีเมตามากเกินไป


25

เราเริ่มต้นด้วยลำดับที่ว่าง 1 ดัชนี:

_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...

ใน n THขั้นตอนที่เรากรอกข้อมูลในทุก (n) ช่องว่างด้วยจำนวนเต็มมากกว่า 1 เริ่มต้นที่ว่างเปล่าเป็นครั้งแรกที่เหลืออยู่ที่ (n) เป็น n THรายการในลำดับ

หลังจากขั้นตอนแรก:

2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...

โปรดทราบว่า (1) จะต้องมี 2 เพราะจำนวนเต็มแรกที่มากกว่า 1 คือ 2

ในขั้นตอนที่สองเราเติมทุกช่องว่าง (2) จะเห็นได้ชัดว่า (2) ต้องเป็น 2

2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...

ในขั้นตอนที่สามเราเติมทุกช่องว่าง (3) ช่อง จากลำดับ, a (3) = 3

2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...

ในขั้นตอนที่สี่เราเติมทุกช่องว่าง (4) จากลำดับ, a (4) = 2

2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...

ในที่สุด:

2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...

งาน

ได้รับ n, n กลับTHองค์ประกอบของลำดับ

10,000,000 แง่แรกของลำดับที่สามารถพบได้ที่นี่

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานใช้


@LuisMendo ขอบคุณฉันเพิ่มไว้แล้ว
Leun Nun

เพียงแค่อยากรู้อยากเห็น mr.One ที่จะได้รับการยกเว้นจากลำดับอะไร
Dead Possum

@DeadPossum ดีถ้าคุณกรอกข้อมูลในทุก ๆ ที่ว่างแล้วคุณจะทำในขั้นตอนเดียว
Leun Nun

2
@DeadPossum หาก a (n) เป็น 1 ดังนั้นขั้นตอนที่ n จะเติมในช่องว่างที่เหลืออยู่ทั้งหมดเพื่อยกเลิกการสร้าง
Leun Nun

1
@QBrute ฉันให้รายชื่อ 10,000,000 รายการแรกที่เชื่อมโยงกับคำถาม พล็อตพวกเขา
Leun Nun

คำตอบ:


20

Haskell , 80 67 ไบต์

g~(a:b)|let k!l=k:take(a-1)l++(k+1)!drop(a-1)l=2!g b
m=g m
(!!)$0:m

ลองออนไลน์!

Haskell เป็นภาษาที่สมบูรณ์แบบสำหรับการกำหนดรายการที่ไม่มีที่สิ้นสุดในแง่ของตัวเอง


1
เนื่องจากลิงก์ TIO ทำงานได้อย่างที่คาดไว้ฉันคิดว่าคำถามของฉันควรจะเป็น: คุณช่วยเพิ่มคำอธิบายเกี่ยวกับวิธีการทำงานของมันได้หรือไม่?
Julian Wolf

2
@JulianWolf ดูเหมือนว่าคุณไม่คุ้นเคยกับletการ์ดลาย pattern1 | let pattern2 = expr2 = expr1หมายถึงสิ่งเดียวกันpattern1 = let pattern2 = expr2 in expr1(ด้วยเหตุผลเดียวกันกับที่[expr1 | let pattern2 = expr2]หมายถึงสิ่งเดียวกัน[let pattern2 = expr2 in expr1])
Anders Kaseorg

1
ฉันต้องจำletยามรูปแบบ (โดยเฉพาะอย่างยิ่งที่พวกเขาสามารถทำหน้าที่)! นอกจากนี้m=2:2:2`drop`g mไบต์ก็สั้นลง
Ørjan Johansen

1
(!!)$0:mสั้นกว่าสองไบต์
Ørjan Johansen

1
ที่จริงแล้วคุณสามารถวาง2:2:สิ่งอย่างสิ้นเชิงกับความขี้เกียจมากขึ้นอีกนิด: และg ~(a:b)|... m=g m
Ørjan Johansen

10

C, 123 ไบต์

f(n){int*p=calloc(n,4),i=0,j,k;for(*p=p[1]=2;i<n;++i)for(j=0,k=i/2?0:2-i;j<n;++j)p[j]||k++%p[i]||(p[j]=k/p[i]+2);n=p[n-1];}

ลองออนไลน์!

เกมส์

f(n){int*p=calloc(n,4),

จัดสรรอาเรย์ของจำนวนเต็มnจำนวนเพื่อเก็บองค์ประกอบnแรกของลำดับ hardcodes นี้sizeof(int)เป็น4ซึ่งเป็นสมมติฐานที่ปลอดภัยในกรณีส่วนใหญ่และแน่นอนหนึ่งฉันยินดีที่จะทำในบริบทของกอล์ฟรหัส :)

i=0,j,k;

นี่คือตัวนับทั้งหมด: iสำหรับดัชนีของขั้นตอนที่เราเปิดjเพื่อวนดูลำดับของช่องว่างและkเพื่อนับจำนวนช่องว่างที่มองเห็น

for(*p=p[1]=2;i<n;++i)

2ก่อนที่เราจะเริ่มต้นวงหลักของเราเราแอบในการเริ่มต้นของสององค์ประกอบแรกของลำดับไปยัง ( p[0]= *(p + 0)= *p.) สิ่งนี้จะเป็นการนับการปิดkแต่ ...

for(j=0,k=i/2?0:2-i;j<n;++j)

... เรายังทำการเริ่มต้นลับๆล่อๆkซึ่งการทดสอบเพื่อดูว่าiน้อยกว่า2และแก้ไขค่าเริ่มต้นของkถ้าเป็นเช่นนั้น วงในเริ่มที่นี่ซึ่งวนซ้ำไปเรื่อย ๆ ในแต่ละขั้นตอน

p[j]||k++%p[i]||(p[j]=k/p[i]+2);

บรรทัดนี้ใช้อธิบายได้จริง ๆ เราสามารถขยายสิ่งนี้เป็น:

if (!(p[j] || ((k++) % p[i]))) {
    p[j] = k / p[i] + 2;
}

โดยการลัดวงจรและจากนั้นตามกฎของ De Morgan และความจริงที่0เป็นเท็จใน C:

if (p[j] == 0 && ((k++) % p[i]) == 0) {
    p[j] = k / p[i] + 2;
}

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

n=p[n-1];}

ด้วยการใช้เล่ห์เหลี่ยม-return-without-a-return ที่ทำงานร่วมกับgccเราเรา "return" องค์ประกอบสุดท้ายของคำแรกnในลำดับซึ่งเกิดขึ้นเป็น n TH ระยะ


3

Pyth, 29 ไบต์

M?tH?eJ.DtHg1GghG-tHhJ+2hJ2g1

ลองออนไลน์

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

แทนที่จะใช้รายการต่าง ๆ มันจะใช้สูตรแบบเรียกซ้ำแบบธรรมดา

M                                def g(G, H):
 ?tH                                 if H - 1:
      J.DtHg1G                           J = divmod(H - 1, g(1, G))
    ?e                                   if J[-1]:
              ghG-tHhJ                       return g(G + 1, H - 1 - J[0])
                                         else:
                      +2hJ                   return 2 + J[0]
                                     else:
                          2              return 2
                           g1Q   print(g(1, eval(input())))

3

Haskell , 67 ไบต์

0%j=2
i%j|d<-div i$f j=last$d+2:[(i-d-1)%(j+1)|d*f j<i]
f=(%1).pred

ลองออนไลน์!

วิธีการแก้ปัญหาคณิตศาสตร์ recursive ที่เปิดออกโดยทั่วไปวิธีการเช่นเดียวกับแอนเดอ Kaseorg คำตอบของ

รหัสนี้ครอบคลุมในหูด - ส่วนที่น่าเกลียดที่ดูเหมือนว่าพวกเขาสามารถตีกอล์ฟ แต่ฉันไม่เห็นว่า

ฟังก์ชั่นi%jต้องการใช้ตัวป้องกันจริงๆเพื่อตรวจสอบว่าmod i(f j)>0และประเมินหนึ่งในสองนิพจน์ที่เกี่ยวข้องหรือไม่ div i(f j)แต่ทั้งสองสำนวนที่ใช้ การผูกไว้ในยามจะไม่ทำให้ทั้งสองฝ่ายใช้งานได้ เท่าที่ฉันรู้ก็ไม่สามารถสร้าง "แจกจ่าย" การ์ดผ่านยามอื่นได้ letและwhereยาวเกินไป ดังนั้นรหัสใช้lastเพื่อเลือกหนึ่งในสองนิพจน์ในขณะที่ผู้พิทักษ์ผูกตัวแปร ฮึ.

เป็นการดีที่เราจะใช้divModเพราะทั้งสองdivและmodถูกนำมาใช้ แต่(d,m)<-divMod ...เป็นนิพจน์ที่ยาวนาน เราแทนที่จะตรวจสอบ mod อย่างไม่เป็นศูนย์โดยดูว่าdivมูลค่าครั้งที่ตัวหารขาดค่าดั้งเดิมหรือไม่

0%j=2กรณีจะไม่จำเป็นถ้า Haskell ลัดวงจรdiv 0ซึ่งมันไม่ได้ การ.predแปลงอินพุต 1 ที่จัดทำดัชนีเป็นศูนย์ที่มีการจัดทำดัชนีมิฉะนั้นจะมี-1การแก้ไขทุกที่


หากคุณเปลี่ยน%ดัชนี 1 รายการคุณจะต้องมีการแก้ไขห้าไบต์ซึ่งเป็นเพียงความสัมพันธ์ อย่างไรก็ตามคุณสามารถอินไลน์fเข้า%โดยไม่ต้องเสียค่าใช้จ่ายจากนั้นfจะไม่ระบุชื่อเพื่อให้คุณประหยัดทั้งสองไบต์โดยรวม
Ørjan Johansen

@ ØrjanJohansenคุณหมายถึงอะไรที่นี่โดยอินไลน์? ฉันไม่เห็นวิธีการเปลี่ยนการอ้างอิงถึงfโดยไม่สูญเสียไบต์
xnor

divModน่าจะเป็นหนึ่งไบต์ที่ถูกกว่าเพราะช่วยให้แตกแขนง!!(0^m)ได้ จนถึงตอนนี้ฉันได้รับ:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
Ørjan Johansen

ที่คุณเห็นอินไลน์เห 1-reindexing .predซึ่งเอา
Ørjan Johansen

2

JavaScript (ES6), 98 93 91 ไบต์

ฟังก์ชันเรียกซ้ำที่หยุดทันทีที่มีผลลัพธ์

f=(n,p,a=[...Array(n)])=>a[n-1]||f(n,-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0))

รุ่นสำรอง 90 ไบต์

แนะนำโดย Shaggy สำหรับ -1 ไบต์

f(n)()หนึ่งนี้จะต้องเรียกว่ามี แม้ว่าการโพสต์ที่สอดคล้องกันในเมตาในปัจจุบันจะให้คะแนนเป็นบวก แต่ไวยากรณ์นี้มีข้อโต้แย้งอย่างชัดเจน

n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0))

การสาธิต


n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))ควรทำงานได้ถึง 92 ไบต์ f(n)()เรียกมันว่าด้วย
Shaggy

@Shaggy ขอบคุณ! เพิ่มเป็นรุ่นสำรอง
Arnauld

1

Java 8, 124 ไบต์

(i)->{int j=1,a[]=new int[i+1],k,s,n;for(;a[i]<2;){for(k=0,n=2;a[++k]>0;);for(s=a[j++]|2*k;k<=i;k+=s)a[k]=n++;}return a[i];}

การแสดงออกของแลมบ์ดา

สร้างอาร์เรย์จำนวนเต็มและเติมข้อมูลอย่างต่อเนื่องจนกว่าค่า nth จะได้รับการเติม

การประกาศตัวแปรล่วงหน้าที่ด้านบนเพื่อลดการประกาศให้มากที่สุดเท่าที่จะทำได้ intค่าใช้จ่าย 4 ไบต์ของพื้นที่เมื่อเทียบกับการเพิ่ม,nซึ่งเป็น 2

ในการjวนซ้ำของการคำนวณจำนวนของ 'ช่องว่าง' ที่ต้องข้ามมีค่าเท่ากับa[j](หรือ 2 ถ้าว่างเปล่า) มันทำงานให้เห็นว่าถ้าช่องว่างแรกที่เราต้องกรอกข้อมูลในที่ตำแหน่งk, k * a[j]ช่วยให้เรา 'ขั้นตอน' ( s)

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