耐心,年轻的“ Padovan”


44

每个人都知道斐波那契数列:
您取一个正方形,在其上附加一个相等的正方形,然后重复附加一个正方形,该正方形的边长等于所得矩形的最大边长。
结果是一个美丽的正方形螺旋,其数字序列为斐波那契数列

但是,如果我们不想使用正方形怎么办?

如果我们以类似的方式使用等边三角形而不是正方形,则会得到同样漂亮的三角形螺旋和新序列:Padovan序列,又称A000931

任务:

给定一个正整数,,输出,所述在帕序列或第一个术语Ñ条款。NaNNN

假设序列的前三个项都为。因此,该序列将开始如下: 1

1,1,1,2,2,3,...

输入:

  • 任何正整数N0

  • 不必考虑无效的输入

输出:

  • 该在帕序列个术语OR第一的帕序列表示。NNN

  • 如果打印出前术语,则输出可以是任何方便的内容(列表/数组,多行字符串等)N

  • 可以是索引或索引01

测试用例:(第
0个索引,第个词)N

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1个索引,前词)N

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

规则:


2
14(0索引)显示为输出,28而我认为它应该产生收益37
Jonathan Allan

@JonathanAllan是的,你是对的。我固定了第个词的最后两个测试用例,但没有一个。该帖子已被编辑。N

@LuisMendo我相信。我将编辑帖子。

1
@sharur斐波那契数列的定义是视觉定义。每个相加的平方在序列中具有该项的长度。您描述的序列是其背后的数字推理。两种顺序都一样好。

1
请注意,您链接的OEIS序列略有不同,因为它使用a_0=1, a_1=0, a_2=0。它最终被移动了一点,因为然后a_5=a_6=a_7=1
Carmeister

Answers:


59

果冻,10字节

9s3’Ẓæ*³FṀ

在线尝试!

1个索引。计算以下元素的最大元素: 其中二进制矩阵的计算方式很方便:

[001101010]n
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(这完全是巧合。)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
这显然是某种巫毒
Pureferret

7
这应该被出版。
YSC

6
@YSC已经在A000931中发布。我永远不会猜到素数的窍门:)
瑕疵的

1
...使“除非有人可以打出两个字节,否则” :)(现在我有9个字节
乔纳森·艾伦

1
我很习惯在这里看到荒谬的小答案,以为“果冻”之后的逗号实际上是解决此问题的代码
Tasos Papastylianou


26

果冻 10 9  8 字节

ŻṚm2Jc$S

接受n(索引为0)的单子链接,产生P(n)

在线尝试!

怎么样?

实现P(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

这里是一个“twofer”
......一个完全不同的方法,也为8个字节(这个人是1指数的,但很慢):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell,26个字节

(l!!)
l=1:1:1:2:scanl(+)2l

在线尝试!输出第n个零索引的项。

我认为下面的“显而易见的”递归解决方案将是无与伦比的,但是后来我发现了这一点。它类似于l=1:scanl(+)1l无限斐波那契列表中的经典golfy表达式,但此处相邻元素之间的区别是术语“ 4个位置”。我们可以更直接地编写l=1:1:zipWith(+)l(0:l),但是更长。

如果此挑战允许无限列表输出,则我们可以剪切第一行并有20个字节。

27个字节

f n|n<3=1|1>0=f(n-2)+f(n-3)

在线尝试!




6

八度 / MATLAB,35 33字节

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

输出前n个项。

在线尝试!

这个怎么运作

实现递归过滤器的匿名函数。

'cbaa'-98是生产的较短形式[1 0 -1 -1]

2:n<5是产生的较短形式[1 1 1 0 0 ··· 0]n -1个项)。

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])使输入[1 1 1 0 0 ··· 0]通过离散时间滤波器,该离散时间滤波器由具有分子系数1和分母系数的传递函数定义[1 0 -1 -1]


6

J,22字节

-2个字节,感谢ngn和Galen

封闭形式,26字节

0.5<.@+1.04535%~1.32472^<:

在线尝试!

迭代的,22个字节

(],1#._2 _3{ ::1])^:[#

在线尝试!


1
另一个24字节的解决方案(无聊):(1#.2 3 $:@-〜])`1:@。(3&>)在线试用!
Galen Ivanov

感谢ngn- 1:> 23个字节#在线尝试!
Galen Ivanov

@GalenIvanov tyvm,这是一个很好的技巧。
约拿

2
1:-> 1。“不利”在右边带有名词,显然
ngn

@ngn TIL ...再来一次!
约拿(

5

视网膜47 42字节

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

在线尝试!n在单独的行上输出第一项。说明:

K`0¶1¶0

更换与条件的输入-2-1以及0

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

n使用递归关系生成下一项。*_这是$&*_将匹配中的(第一个)数字转换为一元的$1*缩写,$1*_而将中间数字转换为一元的缩写。该$.(回报的一元参数的十进制总和,即第一和中间数的总和。

6,G`

丢弃前六个字符,即前三行。


5

Cubix,20个字节

索引为0并输出第N个项

;@UOI010+p?/sqq;W.\(

在线尝试!

包装到边长为2的立方体上

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

观看它运行

  • I010 -启动堆栈
  • +p? -添加堆栈顶部,将计数器从堆栈底部拉出并进行测试
  • /;UO@ -如果计数器为0,则反射到顶面上,移除TOS,掉头,输出并停止
  • \(sqq;W -如果计数器为正,则反射,递减计数器,交换TOS,两次从上到下推,移走TOS并将通道移回主循环。


4

Perl 6,24个字节

{(1,1,1,*+*+!*...*)[$_]}

在线尝试!

一个漂亮的标准生成序列,每个新元素由expression生成* + * + !*。这就添加了第三个上一个元素,第二个上一个元素以及前一个元素的逻辑取反,后者始终为False,在数值上为零。


为什么这个社区Wiki?
Jo King

@JoKing打我。如果我以某种方式做到了,那不是故意的。
肖恩

4

05AB1E,8个字节

1Ð)λ£₂₃+

在线尝试!

忍受我,我已经有一段时间没有打高尔夫球了。我想知道1Ð)在这种情况下是否有更短的替代品(我已经尝试过1D)3Å1等等,但是没有一个节省字节)。输出序列的前项。或者,如果不使用,它将输出该序列项的无限流。n£

怎么样?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

我不认为1Ð)可以是2个字节tbh。我可以想到六个不同的3字节替代方案,但没有2字节。
Kevin Cruijssen

4

APL(Dyalog Unicode)20 18 17 字节SBCS

此代码是1索引的。获取nPadovan序列中的项的字节数相同,因为您必须删除最后几个额外的成员。获得0索引的字节数也相同。

编辑: -2字节感谢ngn。-1个字节感谢ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

在线尝试!

说明

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K(ngn / k)24 20字节

-4个字节,感谢ngn!

{$[x<3;1;+/o'x-2 3]}

在线尝试!

0索引,前N个词


1
f[x-2]+f[x-3]-> +/o'x-2 3o是“重复出现”)
ngn

@ngn谢谢!我在J中尝试过(没有成功);这里很优雅。
Galen Ivanov

@ngn实际上,这是J中的样子:(1#.2 3 $:@-〜])`1:@。(3&>)
Galen Ivanov

嗯,对了,base-1解码是一种火车友好的求和方式:)
ngn

2
1:-> #在j解决方案中
ngn

4

x86 32位机器代码,17个字节

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

拆卸:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

它是0索引的。通过计算eax * 0可以很方便地实现初始化。128位结果为0,它进入edx:eax。

在每次迭代的开始,寄存器的顺序为ebx,eax,edx。我必须选择正确的顺序以利用xchg eax指令的编码-1个字节。

为了使输出达到eax,我必须在循环计数器中添加4,该输出在fastcall约定中保存了函数的返回值。

我可以使用其他一些调用约定,该约定不需要保存和恢复ebx,但是fastcall仍然很有趣:)


2
我喜欢在PP&CG上看到机器代码答案!+1


3

Lua 5.3,49 48字节

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

在线尝试!

Vanilla Lua没有将布尔值强制转换为字符串(甚至tonumber(true)返回nil),因此您必须使用伪三元运算符。与Lua的所有版本一样,此版本为1索引。该1or部分必须更改为1 orLua 5.1,它具有不同的词法数字化方式。



3

JavaScript(ES6),23个字节

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

在线尝试!


如果输出的其余部分是数字,那么我认为返回true与返回相同是不合理的1
Nit


我认为您缺少一些要求:在此处查看我的修改(Java版本)。
Shaq

@Shaq挑战明确指出了序列的前三个项都是1。因此,这不是 A000931中定义的顺序(但公式相同)。
Arnauld

@Arnauld是的,我现在可以看到它。抱歉!
Shaq


2

TI-BASIC(TI-84),34字节

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

输入为Ans
输出已输入Ans并自动打印输出。

我认为已经过去了足够的时间,并发布了多个答案,其中许多答案超出了这个答案。

例:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

说明:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth,16个字节

L?<b3!b+y-b2y-b3

这定义了功能y在这里尝试!

这是一个更有趣的解决方案,尽管它长了9个字节。字节可以被剃掉。

+l{sa.pMf.Am&>d2%d2T./QY!

这使用了David Callan在OEIS页面上给出的定义:“ a(n)= n组成奇数且> = 3的部分的组成数量”。 在这里尝试!它直接输入而不是定义函数。


y-b2y-b3可以用分叉或重构L吗?尽管声明2个元素的数组很昂贵。yL-Lb2,3较长:(
法师

@Ven我能够替换+y-b2y-b3smy-bdhB2这是字节的相同量; hB2结果在数组中[2, 3]
RK。

做得好hB2。太可惜了它是相同的字节数。
Ven

是的,尽管我想知道是否有某种方法可以消除d地图中的。
RK。

2

Java,41个字节

无法使用Lambda(运行时错误)。此Javascript答案的端口

int f(int n){return n<3?1:f(n-2)+f(n-3);}

蒂奥


我认为您缺少一些要求:在这里查看我的修改。
Shaq

请忽略Shaq的评论:您的答案是正确的,并且是可能的最短Java答案(从Java 12开始)。
OlivierGrégoire

好吧。我不确定我“错过了”什么,但是还可以。编辑:nvm我读了JS答案。
Benjamin Urquhart






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.