一条河可以穿越多少条路?


13

想象一条直河和一条穿过桥梁穿越河N次的道路。这条路不会自行循环,并且会无限长。这条路将被视为一条蜿蜒的道路。一个开放的曲折是一个开放的曲线,该不相交本身和在两端,其交叉的线延伸无限Ñ次。

有效曲折可以完全通过其访问的交点的顺序来描述。

一个曲折可以与n个相交的相交的不同模式的数量为n 个平均数。例如,n = 4:

该序列的前几个数字是:

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

这是OEIS序列A005316

挑战

编写一个程序/函数,将正整数n作为输入并打印第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
这是Project-Euler级别...
J42161217 '21

1
@Notatree哦,这是我今天最大的麻烦……正在寻找它。会解决的,感谢您告诉我!
totallyhuman


1
还有一个怪癖(对不起...):开放的曲线允许具有端点,但是我认为开放的曲折线必须在两端延伸到无穷大。(如果允许使用端点,则可以使曲线执行类似的操作,这样平均数就会更大。)
不是一棵树

Answers:


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
您是否已经为组合类课程完成了这项工作?还是您只是对FGITW异常努力?
魔术章鱼缸

2
@MagicOctopusUrn老实说,我已经为此努力了约两个小时,所以我猜是后者。
notjagan

您介意我在问题中使用您的一些解释吗?``因为目前我的解释...不是...很好。
totallyhuman

1
@totallyhuman可以随意使用任何看起来有用的东西,尽管我认为它并不过分,因为我的方法特别多。
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年的《平面河曲的枚举》)中思想的扩展到开放河曲的情况。在TIO上,这大约需要20秒,经过n = 1,…,16。



@PeterTaylor我没有。它看起来像是同一篇论文的更新版本,更新了一种处理公开弯道的策略,该策略可能比我的策略更容易解释,但在代码中需要更多特殊情况。
Anders Kaseorg '17

0

APL(Dyalog经典)127个 115字节

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

在线尝试!


这是如何运作的?
lirtosiast

@lirtosiast基本上是这样,但是编码匹配循环以匹配的整数id而不是0/1
ngn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.