任意长度三进制Squarefree词


9

如果字符串连续两次不包含子字符串,则该字符串是无平方的

可以使用3个字母的字母来包含任意长的squarefree单词。

写接受来自标准输入的正整数n和打印长度的任何无平方字N,使用字符的程序ABC

最短的代码胜出。

Answers:


4

GolfScript(40 27个字符)

~1,{.{!}%+}2$*1,/<{,65+}%n+

该方法是Wikipedia中描述的方法之一的琐碎变体:Thue-Morse序列中1s的游程长度。

如果多余的尾随换行符是不可接受的,则可以用替换为,而n以一个字符的代价删除它''


6

蟒蛇,94

n=input()
x=[0]
exec"x+=[1-y for y in x];"*n
print''.join('ABC'[x[i+1]-x[i]]for i in range(n))

它使用来自维基百科的Thue-Morse序列方法。

高效版本(100个字符):

n=input()
x=[0]
while x==x[:n]:x+=[1-y for y in x]
print''.join('ABC'[x[i+1]-x[i]]for i in range(n))

1
exec"x+=[1-y for y in x];"*n节省6个字符,却以效率为代价-嘿,这是高尔夫!
gnibbler

4

Python中,129 125 119

使用链接维基页面上描述的John Leech的方法。

s='A'
n=input()
while len(s)<=n:s=''.join('ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]for t in s)
print s[:n]

1
您可以使用以下方式保存一些字符:'ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]
grc 2013年

while s[:n]==s:保存1个以上
gnibbler

3

Python2-112个字符

这是非常低效的。它生成比所需长度长得多的字符串,然后将其截断。例如,中间sn=7是62748517(13 Ñ长)字符

s='A'
n=input()
exec"s=''.join('ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]for t in s);"*n
print s[:n]

2

数学159 140 134

编辑:使用递归(NestWhile)进行完全重写。快得多,而且没有浪费精力。

g@n_:=StringTake[NestWhile[#~StringReplace~{"A"-> "ABCBACBCABCBA","B"-> "BCACBACABCACB",
     "C"->"CABACBABCABAC"}&,"ABC",StringLength[#]<n&],n]

用法

生成具有一百万个字符的三元方自由字大约需要1/40秒。

g[10]
g[53]
g[506]
AbsoluteTiming[g[10^6];]

结果

验证中

f 将测试字符串是否为无正方形。

f[s_]:=StringFreeQ[s, x__~~x__]

检查以上输出以及出现字符串“ CC”的一种情况。

f@Out[336]
f@Out[337]
f@Out[338]
f["ABCBACBCABCBABCACBACCABCACBCABACBABCABACBCACBACABCACBA"]

正确
正确
正确
错误

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.