นับรายการที่อธิบายตนเองด้วยตนเอง


19

รายการอธิบายตนเองแบบวนรอบ

รายการLของจำนวนเต็มบวกจะวนรอบด้วยตนเองอธิบายถ้าเงื่อนไขต่อไปนี้ถือ

  1. Lเป็นเรื่องไร้สาระ
  2. องค์ประกอบแรกและสุดท้ายของ Lแตกต่างกัน
  3. ถ้าคุณแยก Lเป็นองค์ประกอบที่เท่ากันองค์ประกอบของการวิ่งแต่ละครั้งจะเท่ากับความยาวของการวิ่งครั้งถัดไปและองค์ประกอบของการวิ่งครั้งสุดท้ายจะเท่ากับความยาวของการวิ่งครั้งแรก

ตัวอย่างเช่นพิจารณาL=[1,1,1,2,3,3,1,1,1,3] ] มันไม่ว่างเปล่าและองค์ประกอบแรกและสุดท้ายนั้นแตกต่างกัน เมื่อเราทำลายมันลงไปวิ่งที่เราได้รับ[[1,1,1],[2],[3,3],[1,1,1],[3]] ]

  • ระยะแรกคือการทำงานของ1วินาทีและระยะเวลาของการดำเนินการต่อไป[2]เป็น11
  • ระยะที่สองคือการทำงานของ2วินาทีและระยะเวลาของการดำเนินการต่อไปเป็น2[3,3]2
  • ระยะที่สามคือการทำงานของวินาทีและระยะเวลาของการดำเนินการต่อไปเป็น33[1,1,1]3
  • ระยะที่สี่คือการทำงานของวินาทีและระยะเวลาของการดำเนินการต่อไปเป็น11[3]1
  • สุดท้ายระยะสุดท้ายคือการทำงานของ s และความยาวของระยะแรกเป็น33[1,1,1]3

ซึ่งหมายความว่าเป็นรายการที่อธิบายตนเองแบบวนซ้ำL

สำหรับที่ไม่ใช่ตัวอย่างเช่นรายการไม่ cyclically ตนเองอธิบายตั้งแต่การทำงานของ s ตามด้วยการทำงานของความยาว1รายการยังไม่ได้วนตนเองอธิบายตั้งแต่ระยะสุดท้ายคือการทำงานของ s แต่การทำงานครั้งแรกมีความยาว2[3,2,2,2,1,4,1,1,1]21[2,2,4,4,3,3,3,3]32

งาน

ในความท้าทายนี้ใส่ของคุณเป็นจำนวนเต็ม1 ผลลัพธ์ของคุณจะต้องเป็นจำนวนรายการที่อธิบายตนเองแบบวนซ้ำซึ่งผลรวมเท่ากับตัวอย่างเช่นควรส่งผลให้เนื่องจากรายการที่อธิบายตนเองแบบวนที่มีผลรวมเท่ากับคือ , ,n1nn=848[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][ 4 , 1 , 1 , 1 , 1 ]และ[4,1,1,1,1]จำนวนไบต์ที่น้อยที่สุดจะเป็นผู้ชนะและใช้กฎกติกามาตรฐานอื่น ๆ[4,1,1,1,1]

นี่คือค่าเอาต์พุตที่ถูกต้องสำหรับอินพุตตั้งแต่ถึง150 :

1 -> 0
2 -> 0
3 -> 0
4 -> 2
5 -> 0
6 -> 2
7 -> 0
8 -> 4
9 -> 0
10 -> 6
11 -> 6
12 -> 12
13 -> 0
14 -> 22
15 -> 10
16 -> 32
17 -> 16
18 -> 56
19 -> 30
20 -> 96
21 -> 56
22 -> 158
23 -> 112
24 -> 282
25 -> 198
26 -> 464
27 -> 364
28 -> 814
29 -> 644
30 -> 1382
31 -> 1192
32 -> 2368
33 -> 2080
34 -> 4078
35 -> 3844
36 -> 7036
37 -> 6694
38 -> 12136
39 -> 12070
40 -> 20940
41 -> 21362
42 -> 36278
43 -> 37892
44 -> 62634
45 -> 67154
46 -> 108678
47 -> 118866
48 -> 188280
49 -> 209784
50 -> 326878

4
บิดที่ไม่คาดคิด! ผ่านครึ่งทางของคำอธิบายฉันคาดหวังว่างานที่น่าสนใจน้อยกว่าเพียงแค่พิจารณาว่ารายการนั้นเป็น CSD หรือไม่ ความรุ่งโรจน์
Sparr

ฉันเสียใจเล็กน้อยที่คำจำกัดความไม่รวมรายการที่องค์ประกอบแรกและสุดท้ายเหมือนกันและนับเป็นกลุ่มเดียวกันตามที่พวกเขาต้องการหากรายการนั้นเป็นวัฏจักรจริงโดยไม่มีการเริ่มต้น / สิ้นสุดที่แตกต่างกัน
Sparr

นี่คือโค้ดกอล์ฟดังนั้นฉันคิดว่าการพิจารณาว่ารายการนั้นอธิบายด้วยตนเองเป็นเรื่องที่น่าสนใจ (แก้ปัญหาได้เร็วกว่าในการดำเนินการ) - หากไม่มีวิธีลัดอื่นนอกจากการสร้างรายการและจำนวนทั้งหมด
user202729

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

2
ทุกเลขคู่ยกเว้น 2 สามารถรับได้เช่นn,1,...,1กันและทุกเลขคี่ที่มากกว่า 13 สามารถรับได้โดยการต่อ3,2,2,2,1,1กับเลขคู่ หลักฐานที่แสดงว่าเป็นไปไม่ได้ 13 ข้อนั้นเป็นแบบฝึกหัดสำหรับผู้อ่าน
Nitrodon

คำตอบ:


6

Haskell , 75 ไบต์

ขอบคุณØrjanสำหรับการบันทึกหนึ่งไบต์!

g n=sum[x#n|x<-[1..n],let a#n=sum$[b#(n-a*b)|b<-[1..n],a/=b]++[0^n^2|a==x]]

ลองออนไลน์!

ปัญหาเทียบเท่ากับ:

หลายวิธีที่สามารถnจะเขียนเป็นΣผม=0kaผมaผม+1กับฉันN , ฉันฉัน+ 1 , 0 = kaผมยังไม่มีข้อความ,aผมaผม+1,a0=ak



1

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

ṗⱮ¹Ẏ;ḷ/$€IẠ$Ƈ×Ɲ€§ċ

ลองออนไลน์!

แนวคิด: แต่ละรายการที่อธิบายด้วยตนเองสามารถอธิบายเป็นรายการค่าสำหรับแต่ละบล็อกและเราสามารถสรุปความยาวจากค่าได้ โปรดทราบว่าสองค่าติดกันจะต้องแตกต่างกัน แน่นอนอาจจะมีที่มากที่สุดบล็อกและความยาวของแต่ละบล็อกที่มากที่สุดnn


1

Haskell, 118 105 103 ไบต์

แก้ไข: -13 ไบต์ขอบคุณ @ Ørjan Johansen, -2 ไบต์ขอบคุณ @ H.PWiz

g s=sum[b#a$s|b<-[1..s],a<-[1..s],let(d#l)s|d==a,d/=b,l*d==s=1|n<-s-d*l=sum[i#d$n|i<-[1..s],d/=i,n>=0]]

ลองออนไลน์!


ปัจจัยออกมาด้วยเล่ห์เหลี่ยมเดียวกันฉันแสดง H.PWiz
Ørjan Johansen

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