Có bao nhiêu cách một con đường có thể qua một dòng sông?


13

Hãy tưởng tượng một con sông thẳng và một con đường đi qua sông n lần qua những cây cầu. Con đường không tự lặp lại và dài vô tận. Con đường này sẽ được coi là một khúc quanh mở. Một uốn khúc mở là một đường cong mở, nó không giao nhau và kéo dài vô tận ở cả hai đầu, giao nhau một dòng n lần.

Một khúc quanh hợp lệ có thể được mô tả hoàn toàn theo thứ tự các điểm giao nhau mà nó truy cập.

Số lượng các mẫu khác nhau của giao điểm với n giao điểm một uốn khúc có thể là số thứ ba thứ n . Ví dụ: n = 4:

Một vài số đầu tiên của chuỗi này là:

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

Đây là trình tự OEIS A005316 .

Thử thách

Viết chương trình / hàm lấy số nguyên dương n làm đầu vào và in số thứ tự thứ n .

Thông số kỹ thuật

  • Quy tắc I / O tiêu chuẩn được áp dụng.
  • Sơ hở chuẩn bị cấm .
  • Giải pháp của bạn có thể là 0 chỉ mục hoặc 1 chỉ mục nhưng vui lòng chỉ định đó.
  • Thách thức này không phải là tìm ra cách tiếp cận ngắn nhất trong tất cả các ngôn ngữ, mà là tìm ra cách tiếp cận ngắn nhất trong mỗi ngôn ngữ .
  • Mã của bạn sẽ được ghi theo byte , thường là trong mã hóa UTF-8, trừ khi được quy định khác.
  • Các hàm tích hợp tính toán trình tự này được cho phép nhưng bao gồm một giải pháp không dựa vào tích hợp được khuyến khích.
  • Giải thích, ngay cả đối với các ngôn ngữ "thực tế", được khuyến khích .

Các trường hợp thử nghiệm

Đây là 0 chỉ mục. Lưu ý rằng bạn không cần phải xử lý số lớn như vậy nếu ngôn ngữ của bạn không thể mặc định.

Input      Output

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

Trong một vài định dạng tốt hơn:

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

1
Bạn xác định một khúc quanh là một đường cong kín, nhưng chuỗi OEIS bạn có dành cho các khúc quanh bằng các đường cong mở. Ý bạn là A005315 thay thế?
Không phải là một cái cây vào

7
đây là cấp độ Project-Euler ...
J42161217

1
@Notatree Ồ, có chuyện lớn của tôi trong ngày ... Đã tìm kiếm nó. Sẽ sửa chữa, cảm ơn đã cho tôi biết!
hoàn toàn là


1
Thêm một ngụy biện nữa (xin lỗi, lỗi): một đường cong mở được phép có điểm cuối, nhưng tôi nghĩ rằng một khúc quanh mở phải kéo dài đến vô tận ở cả hai đầu. (Nếu các điểm cuối được cho phép, bạn có thể có các đường cong làm những việc như vậy, số lượng trung bình sẽ lớn hơn.)
Không phải là một cây vào

Câu trả lời:


11

Python 3 , 208 188 187 184 180 177 171 byte

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

Hãy thử trực tuyến!

Bây giờ 1 chỉ mục (trước đây được lập chỉ mục 0 nhưng lập chỉ mục 1 đã lưu một byte do một sự giải quyết may mắn liên quan đến hành vi của những người uốn khúc).

Giải trình

Đây có thể giống như liên kết được đăng bởi Jenny_mathy , nhưng cuối cùng tôi đã không đọc bài báo, vì vậy đây chỉ là logic đằng sau phương pháp của tôi.

Tôi sẽ sử dụng hình minh họa sau được cung cấp trên OEIS để trực quan hóa kết quả.

nhập mô tả hình ảnh ở đây

Mỗi khúc quanh hợp lệ có thể được mô tả hoàn toàn theo thứ tự các điểm giao nhau mà nó truy cập. Điều này có thể được quan sát tầm thường trong hình ảnh; phân khúc nhập luôn ở cùng một phía (nếu không số sẽ gấp đôi). Chúng ta có thể thể hiện xu hướng của cả phân khúc nhập và thoát đối với các phạm vi tương ứng của chúng bằng cách thêm vào mỗi đơn hàng một điểm ở hai bên - nghĩa là, thứ tự (2, 1, 0)sẽ trở thành (-1, 2, 1, 0, 3).

Với ý nghĩ này, nhiệm vụ là tìm số lượng đơn đặt hàng hoặc hoán vị của phạm vi lên đến n, không giao nhau với chính chúng. Giao lộ chỉ là một vấn đề giữa các cặp điểm mà đoạn kết nối nằm cùng một phía. Đối với bất kỳ hai cặp điểm liên tiếp nào trong một hoán vị có các đoạn chia sẻ một bên, chúng có giao nhau hay không tương đương với một và chỉ một điểm trong số các điểm của một cặp nằm giữa hai phần tử của cặp kia. Như vậy, chúng ta có thể xác định xem một đơn hàng có hợp lệ hay không bằng cách không có cặp nào có một điểm được chứa bởi một cặp khác có phân khúc ở cùng một phía.

Cuối cùng, khi đã xác định tính hợp lệ của mỗi hoán vị, đầu ra của hàm đi xuống số lượng hoán vị được tìm thấy là hợp lệ.


1
Bạn đã thực hiện điều này cho một lớp tổ hợp chưa? Hay bạn chỉ cần FGITW đặc biệt khó khăn?
Bạch tuộc ma thuật Urn

2
@MagicOctopusUrn Thành thật mà nói, tôi đã đập đầu mình trong khoảng hai giờ - vì vậy tôi đoán điều sau.
notjagan

Bạn có phiền nếu tôi sử dụng một số lời giải thích của bạn trong câu hỏi? Ause Vì lời giải thích của tôi hiện tại ... không ... tuyệt vời.
hoàn toàn là

1
@totallyhuman Hãy thoải mái sử dụng bất cứ thứ gì có vẻ hữu ích, mặc dù tôi tưởng tượng nó không quá nhiều vì đặc biệt là rất nhiều phương pháp của tôi.
notjagan

5

Haskell , 199 byte

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])

Hãy thử trực tuyến!

Dựa trên một phần mở rộng của các ý tưởng trong Iwan Jensen, Hàng loạt các máy uốn khúc , 1999 cho trường hợp của các máy uốn khúc mở. Điều này chạy qua n = 1, Hoài, 16 trong khoảng 20 giây trên TIO.



@PeterTaylor Tôi không có. Nó trông giống như một phiên bản mới hơn của cùng một bài báo, được cập nhật với chiến lược xử lý các câu hỏi mở có thể dễ giải thích hơn chiến lược của tôi, nhưng điều đó đòi hỏi nhiều trường hợp đặc biệt hơn trong mã.
Anders Kaseorg

0

APL (Dyalog Classic) , 127 115 byte

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

Hãy thử trực tuyến!


Cái này hoạt động ra sao?
lirtosiast

@lirtosiast về cơ bản điều này nhưng vòng lặp mã hóa kết thúc bằng id số nguyên phù hợp thay vì 0/1
ngn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.