Keyfi Uzunluktaki Üçgen Kare Serbest Kelimeler


9

Arka arkaya iki kez alt dize içermiyorsa , dize kare içermez.

3 harfli bir alfabe kullanarak keyfi olarak kare olmayan bir kelimenin olması mümkündür.

Stdin'den pozitif bir tamsayı n kabul eder ve karakterleri kullanarak herhangi squarefree uzunluktaki kelime n yazdıran bir program yazın A, Bve C.

En kısa kod kazanır.

Yanıtlar:


4

GolfScript ( 40 27 karakter)

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

Yaklaşım, Wikipedia'da açıklananlardan birinde önemsiz bir varyanttır: Thue-Morse dizisindeki 1'lerin çalışma uzunlukları.

İlave arka satır kabul edilebilir değilse, yerini bir karakterin pahasına çıkarılabilir nile ''.


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))

Vikipedi'den Thue – Morse dizi yöntemini kullanır.

Verimli versiyon (100 karakter):

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];"*nverimlilik - 6 pahasına kaydeder ama hey bu golf!
gnibbler

4

Python, 129 125 119

Bağlantılı wiki sayfasında açıklandığı gibi John Leech'in yöntemini kullanarak.

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

1
Bazı karakterleri kaydedebilirsiniz:'ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]
grc

while s[:n]==s:1 tane daha kaydetti
gnibbler

3

Python2 - 112 karakter

Bu oldukça verimsiz. Gerekenden çok daha uzun bir dize oluşturur ve keser. Örneğin ara ürün siçin n=762748517 (13 olduğu , n ) karakter uzunluğunda

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

Düzenleme : Özyineleme ( NestWhile) kullanarak tam bir yeniden yazma . Çok daha hızlı ve boşa harcama.

kod

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

kullanım

Bir milyon karakterle üçlü kare serbest bir kelime oluşturmak yaklaşık 1/40 saniye sürer.

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

Sonuçlar

Doğrulanıyor

f dizenin karesız olup olmadığını test eder.

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

Yukarıdaki çıkışların ve "CC" dizesinin göründüğü bir durumun kontrol edilmesi.

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

Gerçek
Gerçek
Doğru
Yanlış

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.