Une chaîne est sans carré si elle ne contient pas de sous-chaîne deux fois de suite.
Il est possible d'avoir un mot sans carré arbitrairement long en utilisant un alphabet à 3 lettres.
Ecrire un programme qui accepte un entier positif n de stdin et imprime un mot de longueur n quadratfrei, en utilisant des caractères A
, B
et C
.
Le code le plus court gagne.
exec"x+=[1-y for y in x];"*n
enregistre 6 caractères au détriment de l'efficacité - mais bon, c'est du golf!Python,
129125119En utilisant la méthode de John Leech comme décrit sur la page wiki liée.
la source
'ABCBCACABBCAABCCABBCACABABCBCACABBCAABC'[ord(t)%5::3]
while s[:n]==s:
sauve 1 de plusPython2 - 112 caractères
C'est assez inefficace. Il génère une chaîne beaucoup plus longue que nécessaire, puis la tronque. Par exemple, l'intermédiaire
s
pourn=7
62748517 (13 n ) caractèresla source
Mathematica
159 140134Edit : Une réécriture complète, en utilisant récursion (
NestWhile
). Beaucoup plus rapide et sans effort inutile.Code
Usage
Il faut environ 1/40 sec pour générer un mot libre carré ternaire avec un million de caractères.
Vérification
f
testera si une chaîne est sans carré.Vérification des sorties ci-dessus et d'un cas dans lequel la chaîne "CC" apparaît.
la source