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, m¬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.