Các từ không có chiều dài tùy ý


9

Một chuỗi là vuông nếu nó không chứa chuỗi con hai lần liên tiếp.

Có thể có một từ vuông không dài tùy ý sử dụng bảng chữ cái 3 chữ cái.

Viết một chương trình mà chấp nhận một số nguyên dương n từ stdin và in bất kỳ từ squarefree có độ dài n, sử dụng ký tự A, BC.

Mã ngắn nhất sẽ thắng.

Câu trả lời:


4

GolfScript ( 40 27 ký tự)

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

Cách tiếp cận này là một biến thể tầm thường trên một trong những cách được mô tả trong Wikipedia: độ dài của 1 giây trong chuỗi Thue-Morse.

Nếu dòng mới thêm không được chấp nhận, nó có thể được gỡ bỏ với giá của một ký tự bằng cách thay thế nbằng ''.


6

Con trăn, 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))

Nó sử dụng phương pháp trình tự Thue ăn Morse từ wikipedia.

Phiên bản hiệu quả (100 ký tự):

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];"*ntiết kiệm 6 ký tự với chi phí hiệu quả - nhưng hey đây là golf!
gnibbler

4

Con trăn, 129 125 119

Sử dụng phương pháp của John Leech như được mô tả trên trang wiki được liên kết.

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

1
Bạn có thể lưu một số nhân vật với:'ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]
grc

while s[:n]==s:tiết kiệm thêm 1
gnibbler

3

Python2 - 112 ký tự

Điều này là không hiệu quả. Nó tạo ra một nhiều hơn thế nhiều chuỗi dài hơn cần thiết và sau đó truncates nó. Ví dụ: ký tự trung gian sdài n=762748517 (13 n ) ký tự

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

2

Toán học 159 140 134

Chỉnh sửa : Viết lại hoàn chỉnh, sử dụng đệ quy ( NestWhile). Nhanh hơn nhiều và không có nỗ lực lãng phí.

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

Sử dụng

Phải mất khoảng 1/40 giây để tạo ra một từ miễn phí hình vuông có một triệu ký tự.

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

các kết quả

Đang xác minh

f sẽ kiểm tra xem một chuỗi có vuông không.

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

Kiểm tra các đầu ra ở trên và một trường hợp trong đó chuỗi "CC" xuất hiện.

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

Đúng Đúng
Đúng
Đúng
Sai

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.