部分文字列を含むパリンドロームまでの最小ハミング距離


17

これは、CS.SEから削除された質問に触発されました。

仕事

空でない2つの入力文字列AとBが与えられた場合、AからBを部分文字列として含む回文までの最小距離を出力します。距離は、文字置換の数(ハミング距離)によって定義されます。

制限事項

  • 賢明な入力:回文が存在します。これは| A |を意味します ≥| B |。
  • AとBには小文字のASCII文字のみが含まれ、小文字と大文字は区別されます(他のすべての文字と同様)。
  • 言語でASCII文字を処理できない場合は、整数(またはその他の適切なデータ型)も使用でき、範囲を128要素に制限することもできます。
  • stdin、関数引数、コマンドライン引数などから入力を取得できます。
  • stdout、戻り値などに結果を与えることができます。
  • 作業中の回文を与える必要はありません。最短の距離で十分です。

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

得点

これはコードゴルフで、バイト単位の最短コードが勝ちです。

回答:


5

Pyth、19バイト

hSmsnVQd/#z_I#^+Qzl

デモンストレーション

極端なブルートフォースアプローチ。いずれかの文字列の文字を使用して適切な長さのすべての文字列を生成し、回文および2番目の入力を含むためのフィルター、最初の文字列からのハミング距離へのマッピング、最小の出力。

説明:

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

このようなものは私が考えたものですが、O((m + n)^ n)はO(悪い)であると判断しました。:D
PurkkaKoodari

3

Pyth、45バイト

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

オンラインでお試しください。 テストスイート。

私はまだこれがどうなったのか正確には満足していません。しかし、少なくとも今は説明なしで理解することは非常に困難です。(成功ですか?)

説明

  • A as QとB asを取りzます。
  • m_BQAとその逆の両方について次を計算しますd
    • m… 0からそれまでのh-ldlzすべてについて以下を計算します。 klen(A) - len(B)
      • +Bklzペアを取得しk, k + len(B)ます。
      • cddそれらのインデックスで分割します。
      • X1z2番目(中央)の部分をBに置き換えます。
      • Ksピースを連結してに保存しKます。BはkAの位置またはその逆に挿入されます。
      • hc2結果の文字列を2つに分割し、最初の部分を保持します。これにより、文字列の半分に可能な中間文字が与えられます。
      • hc2PK最後のキャラクターを削除し、最初のピースを保持しながら、同じ分割を行います。これにより、可能な中間文字なしで文字列の半分が得られます。
      • +_短い部分の逆を長い部分に追加します。これでパリンドロームができました。
  • s Aとその逆の結果を連結します。
  • f}zT Bを含まないすべての文字列を削除します。
  • m結果のすべての文字列について次を計算しますd
    • nVQd Aでペアごとの不等式を取得します。これにより、変更が必要なペアに対してTrueが得られます。
    • sリストを合計します。これにより、ハミング距離が得られます。
  • hS 最小限の結果を取る。

1

JavaScript(Firefox 30 +)、152 146バイト

(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))

ブルートフォースアプローチ:AとBの可能なオーバーラップを生成し、それぞれを回文にし、Aからハミング距離を計算し、結果の距離の最小値を取得します。

おそらくもう少しゴルフすることができます...

テストスニペット

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.