任意の長さの3乗平方和語


9

ストリングに2回続けてサブストリングが含まれていない場合、ストリングはスクエアフリーです。

3文字のアルファベットを使用して、任意の長い正方形のない単語を作成することができます。

stdinから正の整数nを受け入れ、文字ABおよびを使用して長さnの平方自由語を出力するプログラムを記述しCます。

最短のコードが勝ちます。

回答:


4

GolfScript(40 27文字)

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

このアプローチは、Wikipediaで説明されているものの1つである些細な変形です。Thue-Morseシーケンスの1のランレングスです。

余分な末尾の改行が受け入れられない場合は、交換することによって一つの文字のコストで除去することが可能n''


6

Python、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 2013

4

Python、129 125 119

リンクされているWikiページで説明されている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

while s[:n]==s:さらに1つ節約
2013

3

Python2-112文字

これはかなり非効率的です。これは、生成ずっとずっとずっと必要以上に長い文字列をし、それを切り捨てます。例えば、中間sのためには、n=762748517(13でN)、文字

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

2

Mathematicaの159 140 134

編集:再帰(NestWhile)を使用した完全な書き換え。はるかに速く、無駄な作業はありません。

コード

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

使用法

100万文字の3進数の正方形のフリーワードを生成するには、約1/40秒かかります。

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

結果

確認中

f 文字列に正方形がないかどうかをテストします。

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

上記の出力と、文字列「CC」が表示される1つのケースを確認します。

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

True
True
True
False

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.