计算周期性自我描述列表


19

循环自我描述列表

如果满足以下条件,则正整数列表L周期性地自我描述

  1. L是非空的。
  2. L的第一个和最后一个元素不同。
  3. 如果将L分为相等元素的游程,则每个游程的元素等于下一个游程的长度,最后一个游程的元素等于第一游程的长度。

例如,考虑L=[1,1,1,2,3,3,1,1,1,3]。它是非空的,并且第一个和最后一个元素是不同的。当我们掰成运行,我们得到[[1,1,1],[2],[3,3],[1,1,1],[3]]

  • 第一次运行为1 s,下一次运行[2]的长度为1
  • 第二次运行是一个运行2 s,并且下一个游程的长度,[3,3],是2
  • 第三次运行是一个运行3 s,并且下一个游程的长度,[1,1,1],是3
  • 第四轮为1 s,下一轮[3]的长度为1
  • 最后,最后一次运行的是一个运行3秒,所述第一游程的长度,[1,1,1],是3

这意味着L是循环自描述列表。

对于非例如,列表[3,2,2,2,1,4,1,1,1]不是周期性自描述的,由于运行2 s的后面长度的运行1。列表[2,2,4,4,3,3,3,3]也没有周期性自描述的,自上次运行的是一个运行3 S,但在第一次运行具有长度2

任务

在这种挑战,你的输入是一个整数n1。您的输出应为总和等于n的循环自描述列表的数量。例如,n=8应导致4中,由于周期性自描述列表,其总和为8[1,1,1,1,4][1,1,2,1,1,2][2,1,1,2,1,1][4,1,1,1,1]。最低字节数获胜,并且适用其他标准规则。

这是输入150的正确输出值:

1 -> 0
2 -> 0
3 -> 0
4 -> 2
5 -> 0
6 -> 2
7 -> 0
8 -> 4
9 -> 0
10 -> 6
11 -> 6
12 -> 12
13 -> 0
14 -> 22
15 -> 10
16 -> 32
17 -> 16
18 -> 56
19 -> 30
20 -> 96
21 -> 56
22 -> 158
23 -> 112
24 -> 282
25 -> 198
26 -> 464
27 -> 364
28 -> 814
29 -> 644
30 -> 1382
31 -> 1192
32 -> 2368
33 -> 2080
34 -> 4078
35 -> 3844
36 -> 7036
37 -> 6694
38 -> 12136
39 -> 12070
40 -> 20940
41 -> 21362
42 -> 36278
43 -> 37892
44 -> 62634
45 -> 67154
46 -> 108678
47 -> 118866
48 -> 188280
49 -> 209784
50 -> 326878

4
意外的转折!在描述的一半,我期望仅确定列表是否为CSD的任务就没那么有趣了。荣誉
Sparr

令我有些伤心的是,定义中不包含第一个元素和最后一个元素相同且被视为同一组的列表,就像列表实际上是一个没有明显开始/结束的循环一样。
Sparr

这是代码问题,因此,我认为确定列表是否周期性地自我描述会更有趣(解决方案的执行速度更快),如果除了生成所有列表和计数之外没有其他捷径的话。
user202729

有一个多项式时间算法,但是很难编程,而且绝对不如生成和验证所有可能列表的解决方案那样复杂。
user202729

2
可以获取除2以外的n,1,...,1每个偶数作为,并且可以通过3,2,2,2,1,1将一个偶数级联来获得大于13的每个奇数。读者可以练习证明13是不可能的。
Nitrodon '18

Answers:


6

Haskell,75个字节

感谢Ørjan节省了一个字节!

g n=sum[x#n|x<-[1..n],let a#n=sum$[b#(n-a*b)|b<-[1..n],a/=b]++[0^n^2|a==x]]

在线尝试!

该问题等效于:

多少个方式n被写为i=0kaiai+1aiN,aiai+1,a0=ak



1

果冻,18字节

ṗⱮ¹Ẏ;ḷ/$€IẠ$Ƈ×Ɲ€§ċ

在线尝试!

想法:每个循环的自我描述列表都可以描述为每个块的值列表,我们可以从这些值推导出长度。请注意,两个相邻的值必须不同。当然,最多可以有n一个块,每个块的长度最大为n


1

Haskell中,118个 105 103字节

编辑:感谢@ØrjanJohansen -13个字节,感谢@ H.PWiz -2个字节

g s=sum[b#a$s|b<-[1..s],a<-[1..s],let(d#l)s|d==a,d/=b,l*d==s=1|n<-s-d*l=sum[i#d$n|i<-[1..s],d/=i,n>=0]]

在线尝试!


分解出用同样的伎俩,我发现H.PWiz。
与Orjan约翰森

您错过了(i#d)n->i#d$n
H.PWiz
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.