Assembler ensemble un palindrome à partir de sous-chaînes palindromiques


14

Étant donné une chaîne l, recherchez toutes les sous p- chaînes palindromiques de l(y compris les doublons et les chaînes de caractères uniques). Ensuite, réorganisez toutes les sous-chaînes pdans un palindrome valide (il peut y avoir plusieurs bonnes réponses). S'il n'est pas possible de réorganiser pen un seul palindrome, votre programme peut avoir un comportement indéfini (erreur, débordement de pile, sortie, suspension / meurtre intempestif de John Dvorak, etc ...)


Exemples

Cas de test valides

l = anaa
p = ['a', 'n', 'a', 'a', 'aa', 'ana']
result = anaaaaana or aanaaanaa or aaananaaa

l = 1213235
p = ['1', '2', '1', '3', '2', '3', '5', '121', '323']
result = 1213235323121

l = racecar
p = ['r', 'a', 'c', 'e', 'c', 'a', 'r', 'cec', 'aceca', 'racecar']
result = racecarcecaacecracecar (there are others)

l = 11233
p = ['1', '11', '1', '2', '3', '33', '3']
result = 113323311 or 331121133

l = abbccdd
p = ['a', 'b', 'bb', 'b', 'c', 'cc', 'c', 'd', 'dd', 'd']
result = bbccddaddccbb or ccbbddaddbbcc or (etc...)

l = a
p = ['a']
result = a

Cas de test non valides (impossible)

l = 123456789
p = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
result = <not possible, behavior undefined>

l = hjjkl
p = ['h', 'j', 'jj', 'j', 'k', 'l']
result = <not possible, behavior undefined>

l = xjmjj
p = ['x', 'j', 'jmj', 'm', 'j', 'jj', 'j']
result = <not possible, behavior undefined>

Règles

  • Si le mot d'entrée est lui-même un palindrome, il sera toujours valide comme entrée.
  • Une seule sous-chaîne doit être retournée, celle que vous choisissez est arbitraire tant qu'elle est valide.
  • Si l'entrée n'a pas de sortie viable, votre code peut avoir un comportement indéfini.
  • Les entrées ne contiendront que des caractères imprimables ASCII entre 0x20-0x7E.
  • C'est le , le nombre d'octets le plus bas est le gagnant.

1
Le premier résultat proposé pour "abbccdd"est faux: les deux dernières lettres devraient l'être "bb", non "dd".
Fatalize

Pouvons-nous retourner un tableau de sous-chaînes, plutôt qu'une seule chaîne?
Shaggy

Puis-je prendre une liste de caractères en entrée?
alephalpha

1
Par suspendre étant un comportement acceptable, voulez-vous dire suspendre la personne qui a donné son avis?
John Dvorak

@JohnDvorak clarifié.
Urne de poulpe magique le

Réponses:


8

Brachylog , 10 octets

{s.↔}ᶠpc.↔

Essayez-le en ligne!

Échoue (c'est-à-dire les impressions false.) si ce n'est pas possible.

Explication

{   }ᶠ         Find all…
 s.              …substrings of the input…
  .↔             …which are their own reverse
      p        Take a permutation of this list of palindromes
       c.      The output is the concatenation of this permutation
        .↔     The output is its own reverse


3

JavaScript (ES6), 193 octets

"Regarde maman, pas de permutation intégrée!" (Alors oui ... c'est long ...)

Renvoie un tableau vide s'il n'y a pas de solution.

f=(s,a=[].concat(...[...s].map((_,i,a)=>a.map((_,j)=>s.slice(i,j+1)))).filter(P=s=>[...s].reverse().join``==s&&s),m=S=[])=>S=a.map((_,i)=>f(s,b=[...a],[...m,b.splice(i,1)]))>''?S:P(m.join``)||S

Démo

Comment?

Divisons le code en parties plus petites.

Nous définissons P () , une fonction qui renvoie s si s est un palindrome, ou false sinon.

P = s => [...s].reverse().join`` == s && s

Nous calculons toutes les sous-chaînes de la chaîne d'entrée s . En utilisant P () , nous isolons les palindromes non vides et les stockons dans le tableau a .

a = [].concat(...[...s].map((_, i, a) => a.map((_, j) => s.slice(i, j + 1)))).filter(P)

La fonction récursive principale f () prend a comme entrée et calcule toutes ses permutations. Il met à jour S chaque fois que la permutation lui - même est un palindrome (une fois rejoint), et finalement retourne la valeur finale de S .

f = (                        // given:
  a,                         //   a[] = input array
  m = S = []                 //   m[] = current permutation of a[]
) =>                         //   and S initialized to []
  S = a.map((_, i) =>        // for each element at position i in a[]:
    f(                       //   do a recursive call with:
      b = [...a],            //     b[] = copy of a[] without the i-th element
      [...m, b.splice(i, 1)] //     the element extracted from a[] added to m[]
    )                        //   end of recursive call
  ) > '' ?                   // if a[] was not empty:
    S                        //   let S unchanged
  :                          // else:
    P(m.join``) || S         //   update S to m.join('') if it's a palindrome


2

05AB1E , 13 12 octets

ŒʒÂQ}œJʒÂQ}¤

Essayez-le en ligne!

-1 octet grâce à Magic Octopus Urn et Enigma.


Jfactorise automatiquement pour que vous n'ayez pas besoin €Jsimplement J; vous êtes également censé rendre l'un des palindromes, pas tous. Essayez-le en ligne! est valide pour le même nombre d'octets.
Magic Octopus Urn

@MagicOctopusUrn Fixe, merci!
Kaldo

Ùćpourrait être ¤(ou un certain nombre d'autres options)
Emigna

@Emigna ne sais pas pourquoi je n'ai pas vu que ce Ùn'était pas nécessaire.
Urne de poulpe magique

Enigma My bad, pour une raison inconnue, je pensais que nous étions censés afficher tous les palindromes uniques, d'où l'original original. Merci pour l'astuce, corrigé!
Kaldo

2

Stax , 13 octets

绬►Ö∞j∞:Æ╘τδ

Exécuter des cas de test (cela prend environ 10 secondes sur ma machine actuelle)

Il s'agit de la représentation ascii correspondante du même programme.

:e{cr=fw|Nc$cr=!

Ce n'est pas de la force brute tout à fait pure , mais c'est aussi petit que l'implémentation de force brute que j'ai écrite. Celui-ci a planté mon navigateur après environ 10 minutes. Quoi qu'il en soit, voici comment cela fonctionne.

:e                  Get all contiguous substrings
  {cr=f             Keep only those that are palindromes
       w            Run the rest of the program repeatedly while a truth value is produced.
        |N          Get the next permutation.
          c$        Copy and flatten the permutation.
            cr=!    Test if it's palindrome.  If not, repeat.
                    The last permutation produced will be implicitly printed.

2

Rubis , 131 123 120 120 octets

->s{m=->t{t==t.reverse}
(1..z=s.size).flat_map{|l|(0..z-l).map{|i|s[i,l]}}.select(&m).permutation.map(&:join).detect &m}

Essayez-le en ligne!

Un lambda acceptant une chaîne et renvoyant une chaîne. Renvoie nillorsqu'aucune solution n'existe.

-5 octets: remplacer select{|t|l[t]}parselect(&l)

-3 octets: remplacer map{..}.flattenparflat_map{...}

-1 octet: boucle sur la longueur de la sous-chaîne et le début de la sous-chaîne, au lieu de sur le début de la sous-chaîne et la fin de la sous-chaîne

-2 octets: Déclarez zà la première utilisation au lieu d'avance

->s{
  l=->t{t==t.reverse}        # Lambda to test for palindromes
  (1..z=s.size).flat_map{|l| # For each substring length
    (0..z-l).map{|i|         # For each substring start index
      s[i,l]                 # Take the substring
    }
  }                          # flat_map flattens the list of lists of substrings
  .select(&l)                # Filter to include only palindromic substrings
  .permutation               # Take all orderings of substrings
  .map(&:join)               # Flatten each substring ordering into a string
  .detect &l                 # Find the first palindrome
}

1

Pyth , 13 octets

h_I#sM.p_I#.:

Essayez-le en ligne!

-1 octet merci à M. Xcoder


Lol j'étais si sûr que personne d'autre n'utilise Pyth que j'ai soumis ma propre réponse séparée (maintenant supprimée) avant de voir la vôtre. Vous pouvez utiliser h_I#sM.p_I#.:ou e_IDsM.p_I#.:pour 13 octets.
M. Xcoder

@ Mr.Xcoder Oh haha: P ouais je n'utilise presque jamais Pyth, je ne sais pas pourquoi j'ai décidé de l'utiliser. Merci!
HyperNeutrino

1

Python 3 , 167 octets

lambda a:g(sum(k,[])for k in permutations(g(a[i:j+1]for i in range(len(a))for j in range(i,len(a)))))[0]
g=lambda k:[e for e in k if e==e[::-1]]
from itertools import*

Essayez-le en ligne!

-2 octets grâce à M. Xcoder


Vous pouvez utiliser a[i:j+1]si vous utilisez ensuite à la for j in range(i,len(a))place, pour -2 octets.
M. Xcoder

1

Japt , 19 octets

Entravé par Japt ne pouvant pas (encore) obtenir toutes les sous-chaînes d'une chaîne (et en partie par mes niveaux d'épuisement actuels!).

Sorties undefineds'il n'y a pas de solution.

Êõ@ãX fêQÃc á m¬æêQ

Essayez-le


Explication

                        :Implicit input of string U
Ê                       :Length of U
 õ                      :Range [1,Ê]
  @      Ã              :Pass each X through a function
   ãX                   :  Substrings of U of length X
      f                 :  Filter
       êQ               :    Is it a palindrome?
          c             :Flatten
            á           :Permutations
              m         :Map
               ¬        :  Join to a string
                æêQ     :Get first element that is a palindrome

1
Votre question concerne-t-elle une liste de sous-chaînes à supprimer simplement ¬de votre réponse: P?
Urne de poulpe magique

1
Je pensais que je pouvais le supprimer, mais j'en aurais eu besoin æ_¬êQpour qu'il n'ait de toute façon pas économisé d'octets!
Shaggy

Hahaha, je m'assurerai de me méfier de tes façons d'économiser des octets à partir de maintenant;). J'ai essayé de le retirer moi-même pour vérifier, mais j'ai réalisé que les commandes japt ne fonctionnent pas comme je pense qu'elles fonctionnent lol.
Urne de poulpe magique

1

Décortiquer , 12 octets

ḟS=↔mΣPfS=↔Q

Essayez-le en ligne!

Explication

ḟS=↔mΣPfS=↔Q  Implicit input, a string.
           Q  List of substrings.
       f      Keep those
        S=↔   that are palindromic (equal to their reversal).
      P       Permutations of this list.
    mΣ        Flatten each.
ḟ             Find an element
 S=↔          that is palindromic.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.