รอบในการเข้ารหัสความยาว


26

พิจารณาลำดับเลขฐานสองบางส่วนโดยใช้1และ2ตัวอย่าง:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...

ลองเขียนความยาววิ่งของ:

1, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1 ...
_  _  ____  ____  _  _  _  ____
1, 1, 2,    2,    1, 1, 1, 2,   ...

ในกรณีนี้เราได้รับลำดับไบนารี่อีกอัน แน่นอนว่าไม่รับประกัน (เช่นถ้าเราทำซ้ำขั้นตอนที่สามจะเป็น3) แต่เราคิดเอาเอง

ตอนนี้คำถามคือเราสามารถหาลำดับที่ใช้การเข้ารหัสแบบ run-length หลาย ๆ ครั้งนี้ทำให้เรากลับมาเป็นลำดับเดิมได้หรือไม่? สำหรับรอบความยาว 1 (คือจุดคงที่ของการเปลี่ยนแปลงนี้) เราจะพบลำดับ Oldenburger-Kolakoski (รายการ OEIS A0000002 ):

1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, ...

(มีอีกวิธีแก้ปัญหาจริง: เราสามารถละเว้นผู้นำ1)

แล้ววงจรของความยาว -2 ล่ะ? นั่นก็เป็นไปได้! ลำดับที่สองต่อไปนี้คือรายการความยาวการรันของกันและกัน

1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, ...
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, ...

(นี่คือรายการ OEIS A025142และA025143นี่เป็นทางออกเดียว)

เราสามารถหาวงจรความยาว 3 ได้หรือไม่? แน่นอนว่าแต่ละลำดับคือการเข้ารหัสความยาวรันของถัดไป (และอันที่สามเป็นการเข้ารหัสความยาวรันของครั้งแรก):

1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, ...
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, ...
2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, ...

ในกรณีนี้มีวิธีแก้ไขปัญหาอื่น ปรากฎว่าเราสามารถหารอบดังกล่าวสำหรับความยาวทุกรอบ ในความเป็นจริงจำนวนรอบที่แตกต่างของความยาว n ถูกกำหนดโดยรายการ OEIS A001037 (นี่ไม่ใช่การนับตัวเลือกโดยพลการของลำดับใดในรอบที่ถือว่าเป็นครั้งแรก)

สนุกจริง:f(z) = z - 1/zในฐานะที่ไม่น่าเป็นดูเหมือนว่าความท้าทายนี้ได้รับแรงบันดาลใจจากการศึกษาแผนที่ที่ซับซ้อน ใครก็ตามที่คิดว่าแผนที่นั้นเกี่ยวข้องกับการท้าทายนี้จะได้รับคุกกี้

ความท้าทาย

เมื่อกำหนดความยาวของวงจรk > 0และความยาวของลำดับn > 0ให้เอาท์พุทnเงื่อนไขแรกของkลำดับเลขฐานสองที่แตกต่างกัน (ไม่ จำกัด ) ที่ก่อตัวเป็นวัฏจักรภายใต้การแปลงความยาววิ่งข้างต้น หากมีหลายรอบคุณสามารถส่งออกหนึ่งรอบ มันขึ้นอยู่กับคุณว่าลำดับใดในวัฏจักรที่จะเริ่มต้นด้วยและทิศทางใดที่วัฏจักรไป (เพื่อให้คุณสามารถแสดงผลออกมาตามลำดับแต่ละลำดับถัดไปหรือแต่ละลำดับนั้นอธิบายวงจรก่อนหน้า

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

การส่งออกอาจจะอยู่ในความสะดวกสบาย, โปร่งใส, รูปแบบรายการใด ๆ ที่ซ้อนกันเช่นว่ามิติด้านนอกเป็นและมิติด้านในเป็นkn

ใช้กฎมาตรฐานของ

ตัวอย่างเพิ่มเติม

นี่คือตัวอย่างบางส่วน. แต่อย่างที่ฉันบอกไปการแก้ปัญหานั้นไม่เหมือนกันดังนั้นทางออกของคุณอาจแตกต่างและยังคงถูกต้อง บางทีสิ่งเหล่านี้อาจช่วยคุณแก้ปัญหาได้ ตัวอย่างแต่ละตัวอย่างจะk nตามด้วยลำดับซึ่งแต่ละบรรทัดจะอธิบายถึงลำดับถัดไป (cyclically):

4 20
1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2
2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1
2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1

5 6
2, 2, 1, 2, 2, 1
1, 1, 2, 2, 1, 2
2, 1, 2, 2, 1, 1
1, 1, 2, 1, 1, 2
2, 1, 2, 2, 1, 2

8 20
2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2
1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1
2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2
1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1
2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1

13 50
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2
2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1
1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1
1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1
1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1
1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1

โปรดทราบว่าไม่ทุกบรรทัดในเอาต์พุตสองช่วงสุดท้ายที่แตกต่างกันแม้ว่าในที่สุดจะnมีขนาดใหญ่พอ

คำถามที่เกี่ยวข้อง


1
เราสามารถแสดงรายการเครื่องกำเนิดไฟฟ้าได้หรือไม่?
CalculatorFeline

@CatsAreFluffy Nope ขอโทษ (อาจเป็นครั้งต่อไป ... )
Martin Ender

คำตอบ:


6

CJam (41 ไบต์)

{Ma*{1:Bm<{1+ee{(1&B^)+}%e~A<0:B;}%}@:A*}

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อซึ่งรับอินพุตในสแต็กตามลำดับn kและปล่อยเอาต์พุตบนสแต็ก การสาธิตออนไลน์

แนวคิดพื้นฐานคือการเริ่มต้นด้วยคอลัมน์คำของ Lyndon [2 1 1 1 ...]และขยายไปเรื่อย ๆ บนพื้นฐานที่รู้องค์ประกอบเริ่มต้นของแต่ละแถวและการสลับที่เราสามารถเรียกใช้การถอดรหัสความยาวและรับองค์ประกอบเพิ่มเติม


3

Haskell, 72 ไบต์

~(a:b)?c=c:[c|a>1]++b?(3-c)
k!n=take k$take n<$>last(k!n)?2:map(?1)(k!n)

การสาธิต:

*Main> 4!20
[[2,1,1,2,2,1,2,2,1,2,1,1,2,1,1,2,2,1,2,1],[1,1,2,1,2,2,1,1,2,1,1,2,2,1,2,2,1,2,1,1],[1,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2],[1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2]]

1
เยี่ยมมากในที่สุด! :) คุณจะเพิ่มคำอธิบายสำหรับผู้ที่ไม่ได้ใช้ Haskell ไหม? :)
Martin Ender
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.