Cuci insieme un palindromo da sottostrati palindromici


14

Data una stringa l, trova tutte le sottostringhe palindromiche pdi l(compresi i duplicati e le stringhe a carattere singolo). Successivamente, riorganizza tutte le sottostringhe pin un palindromo valido (potrebbero esserci più risposte corrette). Se non è possibile riorganizzare pin un singolo palindromo, il programma potrebbe avere un comportamento indefinito (errore, overflow dello stack, uscita, impiccagione / omicidio prematuro di John Dvorak, ecc ...)


Esempi

Casi di test validi

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

Casi di test non validi (non possibile)

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>

Regole

  • Se la parola di input è un palindromo stesso, sarà sempre valida come input.
  • Dovrebbe essere restituita solo una sottostringa, quale si sceglie è arbitraria fintanto che è valida.
  • Se l'input non ha output realizzabili, il codice potrebbe avere un comportamento indefinito.
  • Gli input conterranno solo caratteri ASCII-stampabili tra 0x20-0x7E.
  • Questo è , il conteggio di byte più basso è il vincitore.

1
Il primo risultato proposto per "abbccdd"è sbagliato: le ultime due lettere dovrebbero essere "bb", no "dd".
Fatalizza il

Possiamo restituire una matrice di sottostringhe, anziché una singola stringa?
Shaggy,

Posso prendere un elenco di caratteri come input?
alephalpha,

1
Impiccare come comportamento accettabile, vuoi dire impiccare la persona che gli ha dato input?
John Dvorak,

@JohnDvorak chiarito.
Magic Octopus Urn

Risposte:


8

Brachylog , 10 byte

{s.↔}ᶠpc.↔

Provalo online!

Non riesce (cioè stampa false.) se non è possibile.

Spiegazione

{   }ᶠ         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

Cocco , 140 byte

s->p(map(''.join,permutations(p(v for k in n(s)for v in n(k[::-1])))))[0]
from itertools import*
n=scan$((+))
p=list..filter$(x->x==x[::-1])

Provalo online!


3

JavaScript (ES6), 193 byte

"Guarda mamma, nessuna permutazione integrata!" (Quindi sì ... è lungo ...)

Restituisce un array vuoto se non c'è soluzione.

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

dimostrazione

Come?

Dividiamo il codice in parti più piccole.

Definiamo P () , una funzione che restituisce s se s è un palindromo, o falso altrimenti.

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

Calcoliamo tutte le sottostringhe della stringa di input s . Usando P () , isoliamo i palindromi non vuoti e li memorizziamo nell'array a .

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

La funzione ricorsiva principale f () accetta un input e calcola tutte le sue permutazioni. Aggiorna S quando la permutazione sé è un palindromo (una volta uniti), e infine restituisce il valore finale di 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 byte

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

Provalo online!

-1 byte grazie a Magic Octopus Urn ed Enigma.


Jfactorizes automaticamente in modo non è necessario €Jsolo J; inoltre, dovresti restituire uno dei palindromi, non tutti. Provalo online! è valido per lo stesso conteggio byte.
Magic Octopus Urn,

@MagicOctopusUrn Risolto, grazie!
Kaldo,

Ùćpotrebbe essere ¤(o una serie di altre opzioni)
Emigna,

@Emigna non so perché non ho visto il Ùnon necessario.
Magic Octopus Urn,

Enigma Mio cattivo, per una ragione sconosciuta ho pensato che dovessimo mostrare tutti i palindromi unici, da qui l'originale Ù. Grazie per la punta, risolto!
Kaldo,

2

Stax , 13 byte

绬►Ö∞j∞:Æ╘τδ

Esegui test case (ci vogliono circa 10 secondi sulla mia macchina attuale)

Questa è la corrispondente rappresentazione ASCII dello stesso programma.

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

Non è del tutto pura forza bruta, ma è piccola quanto l'implementazione della forza bruta che ho scritto. Quello ha bloccato il mio browser dopo circa 10 minuti. Comunque, ecco come funziona.

: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

Ruby , 131 123 120 byte

->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}

Provalo online!

Un lambda che accetta una stringa e restituisce una stringa. ritornanil quando non esiste alcuna soluzione.

-5 byte: sostituisci select{|t|l[t]} conselect(&l)

-3 byte: sostituisci map{..}.flatten conflat_map{...}

-1 byte: scorrere sopra la lunghezza e l'inizio della sottostringa, anziché l'inizio e la fine della sottostringa

-2 byte: dichiarare zal primo utilizzo anziché in anticipo

->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 byte

h_I#sM.p_I#.:

Provalo online!

-1 byte grazie a Mr. Xcoder


Lol Ero così sicuro che nessun altro usa Pyth che ho inviato la mia risposta separata (ora cancellata) prima di vedere la tua. È possibile utilizzare h_I#sM.p_I#.:o e_IDsM.p_I#.:per 13 byte.
Mr. Xcoder,

@ Mr.Xcoder Oh haha: P sì, quasi mai uso Pyth, non so perché ho deciso di usarlo. Grazie!
HyperNeutrino,

1

Python 3 , 167 byte

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*

Provalo online!

-2 byte grazie a Mr. Xcoder


È possibile utilizzare a[i:j+1]se invece si utilizza for j in range(i,len(a))invece, per -2 byte.
Mr. Xcoder,

1

Japt , 19 byte

Ostacolato da Japt non (ancora) in grado di ottenere tutto sottostringhe di una stringa (e in parte dai miei attuali livelli di esaurimento!).

Emette undefinedse non c'è soluzione.

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

Provalo


Spiegazione

                        :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
La tua domanda su un elenco di sottostringhe è semplicemente da rimuovere ¬dalla tua risposta: P?
Magic Octopus Urn,

1
Pensavo di poterlo rimuovere, ma poi avrei avuto bisogno in æ_¬êQmodo che non avrebbe salvato alcun byte!
Shaggy,

Hahaha, mi assicurerò di stare attento ai tuoi modi di risparmiare byte da ora in poi;). Ho provato a rimuoverlo da solo per controllare, ma ho capito che i comandi japt non funzionano come penso che funzionino lol.
Magic Octopus Urn,

1

Buccia , 12 byte

ḟS=↔mΣPfS=↔Q

Provalo online!

Spiegazione

ḟ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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.