定义
- a(1)= 1
- a(2)= 1
- 对于n> 2的a(n)= a(na(n-1))+ a(na(n-2))其中n是整数
任务
给定正整数n
,生成a(n)
。
测试用例
n a(n)
1 1
2 1
3 2
4 3
5 3
6 4
7 5
8 5
9 6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12
参考
- 强制性OEIS A005185
给定正整数n
,生成a(n)
。
n a(n)
1 1
2 1
3 2
4 3
5 3
6 4
7 5
8 5
9 6
10 6
11 6
12 8
13 8
14 8
15 10
16 9
17 10
18 11
19 11
20 12
Answers:
a n|n<3=1|b<-a.(-)n=b(b 1)+b(b 2)
定义一个函数a
。
(b.b)1+(b.b)2
比总和短呢?
0000000: eefb5b 04f83a a75dc2 36f8d7 cf6dd0 af7b3b 3ef8d7 ..[..:.].6...m..{;>..
0000015: cfed12 f661f0 ae9d83 ee63e6 065df7 ce6183 af7383 ....a.....c..]..a..s.
000002a: 76ef3c 3f6383 7eff9c b9e37f v.<?c.~.....
set numin
set numout
add 1
fwd 1
add 1
fwd 6
get
sub 1
jmp
jmp
sub 1
fwd 1
add 1
rwd 1
jnz
fwd 1
sub 1
rwd 2
add 2
jmp
rwd 4
jmp
sub 1
fwd 3
add 1
rwd 3
jnz
fwd 4
jmp
sub 1
rwd 3
add 1
rwd 1
add 1
fwd 4
jnz
rwd 3
jmp
sub 1
fwd 3
add 1
rwd 3
jnz
fwd 4
add 2
jmp
rwd 5
jmp
rwd 1
jmp
sub 1
fwd 2
add 1
rwd 2
jnz
fwd 1
jmp
sub 1
rwd 1
add 1
fwd 1
jnz
rwd 1
sub 1
jnz
fwd 2
jmp
sub 1
rwd 1
add 1
rwd 1
add 1
fwd 2
jnz
fwd 1
jmp
rwd 2
jmp
sub 1
fwd 1
add 1
rwd 1
jnz
fwd 2
jmp
sub 1
rwd 2
add 1
fwd 2
jnz
fwd 1
jnz
fwd 3
sub 1
jnz
rwd 2
jmp
sub 1
rwd 3
add 1
fwd 3
jnz
fwd 1
sub 1
jnz
fwd 2
jnz
rwd 7
put
或使用Brainfuck表示法:
+>+>>>>>>,-[[->+<]>-<<++[<<<<[->>>+<<<]>>>>[-<<<+<+>>>>]<<<[->>>+<<<]>>>>++[<<<<<[<
[->>+<<]>[-<+>]<-]>>[-<+<+>>]>[<<[->+<]>>[-<<+>>]>]>>>-]<<[-<<<+>>>]>-]>>]<<<<<<<.
@Dennis节省了1个字节
每个答案都是相同的,我必须做些不同的事情!
a(n){return n<3?:a(n-a(n-2))+a(n---a(n));}
说明:基本上是这样,a(n-a(n-2))+a(n-a(n-1))
但是有一些不确定的行为(可以在我的手机(gcc)和ideone上使用)。
1
介于?
和之间:
。
$b+=$b[$_-$b[$_-2]]+$b[$_---$b[$_]]
字节数假定使用ISO 8859-1编码,并且Mathematica $CharacterEncoding
设置为WindowsANSI
(Windows上的默认设置;其他设置也可以使用,但有些设置UTF-8
绝对不能使用)。
±1=±2=1
±n_:=±(n-±(n-1))+±(n-±(n-2))
定义±
为一元运算符。
我试图摆脱重复,但最终得到了相同的字节数:
±1=±2=1
±n_:=Tr[±(n-±(n-#))&/@{1,2}]
2Rạ⁸߀$⁺Sµ1>?2
2Rạ⁸߀$⁺Sµ1>?2 Main link. Argument: n (integer)
2R Yield [1, 2].
$ Combine the previous three links into a monadic chain.
⁸ Yield n.
ạ Take the absolute difference of the return value and n.
߀ Recursively call the main link on each result.
⁺ Duplicate the chain.
The first copy maps [1, 2] to [a(n - 1), a(n - 2)].
The second copy maps [a(n - 1), a(n - 2)] to
[a(n - a(n - 1)), a(n - a(n - 2))].
S Take the sum.
µ Combine all links to the left into a chain.
? If...
> 2 n is greater than 2, call the chain.
1 Else, return 1.
ịḣ2S;
1Ç⁸¡2ị
这是一种迭代方法。
1Ç¡2ị Main link. Argument: n
1 Set the return value to 1.
Ç¡ Call the helper link n times, updating the return value after each call.
2ị Extract the second element of the resulting array.
ịḣ2S; Helper link. Argument: A (array)
ị At-index; retrieve the elements of A at the values of A.
ḣ2 Head 2; extract the first two results.
S Take the sum of the result.
; Prepend the sum to A.
h n|n<3=1|n>2=h(n-h(n-1))+h(n-h(n-2))
完全像挑战中所述,使用了守卫
n<3
为h 2
要1
。
int a(int n)=>n<3?1:a(n-a(n-1))+a(n-a(n-2));
我想知道是否可以通过使它成为匿名名称来缩短
pinkfloydx33!
int a(int n)=>n<3?1:a(n-a(n-a))+a(n-a(n-2));
-a
第一组括号中最里面的应该是-1
ES6中的递归解决方案。任何打高尔夫球的技巧都值得赞赏。
a=n=>n>2?a(n-a(n-1))+a(n-a(n-2)):1
感谢/ u / ismillo进一步缩短时间。
非递归,因为我希望它为n = 100000工作,所以说:
Function A(N):ReDim B(N):For i=3 To N:B(i)=B(i-B(i-1)-1)+B(i-B(i-2)-1)+1:Next:A=B(N)+1
...,然后return
在该行的末尾按(字节#87)以获取End Function
“ free” 的语句。请注意,B值偏移-1以避免初始化n = 1和2。
正常调用电子表格,例如=A(100000)
获取48157
递归版本61字节,
Function Y(N):If N<3 Then Y=1 Else Y=Y(N-Y(N-1))+Y(N-Y(N-2))
在n> 30时开始变得异常缓慢,并且不能说在n> 40时完全起作用。
直接执行。欢迎任何打高尔夫球的建议。
a=->n{n<3?1:a[n-a[n-1]]+a[n-a[n-2]]}
a[n-1]
诸如此类调用自身,因此需要命名该函数。
感谢Leaky Nun保存了17条。
int a(int n){return n<3?1:a(n-a(n-1))+a(n-a(n-2));}
param($n)$b=1,1;2..$n|%{$b+=$b[$_-$b[$_-1]]+$b[$_-$b[$_-2]]};$b[$n-1]
接受输入$n
,设置$b
为的数组@(1, 1)
,然后从进入循环2 .. $n
。每次迭代,我们都会$b
通过序列的简单+=
定义来确定序列中的最新计算。然后,我们从中输出适当的数字$b
(带有a,-1
因为PowerShell中的数组的索引为零)。如果$n
is 1
或2
因为这两个值$b
从一开始就已预先填充到较低的索引中,则此方法有效,因此即使循环在垃圾上定位,也还是会被忽略。
$a={param($k)if($k-lt3){1}else{(&$a($k-(&$a($k-1))))+(&$a($k-(&$a($k-2))))}}
第一次,我使用等效的lambda作为答案,因为通常迭代解决方案更短(如您从所有嵌套的paren中所见)。但是,在这种情况下,嵌套paren在带有嵌套数组调用的迭代解决方案中几乎是重复的,因此递归解决方案更短。不,迭代解决方案的确缩短了(请参见上文)。
通过执行操作符调用它,例如&$a 20
。只是一个直接递归调用。
L|<b3smy-bytdtBb
L def y(b):
|<b3 b < 3 or …
m tBb map for d in [b - 1, b]:
y-bytd y(b - y(d - 1))
s sum
定义一个函数y
。
在线尝试
(已添加yMS20
以打印前20个值)
我终于开始工作了!
: Q recursive dup dup 3 < if - 1+ else 2dup 2 - Q - Q -rot 1- Q - Q + then ;
说明:
: Q recursive \ Define a recursive function Q
dup dup 3 < \ I moved a dup here to golf 2 bytes
if \ If n < 3, return 1
- 1 \ Golf: n-n is zero, add one. Same as 2drop 1+
else
2dup 2 - Q - Q \ Copy n until 4 on stack, find Q(n-Q(n-2))
-rot \ Move the result below 2 copies of n
1- Q - Q + \ Find Q(n-Q(n-2)), then add to previous ^
then ;
在线尝试(上面略有偏离)
1:`(+&$:/@:-$:@-&1 2)@.(2&<)
使用递归定义。
额外的命令用于格式化多个输入/输出。
f =: 1:`(+&$:/@:-$:@-&1 2)@.(2&<)
(,:f"0) >: i. 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 1 2 3 3 4 5 5 6 6 6 8 8 8 10 9 10 11 11 12
1:`(+&$:/@:-$:@-&1 2)@.(2&<) Input: n
2&< If n < 2
1: Return 1
Else
-&1 2 Subtract [1, 2] from n to get [n-1, n-2]
$:@ Call recursively on n-1 and n-2
- Subtract each of the results from n
/@: Reduce using
$: A recursive call on each
+& Then summation
Return that value as the result
?si2sa1dd2:a:a[la1+dsadd1-;a-;alad2-;a-;a+r:ali;a0=A]dsAxli;af
该解决方案利用数组和递归。
?si # Take input from stdin and store it in register `i'
2sa # Initialise register `a' with 2, since we'll be putting in the first
# two values in the sequence
1dd2 # Stack contents, top-down: 2 1 1 1
:a # Pop index, then pop value: Store 1 in a[2]
:a # Ditto: Store 1 in a[1]
[ # Open macro definition
la 1+ dsa # Simple counter mechanism: Increment a and keep a copy on stack
# The STACK-TRACKER(tm): Top of stack will be at top of each column, under the
# dashed line. Read commands from left to right, wrapping around to next line.
# This will be iteration number n.
dd 1- ;a - ;a la d
#-----------------------------------------------------------------------
# n n-1 a[n-1] n-a[n-1] a[n-a[n-1]] n n
# n n n n n a[n-a[n-1]] n
# n n n n a[n-a[n-1]]
# n
#
2- ;a - ;a + r :a
#-----------------------------------------------------------------------
# n-2 a[n-2] n-a[n-2] a[n-a[n-2]] a[n] n
# n n a[n-a[n-1]] a[n-a[n-1]] n a[n]
# a[n-a[n-1]] a[n-a[n-1]] n n
# n n
li;a # Load index of target element, and fetch that element's current value
# Uninitialised values are zero
0=A # If a[i]==0, execute A to compute next term
]dsAx # Close macro definition, store on `A' and execute
li;a # When we've got enough terms, load target index and push value
f # Dump stack (a[i]) to stdout
dc
,请告诉我!