คำไตรภาค Squarefree ที่มีความยาวตามอำเภอใจ


9

สตริงเป็นsquarefreeถ้าไม่มี substring สองครั้งในแถว

มันเป็นไปได้ที่จะมีคำ squarefree ยาวโดยพลการโดยใช้ตัวอักษร 3 ตัว

จงเขียนโปรแกรมที่รับเป็นจำนวนเต็มบวก n จาก stdin และพิมพ์คำ squarefree ใด ๆ ของความยาว n โดยใช้ตัวอักษรA, และBC

รหัสที่สั้นที่สุดชนะ

คำตอบ:


4

GolfScript ( 40 27 ตัวอักษร)

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

วิธีการเป็นตัวแปรที่ไม่สำคัญสำหรับหนึ่งในสิ่งที่อธิบายไว้ใน Wikipedia: ความยาวของ 1s ในลำดับ Thue-Morse

ถ้าขึ้นบรรทัดใหม่ต่อท้ายพิเศษเป็นที่ยอมรับจะสามารถลบออกค่าใช้จ่ายของตัวละครตัวหนึ่งโดยการแทนที่ด้วย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

4

งูหลาม, 129 125 119

ใช้วิธีของ John Leech ตามที่อธิบายไว้ในหน้า wiki ที่เชื่อมโยง

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

ทรู
ทรู
ทรู
เท็จ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.