Aujourd'hui, vous allez relever un autre défi palindrome!
Donc, votre tâche aujourd'hui est de prendre une chaîne et de déterminer la quantité minimale de lettres à insérer pour la transformer en palindrome.
Par exemple, prenons la chaîne fishes
.
Dans ce cas, la meilleure façon serait d'ajouter h if
, donc le résultat serait 3.
fishe s
h if
---------
fishehsif
Essayons maintenant avec codegolf
. Puisqu'il y a une répétition o
, on peut juste faire:
codeg o lf
fl ed c
-------------
flcodegedoclf
pour obtenir un résultat de 5.
Cas de test
ppcg -> 2
codegolf -> 5
palindrome -> 9
stackexchange -> 8
programmingpuzzlesandcodegolf -> 20
code-golf
string
palindrome
Oliver Ni
la source
la source
ppcg
, le score est 4 + 2 = 6)Réponses:
Pyth, 10 octets
suite de tests.
Il y a quelques caractérisations équivalentes de la valeur que nous recherchons:
L'idée commune est le "squelette" des lettres dans l'entrée qui sont appariées avec les lettres de l'entrée dans le produit final.
Ce squelette est toujours un palindrome, avec des lettres correspondant à leurs homologues inversés. Chaque lettre non squelette est inégalée et doit avoir sa contrepartie insérée.
Une alternative de même longueur utilise à la place la quatrième condition, la longueur de l'entrée moins la longueur de sa sous-séquence palindromique la plus longue
Lien vers la suite de tests.
La partie qui est différente est
Pour les deux, au lieu de supprimer la sous-séquence palindromique de l'entrée et de prendre la longueur, nous pourrions plutôt soustraire sa longueur de la longueur de l'entrée. Soit un coût de 4 octets:
-lQl
vsl.-Q
.la source
Python, 112 octets
Très inefficace.
Essayez-le en ligne! Vous devez attendre une minute pour que le dernier cas se termine.
Appelez avec
e(<string>, 0, <length of string - 1>)
, comme e ("poissons", 0, 5) `.Non golfé (en quelque sorte) avec explication:
la source
l=0
.05AB1E , 11 octets
Utilise l' encodage CP-1252 .
Essayez-le en ligne! ou comme suite de tests
Explication
la source
Brachylog , 9 octets
Essayez-le en ligne!
Ce défi avait vraiment besoin d'une réponse Brachylog v2, car la palindromisation d'insertion est tellement intuitive dans cette langue.
Explication
⊆P↔P
est vraiment ce que fait la palindromisation par insertion (voir cet exemple )la source
C,
89121 octetsPort sans vergogne de la réponse d' Oliver , ne pouvait pas penser à une solution plus courte.
g
appellef
avec le pointeur sur le premier et le dernier caractère d'une chaîne (le dernier caractère fait partie de la chaîne, pas le'\0'
). Obtient encore plus inefficace carf
est appelé deux fois pour lemin
cas.Non golfé:
Usage:
la source
Brachylog v1 , 13 octets
Essayez-le en ligne!
Vous pouvez vérifier les palindromes qu'il trouve avec ce code .
Explication
Je suis presque surpris que cela fonctionne même, vu à quel point c'est ridiculement simple.
Ceci est garanti pour trouver le plus petit palindrome car
IrI
générera des chaînes de longueur croissante lors du retour en arrière, à partir de la chaîne vide.Ce n'est pas assez efficace pour calculer le dernier cas de test sur TIO, à cause de l'utilisation de
s - Ordered subset
.la source
Lot,
234232 octetsFonctionne en essayant récursivement d'insérer des caractères non correspondants aux deux extrémités, donc très lent (je n'ai pas essayé le dernier cas de test). Les limites de récursivité signifient que cela ne fonctionne que pour une longueur de chaîne limitée de toute façon, donc
99
c'est quelque peu arbitraire. Je dois utiliser descall
paramètres en tant que variables locales car je n'ai pas pusetlocal
travailler pour moi, ce qui signifie que le%1
paramètre du:l
sous-programme est une expression qui évalue le nombre d'insertions effectuées jusqu'à présent.la source