ถนนสามารถข้ามแม่น้ำได้หลายวิธี


13

ลองนึกภาพแม่น้ำตรงและถนนที่จะไปข้ามแม่น้ำnครั้งผ่านสะพาน ถนนไม่วนตัวเองและมีความยาวไม่ จำกัด ถนนเส้นนี้จะถือว่าเป็นเส้นทางคดเคี้ยว เปิดคดเคี้ยวเป็นเส้นโค้งเปิดที่ไม่ได้ตัดเองและขยายอนันต์ที่ปลายทั้งสองซึ่งตัดเป็นเส้นnครั้ง

คดเคี้ยวที่ถูกต้องอาจอธิบายได้ทั้งหมดตามคำสั่งของจุดตัดที่มันเข้าชม

จำนวนของรูปแบบที่แตกต่างของจุดตัดกับnแยกคดเคี้ยวสามารถเป็นจำนวน meandric ที่ n ตัวอย่างเช่น n = 4:

ตัวเลขสองสามตัวแรกของลำดับนี้คือ:

1, 1, 1, 2, 3, 8, 14, 42, 81, 262, 538, 1828, 3926, 13820, 30694, 110954...

นี่คือOEIS ลำดับ A005316

ท้าทาย

เขียนโปรแกรม / ฟังก์ชั่นที่ใช้เป็นจำนวนเต็มบวกnเป็น input และพิมพ์จำนวน meandric ที่ n

ข้อมูลจำเพาะ

  • ใช้กฎ I / O มาตรฐาน
  • ช่องโหว่มาตรฐานจะต้องห้าม
  • โซลูชันของคุณอาจเป็นดัชนี 0 หรือดัชนี 1 ดัชนีแต่โปรดระบุว่า
  • ความท้าทายนี้ไม่ได้เกี่ยวกับการหาวิธีการที่สั้นที่สุดในทุกภาษาค่อนข้างมันเป็นเรื่องเกี่ยวกับการหาวิธีการที่สั้นที่สุดในแต่ละภาษา
  • รหัสของคุณจะได้คะแนนเป็นไบต์โดยปกติจะเป็นรหัส UTF-8 เว้นแต่จะระบุไว้เป็นอย่างอื่น
  • ฟังก์ชันในตัวที่คำนวณลำดับนี้ได้รับอนุญาตแต่รวมถึงการแก้ปัญหาที่ไม่ต้องพึ่งพาในตัว
  • คำอธิบายแม้สำหรับภาษา "ปฏิบัติ" จะได้รับการสนับสนุน

กรณีทดสอบ

นี่คือดัชนี 0 โปรดทราบว่าคุณไม่จำเป็นต้องจัดการกับตัวเลขที่ยิ่งใหญ่นี้หากภาษาของคุณไม่สามารถทำได้ตามค่าเริ่มต้น

Input      Output

1          1
2          1
11         1828
14         30694
21         73424650
24         1649008456
31         5969806669034

ในรูปแบบที่ดีขึ้นไม่กี่:

1 2 11 14 21 24 31
1, 2, 11, 14, 21, 24, 31

1
คุณกำหนดคดเคี้ยวเป็นโค้งปิด แต่ลำดับ OEIS ที่คุณมีสำหรับคดเคี้ยวโดยโค้งเปิด คุณหมายถึงA005315แทนหรือเปล่า
ไม่ใช่ต้นไม้

7
นี่คือระดับโครงการ - ออยเลอร์ ...
J42161217

1
@Notatree โอ้มีความผิดพลาดครั้งใหญ่ของฉัน ... กำลังมองหามันอยู่ จะแก้ไขขอบคุณที่แจ้งให้เราทราบ!
มนุษย์โดยรวม


1
อีกหนึ่งการเล่นโวหาร (ขออภัย ... ): เส้นโค้งแบบเปิดได้รับอนุญาตให้มีจุดสิ้นสุด แต่ฉันคิดว่าผู้เดินเล่นเปิดต้องขยายไปถึงอนันต์ที่ปลายทั้งสอง (หากอนุญาตให้ใช้จุดปลายคุณสามารถมีเส้นโค้งที่ทำสิ่งต่าง ๆ ได้เช่นกันดังนั้นตัวเลข meandric จะยิ่งใหญ่ขึ้น)
ไม่ใช่ต้นไม้

คำตอบ:


11

Python 3 , 208 188 187 184 180 177 171 ไบต์

lambda n:sum(all(i-j&1or(x<a<y)==(x<b<y)for(i,(a,b)),(j,(x,y))in d(enumerate(map(sorted,zip((0,)+p,p+(n,)))),2))for p in d(range(n)))
from itertools import*;d=permutations

ลองออนไลน์!

ตอนนี้1 ดัชนี (ก่อนหน้านี้ 0 ดัชนี แต่ดัชนี 1 บันทึกไบต์เนื่องจากการเล่นโวหารโชคดีเกี่ยวกับพฤติกรรมของคดเคี้ยว)

คำอธิบาย

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

ฉันจะใช้ภาพประกอบต่อไปนี้ที่ให้ไว้ในOEISเพื่อให้เห็นภาพผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

คดเคี้ยวที่ถูกต้องแต่ละครั้งอาจถูกอธิบายโดยสิ้นเชิงตามลำดับของจุดแยกที่มันเข้าชม สิ่งนี้อาจสังเกตได้เล็กน้อยในภาพ ส่วนรายการจะอยู่ในด้านเดียวกันเสมอ (มิฉะนั้นตัวเลขจะเป็นสองเท่า) เราสามารถเป็นตัวแทนของแนวโน้มของทั้งเข้าและออกจากกลุ่มเพื่ออนันต์ของตนโดยเพียงแค่การเพิ่มการสั่งซื้อทุกจุดบนทั้งสองข้าง - นั่นคือการพูดการสั่งซื้อก็จะกลายเป็น(2, 1, 0)(-1, 2, 1, 0, 3)

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

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


1
คุณได้ทำสิ่งนี้เพื่อคลาส combinatorics แล้วหรือยัง? หรือว่าคุณแค่ FGITW ยากเป็นพิเศษ?
Magic Octopus Urn

2
@ MagicOctopusUrn สุจริตฉันได้ทุบหัวของฉันกับเรื่องนี้ประมาณสองชั่วโมง - ดังนั้นฉันเดาหลัง
notjagan

คุณจะรังเกียจไหมถ้าฉันใช้คำอธิบายของคุณในคำถาม? 'เพราะคำอธิบายของฉันในปัจจุบัน ... ไม่ดี ...
มนุษย์โดยรวม

1
@tallyallyhuman อย่าลังเลที่จะใช้สิ่งใดที่มีประโยชน์แม้ว่าฉันจะจินตนาการว่ามันไม่ได้มากนักเนื่องจากมีวิธีการเฉพาะของฉันมากมาย
notjagan

5

Haskell , 199 ไบต์

1!x=x
-1!(-1:x)=1:x
n!(i:x)=i:(n-i)!x
0#([],[])=1
0#_=0
n#(a,b)=sum$((n-1)#)<$>(-1:a,-1:b):[(a,-i:b)|i:a<-[a]]++[(-j:a,b)|j:b<-[b]]++[(j!a,i!b)|i:a<-[a],j:b<-[b],i+j>=0]
f n=n#([],[-1,1])+n#([1],[1])

ลองออนไลน์!

จากการขยายความคิดใน Iwan Jensen การแจกแจงของคดเคี้ยวเครื่องบินในปี 1999 กับกรณีของการเปิดคดเคี้ยว สิ่งนี้จะวิ่งผ่านn = 1, …, 16 ในเวลาประมาณ 20 วินาทีใน TIO


คุณเคยเห็นarxiv.org/abs/cond-mat/0008178หรือยัง
Peter Taylor

@ PeterTaylor ฉันไม่ได้ ดูเหมือนว่าเอกสารฉบับเดียวกันที่ใหม่กว่าอัปเดตด้วยกลยุทธ์สำหรับการจัดการกับการเปิดคดเคี้ยวซึ่งอาจอธิบายได้ง่ายกว่ากลยุทธ์ของฉัน แต่ต้องใช้กรณีพิเศษจำนวนมากในรหัส
Anders Kaseorg

0

APL (Dyalog Classic) , 127 115 ไบต์

⊃⊃⌽{↓⍉(⊃,/c),∘(+/)⌸(≢¨c←{1↓¨⍳¨⍨0,¨((×2↑¯1⌽⍵)/¯1 1⌽¨⊂⍵),(⊂∊#⍵#),(××/m,≠/m)/⊂1↓¯1↓(⊢-⍵×~)⍵∊m2↑¯1⌽⍵}¨⊃⍵)/⊃⌽⍵}⍣⎕⌽1,⊂⍳2

ลองออนไลน์!


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

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