Слова довільної тривалості квадратних вільних слів


9

Рядок є квадратним, якщо він не містить підрядки двічі поспіль.

Можливо мати довільно довге слово без квадратного квадрата за допомогою 3-буквеного алфавіту.

Напишіть програму , яка приймає позитивне ціле число п від стандартного введення і друкує будь-якого безквадратного слова довжини п, з допомогою символів A, Bі C.

Найкоротший код виграє.

Відповіді:


4

GolfScript ( 40 27 символів)

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

Підхід є тривіальним варіантом однієї з описаних у Вікіпедії: довжина пробігу 1s у послідовності Thue-Morse.

Якщо додатковий новий рядок неприйнятний, його можна видалити ціною одного символу, замінивши 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))

Він використовує метод послідовності Ту-Морзе з Вікіпедії.

Ефективна версія (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 символів за рахунок ефективності - але ей, це гольф!
гніблер

4

Пітона, 129 125 119

Використання методу Джона Ліч, як описано на пов'язаній сторінці вікі.

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
гніблер

3

Python2 - 112 знаків

Це досить неефективно. Він генерує набагато набагато довший рядок, ніж потрібно, а потім обрізає його. Наприклад, проміжний інтервал sдля n=7символів становить 62748517 (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]

Використання

Для генерування потрійного квадратного вільного слова з мільйоном символів потрібно приблизно 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"]

Справжній
Справжній
Справжній
Неправда

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.