Bir alt dize içeren bir palindroma en küçük Hamming mesafesi


17

Bu, artık kaldırılmış bir CS.SE sorusundan ilham aldı .

Görev

Boş olmayan iki giriş dizisi A ve B verildiğinde, A'dan alt dize olarak B içeren bir palindrom'a olan en küçük mesafeyi çıktılayın. Mesafe, karakter değiştirme sayısı ile tanımlanır ( Hamming mesafesi ) ile tanımlanır.

Kısıtlamalar

  • Duyarlı giriş: bir palindrom var. Bu | A | ≥ | B |.
  • A ve B yalnızca küçük ASCII karakterleri içerir, küçük harf ve büyük harf farklıdır (diğer tüm karakterler gibi).
  • Diliniz ASCII karakterleri ile ilgilenemiyorsa, tamsayıları (veya başka bir makul veri türünü) de kullanabilirsiniz ve aralığı 128 öğeyle sınırlamayı seçebilirsiniz.
  • Stdin, işlev bağımsız değişkenleri, komut satırı bağımsız değişkenleri vb. Girdi alabilirsiniz.
  • Sonuç stdout, dönüş değeri vb.
  • Çalışan bir palindrom vermenize gerek yoktur, birine en küçük mesafe yeterlidir.

Örnekler

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

puanlama

Bu kod golf, bayt kazanır en kısa kod kazanır.

Yanıtlar:


5

Pyth, 19 bayt

hSmsnVQd/#z_I#^+Qzl

gösteri

Aşırı kaba kuvvet yaklaşımı. Her iki dizgideki karakterlerle uygun uzunluktaki tüm dizeleri oluşturun, palindromlar için filtre ve ikinci girdiyi içeren, ilk dizeden çekiçleme mesafesine eşleyin, en küçük çıktı.

Açıklama:

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

Böyle bir şey düşündüm, ama O ((m + n) ^ n) çok O (kötü) olduğuna karar verdi. : D
PurkkaKoodari

3

Pyth, 45 bayt

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

Çevrimiçi deneyin. Test odası.

Bunun nasıl sonuçlandığından hala tam olarak memnun değilim. Ama en azından şimdi açıklama yapmadan anlamak oldukça zor. (Başarı, sanırım?)

açıklama

  • A Qve B'yi alın z.
  • m_BQA ve tersi için aşağıdakileri şu şekilde hesaplayın d:
    • m… 0 ile dahil olmak h-ldlzüzere aşağıdakiler için aşağıdakileri hesaplayın : klen(A) - len(B)
      • +BklzÇifti al k, k + len(B).
      • cddBu endekslere bölün .
      • X1zİkinci (orta) parçayı B ile değiştirin.
      • KsParçaları birleştirin ve kaydedin K. B şimdi kA konumuna veya tersine yerleştirilir.
      • hc2Elde edilen dizeyi ikiye bölün ve ilk parçayı saklayın. Bu, dizenin yarısını olası orta karakterle verir.
      • hc2PKSon karakteri kaldırın ve ilk parçayı koruyarak aynı bölmeyi yapın. Bu, dizenin yarısını olası orta karakter olmadan verir.
      • +_Kısa parçanın tersini uzun parçaya ekleyin. Şimdi bir palindromuz var.
  • s A sonuçlarını ve bunun tersini birleştirin.
  • f}zT B içermeyen tüm dizeleri kaldırın.
  • mOrtaya çıkan tüm dizeler için aşağıdakileri hesaplayın d:
    • nVQd A ile ikili eşitsizliği elde edin Bu, değiştirilmesi gereken çiftler için True verir.
    • sListeyi topla. Bu Hamming mesafesini verir.
  • hS Minimum sonucu alın.

1

JavaScript (Firefox 30+), 152 146 bayt

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

Kaba kuvvet yaklaşımı: A ve B'nin olası her üst üste binmesini oluşturun, her birini bir palindrom haline getirin, A'dan Hamming mesafelerini hesaplayın ve ortaya çıkan mesafelerin en küçüğünü alın.

Muhtemelen biraz daha golf edilebilir ...

Test snippet'i

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.