พื้นหลัง
การเรียงลำดับ Fibonacci เป็นการเรียงต่อกันของบรรทัด (1D) โดยใช้สองส่วน: อันสั้น, S , และอีกอันยาว, L (อัตราส่วนความยาวของพวกเขาคืออัตราส่วนทองคำ แต่ไม่เกี่ยวข้องกับความท้าทายนี้) สำหรับการปูกระเบื้องโดยใช้ prototiles ทั้งสองนี้จริง ๆ แล้วจะเป็นการเรียงแบบ Fibonacci, เงื่อนไขต่อไปนี้จะต้องปฏิบัติตาม:
- มุงหลังคาไม่ต้องมี subsequence เอสเอส
- มุงหลังคาไม่ต้องมี subsequence LLL
- หากการเรียงต่อกันใหม่ถูกสร้างขึ้นโดยดำเนินการการทดแทนต่อไปนี้ทั้งหมดผลลัพธ์จะต้องยังคงเป็นการเรียงแบบ Fibonacci:
- LL → S
- S → L
- L → (สตริงว่าง)
ลองดูตัวอย่าง:
SLLSLLSLLSLS
ดูเหมือนว่าการเรียงไฟล์ที่ถูกต้องเพราะมันไม่มี * S * s หรือสาม * L * s สองอัน แต่ให้ทำการจัดองค์ประกอบ:
LSLSLSLL
นั่นยังคงดูดี แต่ถ้าเราเขียนมันอีกครั้งเราจะได้
LLLS
ซึ่งไม่ใช่การเรียง Fibonacci ที่ถูกต้อง ดังนั้นทั้งสองลำดับก่อนหน้าจึงไม่ถูกต้อง
ในทางกลับกันถ้าเราเริ่มต้นด้วย
LSLLSLSLLSLSLL
และเขียนสิ่งนี้ซ้ำ ๆ เพื่อลำดับที่สั้นกว่า
LSLLSLLS
LSLSL
LL
S
ผลลัพธ์ทั้งหมดเป็นฟีโบนัชชีที่ถูกต้องเนื่องจากเราไม่เคยได้รับSSหรือLLLที่ใดก็ตามภายในสตริงเหล่านั้น
สำหรับการอ่านเพิ่มเติมมีวิทยานิพนธ์ที่ใช้ปูกระเบื้องนี้เป็นแบบ 1D เปรียบเทียบกับการเอียงเพนโรส
ความท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นซึ่งกำหนดให้เป็นจำนวนเต็มไม่เป็นลบNส่งคืนการเรียงลำดับ Fibonacci ที่ถูกต้องทั้งหมดในรูปแบบของสตริงที่มีอักขระNตัว (เป็นS
หรือL
)
คุณสามารถรับอินพุตผ่านฟังก์ชันอาร์กิวเมนต์, STDIN หรือ ARGV และส่งคืนหรือพิมพ์ผลลัพธ์
นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ
ตัวอย่าง
N Output
0 (an empty string)
1 S, L
2 SL, LS, LL
3 LSL, SLS, LLS, SLL
4 SLSL, SLLS, LSLS, LSLL, LLSL
5 LLSLL, LLSLS, LSLLS, LSLSL, SLLSL, SLSLL
...
8 LLSLLSLS, LLSLSLLS, LSLLSLLS, LSLLSLSL, LSLSLLSL, SLLSLLSL, SLLSLSLL, SLSLLSLL, SLSLLSLS
LSLSL
->LL
หรือไม่