Kleinster Hamming-Abstand zu einem Palindrom, das eine Teilzeichenfolge enthält

17

Dies wurde durch eine jetzt entfernte CS.SE-Frage inspiriert .

Aufgabe

Geben Sie bei zwei nicht leeren Eingabezeichenfolgen A und B den kleinsten Abstand von A zu einem Palindrom aus, das B als Teilzeichenfolge enthält. Die Entfernung wird durch die Anzahl der Zeichenersetzungen ( Hamming-Entfernung ) definiert.

Beschränkungen

  • Sinnvolle Eingabe: Ein Palindrom existiert. Dies bedeutet | A | ≥ | B |.
  • A und B enthalten nur kleinere ASCII-Zeichen. Kleinbuchstaben und Großbuchstaben sind unterschiedlich (wie alle anderen Zeichen auch).
  • Wenn Ihre Sprache keine ASCII-Zeichen verarbeiten kann, können Sie auch Ganzzahlen (oder einen anderen sinnvollen Datentyp) verwenden und den Bereich auf 128 Elemente beschränken.
  • Sie können Eingaben über stdin, Funktionsargumente, Befehlszeilenargumente usw. vornehmen.
  • Sie können das Ergebnis auf stdout, Rückgabewert usw. angeben.
  • Sie müssen kein funktionierendes Palindrom angeben, der kleinste Abstand zu einem ist ausreichend.

Beispiele

A                   B            Output
thilloaoyreot       hello        4 (thelloaolleht)
benjonson           stack        9 (stackcats)
neversaynever!      odd          9 (neveroddoreven)
ppcggcpp            gg           0 (ppcggcpp)
stars               tat          1 (stats)

Wertung

Dies ist Code Golf, der kürzeste Code in Bytes gewinnt.

Gemeinschaft
quelle

Antworten:

5

Pyth, 19 Bytes

hSmsnVQd/#z_I#^+Qzl

Demonstration

Extremer Brute-Force-Ansatz. Generieren Sie alle Zeichenfolgen der entsprechenden Länge mit Zeichen in einer der beiden Zeichenfolgen, filtern Sie nach Palindromen und enthalten Sie die zweite Eingabe. Ordnen Sie sie dem Hamming-Abstand zur ersten Zeichenfolge zu und geben Sie die kleinste aus.

Erläuterung:

hSmsnVQd/#z_I#^+Qzl
hSmsnVQd/#z_I#^+QzlQ     Variable introduction
                         Q = string A, z = string B.
               +Qz       Concatenate A and B
              ^   lQ     Form every string of length equal to len(A)using
                         characters from the concatenation.
             #           Filter on
           _I            Invariance under reversal (palindrome)
         #               Filter on
        / z              Nonzero occurences of B
  m                      Map to
    nV                   !=, vectorized over
      Qd                 A and the map input
   s                     Sum (gives the hamming weight)
hS                       Min
isaacg
quelle
So etwas habe ich mir gedacht, aber ich habe festgestellt, dass O ((m + n) ^ n) zu O (schlecht) ist. : D
PurkkaKoodari
3

Pyth, 45 Bytes

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

Probieren Sie es online aus. Testsuite.

Ich bin immer noch nicht ganz zufrieden mit dem Ergebnis. Aber zumindest ist es jetzt ohne Erklärung ziemlich schwer zu verstehen. (Erfolg, denke ich?)

Erläuterung

  • Nehmen Sie A als Qund B als auf z.
  • m_BQBerechnen Sie für A und seine Umkehrung Folgendes d:
    • mh-ldlzBerechnen Sie für alle Werte kvon 0 bis len(A) - len(B)einschließlich Folgendes :
      • +BklzHolen Sie sich das Paar k, k + len(B).
      • cdSplit dan diesen Indizes.
      • X1zErsetzen Sie den zweiten (mittleren) Teil durch B.
      • KsVerketten Sie die Teile und speichern Sie sie in K. B wird jetzt an der Position kin A oder umgekehrt eingefügt .
      • hc2Teilen Sie die resultierende Saite in zwei Teile und behalten Sie das erste Stück. Dies ergibt die Hälfte der Zeichenkette mit dem möglichen mittleren Zeichen.
      • hc2PKEntfernen Sie das letzte Zeichen und teilen Sie es auf, wobei Sie das erste Stück behalten. Dies ergibt die Hälfte der Zeichenkette ohne das mögliche mittlere Zeichen.
      • +_Fügen Sie die Rückseite des kürzeren Stücks zum längeren Stück hinzu. Wir haben jetzt ein Palindrom.
  • s Verketten Sie die Ergebnisse für A und seine Umkehrung.
  • f}zT Entfernen Sie alle Zeichenfolgen, die B nicht enthalten.
  • mBerechnen Sie für alle resultierenden Zeichenfolgen Folgendes d:
    • nVQd Ermitteln Sie die paarweise Ungleichung mit A. Dies ergibt True für Paare, die geändert werden müssen.
    • sSummiere die Liste. Dies gibt die Hamming-Distanz an.
  • hS Nimm das minimale Ergebnis.
PurkkaKoodari
quelle
1

JavaScript (Firefox 30+), 152 146 Bytes

(A,B)=>Math.min(...[...Array(A[l='length']-B[l]+1)].map((_,i)=>[for(c of q=A.slice(j=t=0,i)+B+A.slice(i+B[l]))t+=(c!=A[j])+(c!=q[q[l]-++j])/2]|t))

Brute-Force-Ansatz: Generieren Sie jede mögliche Überlappung von A und B, machen Sie aus jeder ein Palindrom, berechnen Sie Hamming-Abstände von A und nehmen Sie den kleinsten der resultierenden Abstände.

Könnte wohl etwas mehr golfen werden ...

Testschnipsel

ETHproductions
quelle