给定N,输出['A','B','AB','C','D','CD','ABCD','E',...]的第n个元素?


12

考虑以下列表:

expected = [
'A',
'B',
'AB',
'C',
'D',
'CD',
'ABCD',
'E',
'F',
'EF',
'G',
'H',
'GH',
'EFGH',
'ABCDEFGH',
'I',
'J',
'IJ',
'K',
'L',
'KL',
'IJKL',
'M',
'N',
'MN',
'O',
'P',
'OP',
'MNOP',
'IJKLMNOP',
'ABCDEFGHIJKLMNOP',
...
]

这是一种看待它的方法-您正在学习如何写汉字,并且想要学习越来越大的汉字,并随身进行练习。您从A开始,然后与B一起,然后已经有一个成对的两个序列,因此可以将其组合。然后,您选择C和D,再配对,然后练习。然后您进行排练:ABCD。然后,E到H相同,然后进行排练:ABCDEFGH。列表是无限的。

目标是生成并打印出此列表的第n个元素,索引从零开始递增。假设在“ Z”之后,您再次得到“ A”。

获胜标准是源代码长度。


3
不知道我明白了,是时候BC还是CDEF?是什么决定我们串联什么,什么不决定什么?如果它在A之后再次开始Z(您是指ABCDEFGHIJKLMNOPQRSTUVWXZ我们拥有ABCDEFGHIJKLMNOPQRSTUVWXZAB某物之后的某个时刻吗?),它如何无限
乔纳森·艾伦

5
环绕字母的测试用例值得赞赏(x,y,z,a,b...)。
Stewie Griffin

7
我强烈建议您以后使用沙盒来改善您的挑战。在那里,您会收到来自其他用户的反馈,以确保您的挑战适合PPCG主站点!就个人而言,我会在沙盒中保留至少2天的帖子,以便每个人都有机会看到该帖子。
JungHwan Min

2
@JungHwanMin:不能无限打印列表。我会通过返回整数列表。
d33tah

4
“我会通过返回整数列表”是什么意思?整数列表的输出是否可接受?如果是这样的话,“假设在'Z'之后,您再次得到'A'”-这种输出格式应该是这种情况吗(在i + 25之后我们又得到了i)?(还使用相关信息更新该帖子-不要在注释中留下说明。)
Jonathan Allan '18年

Answers:


8

Python 2,53个字节

x,y=0,1
exec"x^=y-x;y+=x/y;"*input()
print range(x,y)

在线尝试!

这种转换类似的构造x = u-vy = u


多么好的简化!第一条语句可以x^=y-x为-1个字节。
xnor18年

@xnor哦,对了,我傻了
KSab

6

JavaScript(ES6),59个字节

通过使序列为1索引并使用类似于KSab的简化方式,我们可以节省2个字节:

n=>(x=g=y=>n?g(y+=y==(x^=y-x),n--):x<y?[x++,...g(y)]:[])(1)

在线尝试!


JavaScript(ES6),61个字节

返回非包装整数的列表。

n=>(g=v=>n?g(u&-u^v?v*2:!!u++,n--):v?[u-v,...g(v-1)]:[])(u=1)

在线尝试!

基于Donald Knuth的建筑。相关的OEIS条目:A182105

怎么样?

这是一个两阶段的递归函数。

我们首先构建定义为的序列并:(un,vn)(u1,v1)=(1,1)

(un+1,vn+1)={(un+1,1),if (unANDun)=vn(un,2vn),otherwise

在第二遍中,我们构建列表并最终将其返回。[unvn,unvn+1,,un]


JavaScript(ES6),97个字节

返回包装的大写字母。

n=>(s=i='',g=v=>(s+=String.fromCharCode(65+i++%26),n--)?g(u&-u^v?v*2:!!u++):s.substr(u-v,v))(u=1)

在线尝试!

或小写的91个字节



2

Wolfram语言(Mathematica)80 71字节

Range@#2+#-#2&@@Nest[If[#~BitAnd~-#==#2,{#+1,1},{#,2#2}]&@@#&,{1,1},#]&

在线尝试!

返回一个整数列表,而不是一个包装字母的字符串。0索引。

感谢@Arnauld,使用OEIS A182105。

无限打印列表,54字节

Do[j=Range@i;#∣i&&Print@j[[-#;;]]&/@(2^j/2),{i,∞}]

在线尝试!

1个索引。该TIO版本具有lim的,而不是防止崩溃。




1

木炭45 42 35字节

FN⊞υ⎇∧›Lυ¹⁼L§υ±¹L§υ±²⁺⊟υ⊟υ§αL⭆υκ⮌⊟υ

在线尝试!链接是详细版本的代码。1个索引。我找不到简单的公式来生成结果,所以我只按照问题中给出的步骤进行操作。说明:

FN

重复给定的n次数。

⊞υ

将下一个元素推到预定义的空数组u,计算为...

⎇∧›Lυ¹⁼L§υ±¹L§υ±²

...如果有多个元素u并且后两个元素的长度相同...

⁺⊟υ⊟υ

...然后将倒数第二个元素附加到最后一个元素(以相反的顺序建立结果)...

§αL⭆υκ

...否则,可以通过计算到目前为止已添加的字母数并循环索引到预定义的大写字母中来找到下一个字母。(当列表为空时,采用长度总和或总长度都会失败,并且将列表映射为字符串可以节省两个字节,而不是对空列表进行特殊设置。)

⮌⊟υ

取的最后一个元素u,即n所需列表的反向元素,然后隐式打印反向元素。

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.