20
\$\开始组\$

定义

  • \$a(0)=0\$
  • \$a(n)=n-a(a(a)(n-1))\$对于整数\$n>0\$

任务

给定非负整数\n美元\$,输出\a(n)美元\$.

测试用例

n个(n)0     01     12个13     24     35     46     47     58     59     610    711    712    813    914    1015    1016    1117    1218    1319    1320    1410000 6823

工具书类

\$\端组\$
5

38个答案38

重置为默认值
20
\$\开始组\$

哈斯克尔,2322字节

f 0=0f n=n-f(f$f$n-1)

只需使用序列的定义。f(f$f$n-1)等于f(f(n-1)).

测试:

main=输入StrLn。显示$map f[0..20]-- => [0,1,1,2,3,4,4,5,5,6,7,7,8,9,10,10,11,12,13,13,14]

多亏了安德斯·卡瑟格一个字节!

\$\端组\$
1
  • \$\开始组\$ (f$f$f$n-1)=f(f$f$n-1)保存一个字节。 \$\端组\$ 2016年8月3日2:57
9
\$\开始组\$

果冻,8字节

’ßßßµ¡

在线试用!验证较小的测试用例.

它是如何工作的

’ßßßµ¡主链接。参数:nµ¡执行前面的链符号(n)次。'减少n,得到n-1。递归调用主链接三次。取n的绝对差值和结果。
\$\端组\$
1
  • 13
    \$\开始组\$ Jelly解析器甚至可以处理大于10字节的程序吗? \$\端组\$ 2016年8月2日14:31
9
\$\开始组\$

Mathematica,20字节

字节计数采用ISO 8859-1(或兼容)编码$CharacterEncoding($字符编码)设置为匹配的值,如Windows默认值WindowsANSI窗口.

±0=0±n:=n-±±(n-1)

这定义了一元运算符±.

\$\端组\$
  • \$\开始组\$ 你能解释一下它是做什么的或是如何工作的吗?顺便说一句,恭喜你跑了100公里。 \$\端组\$ 2016年8月2日7:21
  • 1
    \$\开始组\$ @DavidC谢谢。:)它只是一个内置运算符,是未使用函数的缩写加减。请参阅这个帖子了解详细信息。 \$\端组\$ 2016年8月2日7:28
  • 1
    \$\开始组\$ 非常有趣。使用@[ ]也是。 \$\端组\$ 2016年8月2日8:13
9
\$\开始组\$

J、,1412字节

-$:^:3@<:^:*

由于,节省了2个字节@漏水修女.

n个>在上0三次n个-1并从中减去该结果n个。当基本情况发生变化时n个= 0. 它在那里计算n个-n个等于0。

如果n=0,a(n)=n-n=0n-a(a(a(n-1))),如果n>0

在这里试试。

解释

-$:^:3@<:^:*输入:n*得到n的符号(n=0=>0,n>0=>1)^:执行多次(0次表示它只是一个标识函数)<:减少n$:递归调用自身^:3三次@n-1上-将n减去该结果并返回
\$\端组\$
1
  • \$\开始组\$ 我认为不需要括号。 \$\端组\$ 2016年8月2日8:12
6
\$\开始组\$

Julia,16字节

!n=n>0&&n-~-n个

在线试用!

它是如何工作的

我们重新定义了一元运算符!为了我们的目的。

如果n=0,比较n> 0个收益也是如此!.

否则,后面的代码&&执行。~-n个等于(n-1)以二的补语,!!!递归调用!三次n-1个,并从中减去结果值n个.

\$\端组\$
2
  • \$\开始组\$ 介意加一个解释吗?我不知道发生了什么事-!!~- \$\端组\$
    – 绒山羊
    2016年8月2日5:49
  • 1
    \$\开始组\$ 没什么特别的。!只是函数的名称。 \$\端组\$
    – 丹尼斯
    2016年8月2日5:52
5
\$\开始组\$

Python,31字节

a=λn:n和n-a(a(a)(n-1))

递归限制和时间限制使上述函数不切实际,但从理论上讲它应该有效(并且对小n有效)。

\$\端组\$
4
\$\开始组\$

JavaScript(ES6),52字节

n=>[0,…数组(n)].减少((p,_,i,a)=>a[i]=i-a[a[p]])

我本来可以很无聊地编写递归版本,但这个版本要快得多(很容易处理最后一个测试用例),而且还使用减少所以这是一个加号!

\$\端组\$
4
\$\开始组\$

视网膜,4943字节

+$*1:{`^1(1*):$1:::-1$1}`^:*(1*)-\11

在线试用!

\$\端组\$
\$\开始组\$

CJam、,1312字节

感谢丹尼斯节省了1个字节。

ri0{(jjj-}j

在这里进行测试。

\$\端组\$
2
  • \$\开始组\$ 这适用于令人惊讶的高值。我想你不需要. \$\端组\$
    – 丹尼斯
    2016年8月2日6:55
  • \$\开始组\$ @丹尼斯噢,很高兴知道,谢谢。 \$\端组\$ 2016年8月2日6:55
\$\开始组\$

R、,4241字节

a=函数(n)ifelse(n<1,0,n-a(a(n-1)))

用法:

>a(1)1>a(10)7

这种递归方法对于较大的n个尽管如此。

\$\端组\$
2
  • \$\开始组\$ 如果您将条件更改为n<1。由于它是一个序列,因此它实际上只针对非负整数定义。 \$\端组\$ 2016年8月18日17:18
  • \$\开始组\$ a=函数(n)“if”(n,n-a(a(n-1))),0)将工作几个字节。 \$\端组\$
    – 朱塞佩
    2017年10月10日20:24
\$\开始组\$

绿洲,6字节

代码:

nbaa-0

扩展版本:

a(n)=nbaa-a(0)=0

代码:

n#按nb#计算a(n-1)a#计算a(a(n-1))a#计算(a(a(n-1)))-#从n中减去a(a(n-1))

在线试用!

\$\端组\$
\$\开始组\$

APL(动态Unicode),1817字节

{⍵=0:0⋄⍵-∇⍣3⊢⍵-1}

在线试用!

令人惊讶的是,APL对此挑战没有答案。这是OP中函数的文字实现。

TIO超时\$n>90\$.

多亏了@Zachar,节省了一个字节。

\$\端组\$
2
  • 1
    \$\开始组\$ {⍵=0:0⋄⍵-Ş⍣3⊢⍵-1} \$\端组\$
    – 阿达林
    2018年11月10日15:10
  • \$\开始组\$ {×⍵:⍵-⍣3⊢⍵-1⋄0}用于16。 \$\端组\$
    – 气泡器
    2020年9月17日1:48
2
\$\开始组\$

塞索斯,5855字节

0000000:16e0d7 bdcdf8 8cdf1b e6cfbb 840d3 f bf659b e187。。。。。。。。。。。。。。?。e.8。。0000015:f8639b 39dc37 fc893f 666c05 e7 ed10 b88b3 f ae0df.c.9.7。。?弗勒~~。。。?。。?000002a:676ed8 bd9940 7fdc3b 36619e f1 gn…@。。;6a。。

最多可处理输入400相当好,但运行时间在那之后急剧增加。

在线试用!检查调试查看生成的SBIN代码。

Sesos组件

上面的二进制文件是通过组装以下SASM代码生成的。

设置numin,设置numout得到jmp公司jmp公司rwd 3,add 1,rwd 1,add一,fwd 4,sub一jnz公司rwd 3,子1jnz公司rwd 3,加1,fwd 2jmp公司rwd 1,sub 1,fwd 3,sub一,fwd2,add三jmp公司rwd 2型jmp公司第三轮驱动jnz公司fwd 6、get、rwd 4、sub 1jmp公司前向1,副1jmp公司第三轮驱动jnz公司子1jmp公司前进档3jnz公司rwd 4,子1jnz公司前进档1jmp公司rwd 1,加1,fwd 1和加1jnz公司分线1、分线3、分线1jmp公司前进档3jnz公司rwd 1,子1jnz公司rwd 2,获取没有第三轮驱动jnz公司fwd 3、get、rwd 2jmp公司fwd 2,加1jmp公司前进档3jnz公司rwd 1,加1,rwd 2jmp公司第三轮驱动jnz公司前向1,副1jnz公司前进档2jmp公司rwd 2,加1,fwd 2和sub 1jnz公司没有获取,fwd 3jnz公司rwd 1,加1,fwd 2jnz公司rwd 2,子1jmp公司rwd 1、sub 1、fwd 1和sub 1jnz公司rwd 1,放
\$\端组\$
2
\$\开始组\$

LISP,61字节

(排除H(N)(如果(=N 0)(从H 0返回)(-N(H(H(N 1))))

可能不是最佳解决方案,但它确实有效。

\$\端组\$
1
\$\开始组\$

Java 7,42字节

int c(int n){返回n>0?n-c(c(c)(n-1)):0;}

未经验证的测试用例(&T):

在这里试试。

类Main{静态int c(int n){返回n>0n-c(c(c(n-1))): 0;}公共静态void main(String[]a){for(int i=0;i<21;i++){System.out.println(i+“:”+c(i));}System.out.println(“1000:”+c(1000));}}

输出:

0: 01: 12: 13: 24: 35: 46: 47: 58: 59: 610: 711: 712: 813: 914: 1015: 1016: 1117: 1218: 1319: 1320: 14(最后一个案例耗时太长。)
\$\端组\$
1
\$\开始组\$

Ruby,27字节

明显的实施。

a=->n{n<1?0:n-a[a[n-1]]}

这是一个更长、更快的答案,可以缓存序列中以前的条目。这两个答案仅适用于1.9之后的版本,因为当时->刺猬被介绍给鲁比。

->n{r=[0];i=0;(i+=1;r<<i-r[r[i-1]]]),而i<n;r[n]}
\$\端组\$
1
\$\开始组\$

C#,35字节

int a(int n)=>n>0?n-a(a(n-1)):0;
\$\端组\$
1
\$\开始组\$

高尔夫脚本,2625字节

~[0]{....,(===\.,@-+}@*)\;~[0]{...)\;==\.,@-+}@*)\;

在线试用!

本地10000不到半秒钟。

\$\端组\$
1
\$\开始组\$

C、,3532字节

感谢@PeterTaylor!

a(n){返回n?n-a(a(a)(n-1)):0;}

试试Ideone!

\$\端组\$
2
  • 2
    \$\开始组\$ 在C语言中,可以直接使用整数作为条件,进行三字节的存储:a(n){返回n?n-a(a(a)(n-1)):0;} \$\端组\$ 2016年8月2日7:19
  • 1
    \$\开始组\$ @贝塞格-你有一个错误:在你的代码中。你应该把后面的拿出来?. \$\端组\$ 2016年8月2日13:03
1
\$\开始组\$

Javascript ES6,22字节

a=n=>n&&n-a(a(a(n-1))

我会很无聊,做递归版本:P

\$\端组\$
1
\$\开始组\$

VBA,69字节

函数H(N):ReDim G(N):对于j=1到N:G(j)=j-G(G(G(j-1))):下一步:H=G(N

在测试集上一眨眼就工作了,速度稍高于n=1000000,遇到n=2500万的内存墙。

\$\端组\$
1
\$\开始组\$

Pyth,10字节

L-WbbyFtb3型

定义函数。在线尝试:演示

这使用了Pyth的一个相对较新的特性。您可以使用fold语法多次应用一个函数。它实际上并没有保存任何字节,我只是为了演示目的使用它。

说明:

L-WbbyFtb3型L定义函数y(b),该函数返回:b b条-Wb,如果b>0,则减去以下值yF 3 y应用三次结核杆菌-1
\$\端组\$
1
\$\开始组\$

枫树,2826字节

`如果`(n=0,0,n-a(a(a,n-1)))

用法:

>a:=n->ifelse(n=0,0,n-a(a(n-1)));>seq(a(i),i=0..10);0, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7
\$\端组\$
1
\$\开始组\$

dc,34字节

dsn[zdddd1-;a;a;a-r:aln!=L]dsLx;应用程序

从堆栈顶部获取输入。这必须是堆栈上的唯一项,因为堆栈深度用作计数器。用法示例:

$直流10000dsn[zdddd1-;a;a;a-r:aln!=L]dsLx;应用程序

这是序列定义的一个相当简单的实现:

dsn#将n存储为“n”,并将副本作为深度缓冲区保存(参见下文)[#开环定义z#第i项的推动堆栈深度idddd#堆栈深度重复四次,总共五个副本1-#获取i-1作为上一学期的索引#请注意,如果我们没有复制上面的n,或留下其他内容#在堆栈上,0-1应该是-1,这不是有效的数组索引;a;a;a#获取a(a(a)(i-1))-#计算i-a(a(a)(i-1))r#排列堆栈以存储第i个术语:TOS|i(i-a(a(i-1))):a#将第i个术语存储在数组“a”中在=L#负载n.如果n=i、 我们还没有计算完项,所以执行循环]#闭环定义。请注意,我们从五份i:#i-1用于上学期#i-a(…)用于计算当前项#。。。i:a用于存储当前术语#我进去了=L用于检查回路退出条件#i的一个副本留在堆栈上以递增计数器dsLx#复制循环宏,存储并执行复制;a#从循环中存储在堆栈上的最后一个i将等于n,因此使用此函数获得a(n)p#打印a(n)

不管怎样,一开始就很简单。。。然后发生了高尔夫球比赛。

\$\端组\$
1
\$\开始组\$

通用Lisp,44字节

(消除f(x)(如果(=x 0)0(-x(f(f(1-x))))

在线试用!

\$\端组\$
1
\$\开始组\$

C++(主要是MSVC)

正常版本:40字节

int a(int n){返回n?n-a(a(a)(n-1)):0;}

模板元编程版本:130字节

#定义C{constexpr static int a(){return模板<int N>结构H C N-H;模板结构H;}};

用法:

标准::cout<<a(20)<<'\n';//正常版本标准::cout<<H<20>::a()<<'\n';//模板版本

模板版本是最快的代码,因为没有什么比通过优化将值移动到register=>更快的了,H<20>::a()编译为:

移动esi,14

对于10000,递归版本由于堆栈溢出错误而崩溃,模板版本在编译时由于模板实例化深度而崩溃。GCC达到900(614)

\$\端组\$
4
  • \$\开始组\$ 我想你不需要中间的空隙C类{在模板元编程版本中 \$\端组\$
    – 阿达林
    2018年9月23日20:38
  • \$\开始组\$ @ZacharýMSVC拒绝在没有该空间的情况下进行编译 \$\端组\$ 2018年11月10日16:28
  • \$\开始组\$ 啊,我现在明白为什么这种情况一直在发生了 \$\端组\$
    – 阿达林
    2018年11月10日19:05
  • \$\开始组\$ @扎查(Zachar)这取决于宏的类型。如果它有参数,那么我可以删除空格,但这里没有 \$\端组\$ 2018年11月10日19:12
1
\$\开始组\$

雅普,7字节

©美国版权所有

试试看运行所有测试用例(引发10000的溢出错误)

\$\端组\$
1
\$\开始组\$

D类,36字节

T a(T)(T n){返回n?n---n.a.a.a:0;}

在线试用!

\$\端组\$
0
\$\开始组\$

Python 3,72字节

定义f(n):a=[0];i=0当n:i+=1时;a+=[i-a[a[i-i]]];n-=1返回a[i]

Ideone它!

\$\端组\$
0
\$\开始组\$

PowerShell v2+,56字节

$a={$n=$args[0];如果($n){$n-(&$a(&$a($n-1)))}其他{0}}

用于形成递归定义的lambda的PowerShell等效项。通过&呼叫操作员,例如。&美元(5)。需要一个长的执行时间--甚至50在我的机器上(一个8GB内存的最新i5)大约需要90秒。

更快的迭代解决方案,59字节

参数($n)$o=,0;1..$n|%{$o+=$_-$o[$o[[$_-1]]}$o[-1]*$n个

更长只是因为我们需要考虑输入0(这是*!!$n个最后)。否则,我们只需迭代构造数组n美元,每次添加一个新元素,并在末尾输出最后一个元素o美元[-1].超高速--计算10000在我的机器上大约需要5秒钟。

\$\端组\$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.