introduction
Une fermeture palindromique d'une chaîne d'entrée est le palindrome le plus court qui peut être construit à partir de la chaîne d'entrée où le palindrome final commence par la chaîne d'entrée.
Pour ce défi, nous envisagerons une fermeture palindromique bidirectionnelle telle que
- La fermeture palindromique gauche d'une chaîne d'entrée est le palindrome le plus court possible qui commence par la chaîne d'entrée.
- Palindromique droit La fermeture d'une chaîne d'entrée est le palindrome le plus court possible qui se termine par la chaîne d'entrée.
- La fermeture palindromique bidirectionnelle d'une chaîne d'entrée est la plus courte de la fermeture palindromique gauche ou droite de la chaîne d'entrée.
Tâche
Votre tâche est simple. Étant donné une chaîne (composée uniquement d'ASCII imprimables, de nouvelles lignes et d'espaces blancs), affichez la fermeture palindromique bidirectionnelle de cette chaîne. En cas d'égalité, les fermetures palindromiques gauche ou droite sont une sortie valide.
Vous pouvez écrire un programme ou une fonction, en saisissant les données via STDIN (ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de la fonction, et en imprimant le résultat dans STDOUT (ou l'alternative la plus proche) ou en le renvoyant sous forme de chaîne.
Vous pouvez supposer que l'entrée ne sera jamais une chaîne vide.
Quelques exemples:
<Input> -> <Output>
"abcdef" -> "abcdefedcba" (or "fedcbabcdef")
"abcba" -> "abcba"
"abcb" -> "abcba"
"cbca" -> "acbca"
Le crédit de l'idée initiale revient à VisualMelon, idée finale avec l'aide de Martin et Zgarb
Les termes fermeture palindromique, fermeture pallindromique gauche et fermeture palindromique droite ont d'abord été utilisés et définis par cet article .
la source
Réponses:
Pyth,
2219Essayez-le en ligne .
Explication
La fermeture palindromique bidirectionnelle est de la forme
AX
ouXA
, oùX
est la chaîne d'entrée etA
est une sous-chaîne deX
. Je dois en fait être une sous-chaîne contiguë deX
, un préfixe pour une forme, un suffixe pour l'autre forme. Mais je me fiche de ces échecs. Une sous-chaîne (contiguë ou non) est tout ce dont j'ai besoin en Pyth.modifier
L'ancienne version commandait les chaînes après filtrage par longueur
.olN...
. Je viens de réaliser que celay
renvoie les sous-chaînes ordonnées par longueur. Ces palindromes sont donc déjà triés.la source
Clip , 40
Exemple
Explication
la source
CJam, 30 octets
J'espérais vraiment voir une réponse CJam maintenant .. Alors voilà: P
Je déteste vraiment ce
{,}$
bloc là-dedans, mais j'obtiens une liste non ordonnée de palindromes possibles en raison de l'algorithme de génération que j'utilise.Explication du code
Essayez-le en ligne ici
la source
{,}$
bloc là aussi! Je plaisante, je n'ai aucune idée de ce que fait CJam.Python 2,
11511310910596 octetsJ'espère pouvoir continuer à jouer au golf. Bits peut-être dignes de mention:
la source
a
.Mathematica, 96 octets
Il doit y avoir une manière plus élégante que ça ...
Cela définit une fonction sans nom qui prend une chaîne et renvoie le résultat.
L'idée de base est de
Characters
.Utilisez la correspondance de motifs pour trouver le bon palindromique de chacun d'eux:
Notez que cela ne retourne pas réellement une liste plate. Par exemple pour
{a,b,c}
vousTriez les deux résultats par longueur.
""<>#&@@
.la source
abacaba
lorsque l'entrée estabac
. La bonne réponse estcabac
. Je pense que vous devriez les aplatir avant de trier par longueur.Brachylog (2), 6 octets, défi de postdates de langue
Essayez-le en ligne!
Comme d'habitude pour Brachylog, c'est une fonction, pas un programme complet.
Explication
Pour autant que je sache (ce n'est pas ma langue, mais cela semble peu probable),
a
n'a pas été ajouté à Brachylog pour ce défi, mais il est très pratique ici. Nous utilisons la méthode «inverse et affirmons qu'elle n'a pas changé» pour affirmer que la valeur que nous trouvons est un palindrome.Quant à savoir pourquoi cela produit le palindrome le plus court , l'ordre d'évaluation de Prolog (et donc de Brachylog) est fortement influencé par la première chose qu'il évalue. Dans ce cas, il s'agit d'une commande "inverse" et (comme la plupart des opérations de liste), elle définit un ordre d'évaluation qui vise à minimiser la taille de la liste résultante. Comme c'est la même chose que la taille de la sortie, le programme finit heureusement par minimiser exactement la bonne chose par hasard, ce qui signifie que je n'avais pas besoin d'ajouter d'indications explicites.
la source
a
- Adfix n'a pas été ajouté pour ce défi. Je n'avais aucun symbole disponible avec de bons mnémoniques pour le préfixe et le suffixe, donc j'ai fusionné les deux dans adfix qui peut prendre des indices pour sélectionner des préfixes ou suffixes uniquement si nécessaire.Rubis, 76 + 2 = 78
Avec des drapeaux de ligne de commande
-pl
(lel
peut ne pas être nécessaire selon la façon dont vous effectuez la saisie), exécutezÉtant donné une chaîne 'abaa', génère les chaînes 'cbca 0 acbc' et 'acbc 0 cbca', où 0 est le caractère non imprimable avec le code ascii 0. Il supprime ensuite une copie de la plus longue chaîne de trame répétée 0 qu'il trouve dans chacune, «a» dans le premier et «cbc» dans le second, pour obtenir les deux fermetures. Il produit ensuite le résultat le plus court.
La seule chose vraiment bizarre à propos du code golfé est qu'il raccourcit les chaînes en place tout en les triant, ce que nous pouvons éviter car
min_by
il n'exécute le bloc qu'une fois par élément comparé (à la fois parce qu'il s'agit d'une transformation schwartzienne et parce qu'il n'y en a que deux éléments à comparer).la source
Python 3, 107 octets
Tester:
la source
Haskell, 107 octets
Tester:
la source
J,
6662 octetsAssez simple. Les deux astuces que j'utilise:
La fermeture palindromique droite est la fermeture palindromique gauche de la chaîne inversée.
Trouver la longueur de la chaîne avec une longueur et une palindromité minimales avec l'expression min (is_palindrome / length).
Essayez-le en ligne ici.
la source