Parole quadrate ternarie di lunghezza arbitraria


9

Una stringa è quadrata se non contiene sottostringhe due volte di seguito.

È possibile avere una parola quadrata arbitrariamente lunga usando un alfabeto di 3 lettere.

Scrivere un programma che accetta un numero intero positivo n da stdin e stampa qualsiasi parola di quadrati di lunghezza n, utilizzando caratteri A, Be C.

Il codice più corto vince.

Risposte:


4

GolfScript ( 40 27 caratteri)

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

L'approccio è una variante insignificante di una di quelle descritte in Wikipedia: le lunghezze di 1 secondo nella sequenza mar-mer.

Se la nuova riga finale aggiuntiva è inaccettabile, può essere rimossa al costo di un personaggio sostituendolo ncon ''.


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

Utilizza il metodo della sequenza da martedì a Morse di Wikipedia.

Versione efficiente (100 caratteri):

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];"*nrisparmia 6 caratteri a spese dell'efficienza, ma ehi, questo è golf!
Gnibbler,

4

Python, 129 125 119

Utilizzando il metodo di John Leech come descritto nella pagina wiki collegata.

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

1
Puoi salvare alcuni personaggi con:'ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]
grc

while s[:n]==s:ne salva un altro
gnibbler

3

Python2 - 112 caratteri

Questo è abbastanza inefficiente. Genera una stringa molto più lunga del necessario e quindi la tronca. Ad esempio, l'intermedio sper n=7è lungo 62748517 (13 n ) caratteri

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

Modifica : una riscrittura completa, usando recursion ( NestWhile). Molto più veloce e nessuno sforzo sprecato.

Codice

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

uso

Ci vogliono circa 1/40 di secondo per generare una parola libera quadrata ternaria con un milione di caratteri.

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

risultati

Verifica

f verificherà se una stringa è quadrata libera.

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

Verifica delle uscite precedenti e un caso in cui appare la stringa "CC".

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

True
True
True
False

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.