Zusammennähen eines Palindroms aus palindromen Substrings


14

lSuchen Sie bei gegebener Zeichenfolge alle palindromischen Teilzeichenfolgen pvon l(einschließlich Duplikaten und Einzelzeichenfolgen). Ordnen Sie anschließend alle Unterzeichenfolgen pin einem gültigen Palindrom neu an (möglicherweise gibt es mehrere richtige Antworten). Wenn es nicht möglich ist, pin ein einzelnes Palindrom umzuordnen, weist Ihr Programm möglicherweise ein undefiniertes Verhalten auf (Fehler, Stapelüberlauf, Beenden, Hängen / vorzeitiger Mord an John Dvorak usw.).


Beispiele

Gültige Testfälle

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

Ungültige Testfälle (nicht möglich)

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>

Regeln

  • Wenn das Eingabewort selbst ein Palindrom ist, ist es immer als Eingabe gültig.
  • Es sollte nur ein Teilstring zurückgegeben werden, der beliebig ist, solange er gültig ist.
  • Wenn die Eingabe keine brauchbare Ausgabe enthält, weist Ihr Code möglicherweise ein undefiniertes Verhalten auf.
  • Eingaben enthalten nur ASCII-druckbare Zeichen zwischen 0x20-0x7E.
  • Das ist , die niedrigste Byteanzahl ist der Gewinner.

1
Das erste vorgeschlagene Ergebnis für "abbccdd"ist falsch: Die letzten beiden Buchstaben sollten "bb"nicht sein "dd".
Fatalize

Können wir ein Array von Teilzeichenfolgen anstelle einer einzelnen Zeichenfolge zurückgeben?
Shaggy

Kann ich eine Liste von Zeichen als Eingabe verwenden?
Alephalpha

1
Meinen Sie damit, dass die Person, die den Input gegeben hat, hängen bleibt, um akzeptables Verhalten zu zeigen?
John Dvorak

@ JohnDvorak geklärt.
Magic Octopus Urn

Antworten:


8

Brachylog , 10 Bytes

{s.↔}ᶠpc.↔

Probieren Sie es online!

Schlägt fehl (dh druckt false.), wenn nicht möglich.

Erläuterung

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

"Schau Ma, keine Permutation eingebaut!" (Also ja ... es ist lang ...)

Gibt ein leeres Array zurück, wenn es keine Lösung gibt.

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

Demo

Wie?

Teilen wir den Code in kleinere Teile auf.

Wir definieren P () , eine Funktion, die s zurückgibt, wenn s ein Palindrom ist, oder andernfalls false .

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

Wir berechnen alle Teilzeichenfolgen der Eingabezeichenfolge s . Mit P () isolieren wir die nicht leeren Palindrome und speichern sie im Array a .

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

Die rekursive Hauptfunktion f () nimmt a als Eingabe und berechnet alle ihre Permutationen. Es aktualisiert S, wenn die Permutation selbst ein Palindrom ist (einmal verbunden) und gibt schließlich den Endwert von S zurück .

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 Bytes

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

Probieren Sie es online!

-1 Byte dank Magic Octopus Urn und Enigma.


Jfaktorisiert automatisch, so dass Sie nicht €Jnur brauchen J; Außerdem solltest du eines der Palindrome zurückgeben, nicht alle. Probieren Sie es online! gilt für die gleiche Anzahl von Bytes.
Magic Octopus Urn

@MagicOctopusUrn Behoben, danke!
Kaldo

Ùćkönnte sein ¤(oder eine Reihe von anderen Optionen)
Emigna

@Emigna nicht sicher, warum ich das nicht gesehen habe, Ùwurde nicht benötigt.
Magic Octopus Urn

Enigma My bad, aus einem unbekannten Grund dachte ich, wir sollten alle einzigartigen Palindrome zeigen, daher das Original Ù. Danke für den Tipp, behoben!
Kaldo

2

Stax , 13 Bytes

绬►Ö∞j∞:Æ╘τδ

Testfälle ausführen (Auf meinem aktuellen Computer dauert es ungefähr 10 Sekunden.)

Dies ist die entsprechende ASCII-Darstellung desselben Programms.

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

Es ist nicht ganz reine Brute-Force, aber es ist genauso klein wie die Brute-Force-Implementierung, die ich geschrieben habe. Dieser stürzte meinen Browser nach ca. 10 Minuten ab. Wie auch immer, hier ist, wie es funktioniert.

: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

Rubin , 131 123 120 Bytes

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

Probieren Sie es online!

Ein Lambda, das eine Zeichenfolge akzeptiert und eine Zeichenfolge zurückgibt. Gibt zurück, nilwenn keine Lösung vorhanden ist.

-5 Bytes: Ersetzen select{|t|l[t]}durchselect(&l)

-3 Bytes: Ersetzen map{..}.flattendurchflat_map{...}

-1 Bytes: Schleife über Länge und Ende des Teilstrings anstatt über Anfang und Ende des Teilstrings

-2 Bytes: zBei der ersten Verwendung anstelle von vorher deklarieren

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

h_I#sM.p_I#.:

Probieren Sie es online!

-1 Byte danke an Herrn Xcoder


Lol Ich war mir so sicher, dass kein anderer Pyth verwendet, dass ich meine eigene (jetzt gelöschte) Antwort eingereicht habe, bevor ich Ihre gesehen habe. Sie können h_I#sM.p_I#.:oder e_IDsM.p_I#.:für 13 Bytes verwenden.
Mr. Xcoder

@ Mr.Xcoder Oh haha: P ja, ich benutze Pyth kaum, weiß nicht warum ich mich dafür entschieden habe. Vielen Dank!
HyperNeutrino

1

Python 3 , 167 Bytes

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*

Probieren Sie es online!

-2 Bytes dank Mr. Xcoder


Sie können verwenden, a[i:j+1]wenn Sie for j in range(i,len(a))stattdessen -2 Bytes verwenden.
Mr. Xcoder

1

Japt , 19 Bytes

Behindert durch Japt (noch) nicht alle Teilstrings eines Strings bekommen zu können (und teilweise durch meine momentane Erschöpfung!).

Gibt aus, undefinedwenn es keine Lösung gibt.

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

Versuch es


Erläuterung

                        :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
Ist Ihre Frage zu einer Liste von Teilzeichenfolgen einfach ¬aus Ihrer Antwort zu entfernen : P?
Magic Octopus Urn

1
Ich dachte, ich könnte es entfernen, aber dann hätte ich es gebraucht, æ_¬êQdamit es sowieso keine Bytes gespeichert hätte!
Shaggy

Hahaha, ich werde von nun an auf Ihre bytespeichernden Methoden achten;). Ich habe versucht, es selbst zu entfernen, um es zu überprüfen, aber festgestellt, dass die Japt-Befehle nicht so funktionieren, wie ich glaube, sie funktionieren lol.
Magic Octopus Urn

1

Schale , 12 Bytes

ḟS=↔mΣPfS=↔Q

Probieren Sie es online!

Erläuterung

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.