임의 길이의 3 차 Squarefree 단어


9

행에 하위 문자열이 두 번 포함되어 있지 않으면 문자열에 사각형 이 없습니다.

3 글자 알파벳을 사용하여 임의로 긴 제곱없는 단어를 사용할 수 있습니다.

표준 입력에서 양의 정수 N을 받아 문자를 사용하는 squarefree 길이의 단어 N을 출력하는 프로그램을 작성 A, B하고 C.

가장 짧은 코드가 승리합니다.

답변:


4

GolfScript ( 40 27 자)

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

이 접근 방식은 Wikipedia에 설명 된 것 중 하나 인 Thue-Morse 시퀀스에서 1의 실행 길이에 대한 간단한 변형입니다.

여분 뒤에 줄 바꿈이 허용되지 않는 경우는 대체하여 한 문자의 비용으로 제거 할 수 있습니다 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

파이썬 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

while s[:n]==s:1 개 더 절약
gnibbler

3

Python2-112 자

이것은 매우 비효율적입니다. 필요한 것보다 훨씬 긴 문자열을 생성 한 다음 잘립니다. 예를 들어, 중간 s에 대는 n=762,748,517 (13 N ) 자

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"]




거짓

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.