Votre tâche consiste à déterminer la quantité d'un palindrome parfait d'une chaîne. Votre palindrome typique (par exemple 12321) est un palindrome parfait; sa perfection est de 1.
Pour déterminer la perfection d'une chaîne, vous voyez combien de sections vous pouvez la diviser en où chaque section est un palindrome. S'il y a des ambiguïtés, comme avec aaaa
, comme vous pouvez le diviser en [aa, aa]
ou [aaaa]
ou [a, aaa]
ou [aaa, a]
, l'ensemble le plus court prévaudra, donnant aaaa
un score de 1, qui est la longueur de l'ensemble le plus court.
Par conséquent, vous devez écrire un programme ou une fonction qui prendra une entrée non vide et affichera sa perfection (qui est la longueur de l'ensemble le plus court, vous pouvez le diviser en où chaque élément de l'ensemble est un palindrome).
Exemples:
1111 -> 1 [1111]
abcb -> 2 [a, bcb]
abcbd -> 3 [a, bcb, d]
abcde -> 5 [a, b, c, d, e]
66a -> 2 [66, a]
abcba-> 1 [abcba]
x -> 1 [x]
ababacab -> 2 [aba, bacab]
bacababa -> 2 [bacab, aba]
26600 -> 3 [2, 66, 00] [my user id] [who has a more perfect user id?]
ababacabBACABABA -> 4 [aba, bacab, BACAB, ABA]
Notez que dans les exemples, tout ce qui est entre crochets ne doit pas faire partie de la sortie.
ababacab
et son inverse,bacababa
semblent être de bons cas de test.ababacabBACABABA
est également un bon cas de test (certaines réponses échouent).Réponses:
Brachylog , 7 octets
Essayez-le en ligne!
Explication
la source
Gelée ,
131211 octetsEssayez-le en ligne!
Spécifications
"ababacab"
(comme argument)2
la source
"\"
, car cette syntaxe n'est pas valide.ababacab
et son inverse,bacababa
.Pyth, 9 octets
Suite de tests
Cela forme toutes les partitions de l'entrée, de la plus courte à la plus longue. Ensuite, il filtre ces partitions sur l'invariance en filtrant les éléments sur l'invariance en inversion. Enfin, nous prenons le premier élément de la liste filtrée des partitions et retournons sa longueur.
Pour expliquer cette étape compliquée, nous allons commencer par invariance par inversion:
_I
. Cela vérifie si son entrée est un palindrome, car il vérifie si l'inversion change la valeur.Ensuite, le filtrage pour palindromicity:
_I#
. Cela ne conservera que les éléments palindromiques de la liste.Ensuite, nous vérifions invariance sous filtrage pour palindromicity:
_I#I
. C'est vrai si et seulement si tous les éléments de la liste sont des palindromes.Enfin, on filtre pour les listes où tous les éléments de la liste sont palindromes:
_I#I#
.la source
Haskell , 83 octets
Essayez-le en ligne!
Cela utilise la grande astuce de Zgarb pour générer des partitions de chaînes .
la source
Clojure, 111 octets
Se divise à toutes les positions possibles, et lorsque la première partie est un palindrome, procède à la recherche d'un partitionnement pour le reste de la chaîne.
Essayez-le en ligne .
Non golfé, utilise une macro de filetage
->>
.Une version obscure, veuillez ne pas écrire de code comme ceci: D
la source
f
doit s'appeler dans le pour:(f b)
. Sur une position de queue d'appel, vous pouvez utiliserrecur
.defn
parfn
et juste avoir une fonction.(fn f[s]( ... ))
? Oh c'est vrai. Vous enregistrez 2 caractères avec cela.JavaScript (ES6),
143126124 octetsEnregistré 2 octets grâce à Neil
Inspiré de la méthode NikoNyrh .
Formaté et commenté
Cas de test
Afficher l'extrait de code
Approche initiale,
173168 octetsUne fonction récursive assez longue qui calcule toutes les partitions possibles de la chaîne d'entrée.
Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
,p=0
,s[p++]?
et,F(s,i,p)
.Gelée , 10 octets
Essayez-le en ligne!
Comment?
Utilise le fait que
[0]<[0,0]<[0,0,0],...,<[0,...,0,1]<...
- donc si nous trions les partitions par une clé "n'est pas palindromique pour chaque partie" la première entrée sera tout palindromique et de longueur minimale.
Remarque: toute chaîne non vide de longueur n entraînera toujours une telle clé avec n zéros, car toutes les chaînes de longueur 1 sont palindromiques.
la source
Haskell , 69 octets
Définit une fonction
f
. Essayez-le en ligne!Explication
La fonction d'aide infixe
x ! y
calcule une liste d'entiers, qui sont les longueurs de certaines divisions dereverse x ++ y
palindromes oùreverse x
est laissé intact. Il est garanti de contenir la longueur du fractionnement minimal s'ily
n'est pas vide. Voici comment cela fonctionne.y
n'est pas vide, un caractère est sauté et poussé dedansx
. Six
devient un palindrome, nous appelons la fonction principalef
sur la queue dey
et ajoutons 1 pour tenir comptex
. Aussi, nous appelons!
le nouveaux
ety
à ne rater aucun éventuel fractionnement.y
est vide, nous retournons[0]
(un fractionnement de longueur 0) six
est également vide, et[]
(pas de fractionnement) sinon.La fonction principale
f
appelle simplement"" ! x
et prend le minimum de résultats.la source
JavaScript (Firefox 30-57), 97 octets
Port ES6:
Cela semble une solution si simple que je continue de penser que j'ai oublié quelque chose, mais elle réussit au moins tous les cas de test.
la source
Haskell,
139116109 octetsToujours vert au golf de Haskell, mais voici ma meilleure tentative que je peux trouver rapidement.
(and.map r)
pour supprimer les sous-listes qui ne contiennent pas de palindrome, à quelle longueur de point est appliquée à la liste, puis le résultat est triés afin que nous puissions saisir la tête qui est la réponse.Je pensais qu'une meilleure réponse pourrait être en mesure de tirer parti de la nature non déterministe des listes de Haskell grâce à l'utilisation de candidats. Il peut être possible de raser plusieurs octets de la fonction h en utilisant des applicatifs, même si nous devons importer Control.Applicative. Les commentaires d'amélioration sont les bienvenus.
UPDATE1
D'énormes économies basées sur le rappel de Laikoni sur la fonction minimale. La suppression du tri m'a en fait permis de supprimer l'importation Data.List car le minimum est défini dans Prelude!
UPDATE2
Merci à la suggestion de nimi d'utiliser des listes de compréhension comme remplacement utile pour filter.map. Cela m'a fait économiser quelques octets. J'ai également emprunté l'astuce de partition de chaîne soignée à la réponse de Laikonis et y ai également enregistré quelques octets.
la source
h []=[[]]
eth (x:y)=map ([x]:)
contiennent des espaces blancs inutiles.head.sort
estminimum
.filter
&map
:g x=head$sort[length y|y<-h x,and$r<$>y]
.PHP, 319 octets
Version en ligne
Étendu
Version plus longue sans E_NOTICE et sortie du tableau résultant
la source
ababacabBACABABA