Cela a été inspiré par une question CS.SE maintenant supprimée .
Tâche
Étant donné deux chaînes d'entrée A et B non vides, affichez la plus petite distance entre A et un palindrome contenant B comme sous-chaîne. La distance est définie par le nombre de remplacements de personnages ( distance de Hamming ).
Restrictions
- Entrée sensible: un palindrome existe. Cela signifie | A | ≥ | B |.
- A et B ne contiennent que des caractères ASCII inférieurs, les minuscules et les majuscules sont distinctes (comme tous les autres caractères).
- Si votre langue ne peut pas gérer les caractères ASCII, vous pouvez également utiliser des entiers (ou tout autre type de données raisonnable) et vous pouvez choisir de limiter la plage à 128 éléments.
- Vous pouvez prendre des entrées de stdin, des arguments de fonction, des arguments de ligne de commande, etc.
- Vous pouvez donner le résultat sur stdout, la valeur de retour, etc.
- Vous n'avez pas besoin de donner un palindrome de travail, la plus petite distance à l'un suffit.
Exemples
A B Output
thilloaoyreot hello 4 (thelloaolleht)
benjonson stack 9 (stackcats)
neversaynever! odd 9 (neveroddoreven)
ppcggcpp gg 0 (ppcggcpp)
stars tat 1 (stats)
Notation
Il s'agit du code golf, le code le plus court en octets gagne.
code-golf
string
palindrome
Communauté
la source
la source
Pyth, 45 octets
Essayez-le en ligne. Suite de tests.
Je ne suis toujours pas vraiment satisfait de la façon dont cela s'est passé. Mais au moins, c'est assez difficile à comprendre sans explication maintenant. (Succès, je suppose?)
Explication
Q
et B asz
.m
…_BQ
Calculez ce qui suit pour A et son inverse commed
:m
…h-ldlz
Calculez ce qui suit pour tousk
de 0 àlen(A) - len(B)
inclus:+Bklz
Obtenez la pairek, k + len(B)
.cd
Diviséd
ces indices.X
…1z
Remplacez la deuxième partie (au milieu) par B.Ks
Concaténer les pièces et enregistrerK
. B est maintenant inséré à la positionk
A ou à son revers.hc2
Divisez la chaîne résultante en deux et conservez la première pièce. Cela donne la moitié de la chaîne avec le caractère central possible.hc2PK
Retirez le dernier caractère et faites la même division, en gardant le premier morceau. Cela donne la moitié de la chaîne sans le caractère central possible.+
…_
Ajoutez le revers de la pièce la plus courte à la pièce la plus longue. Nous avons maintenant un palindrome.s
Concatène les résultats pour A et son inverse.f}zT
Supprimez toutes les chaînes qui ne contiennent pas B.m
Calculez ce qui suit pour toutes les chaînes résultantesd
:nVQd
Obtenez l'inégalité par paire avec A. Cela donne True pour les paires qui doivent être modifiées.s
Additionnez la liste. Cela donne la distance de Hamming.hS
Prenez le résultat minimum.la source
JavaScript (Firefox 30+),
152146 octetsApproche par force brute: générer chaque chevauchement possible de A et B, en faire chacun un palindrome, calculer les distances de Hamming à partir de A et prendre la plus petite des distances résultantes.
Peut-être pourrait-on jouer un peu plus au golf ...
Extrait de test
Afficher l'extrait de code
la source