Jarak Hamming terkecil ke palindrome yang berisi substring


17

Ini terinspirasi oleh pertanyaan CS.SE yang sekarang dihapus .

Tugas

Diberikan dua string input A dan B yang tidak kosong, menampilkan jarak terkecil dari A ke palindrom yang berisi B sebagai substring. Jarak didefinisikan oleh jumlah penggantian karakter ( jarak Hamming ).

Batasan

  • Input yang masuk akal: ada palindrome. Ini berarti | A | ≥ | B |.
  • A dan B hanya berisi karakter ASCII yang lebih rendah, huruf kecil dan huruf besar berbeda (seperti semua karakter lainnya).
  • Jika bahasa Anda tidak dapat berurusan dengan karakter ASCII, Anda dapat menggunakan integer (atau tipe data wajar lainnya) juga, dan Anda dapat memilih untuk membatasi rentang hingga 128 elemen.
  • Anda dapat mengambil input dari stdin, argumen fungsi, argumen baris perintah, dll.
  • Anda dapat memberikan hasilnya pada stdout, nilai pengembalian, dll.
  • Anda tidak perlu memberikan palindrom yang berfungsi, jarak terkecil ke satu sudah cukup.

Contohnya

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

Mencetak gol

Ini adalah kode golf, kode terpendek dalam byte yang menang.

Jawaban:


5

Pyth, 19 byte

hSmsnVQd/#z_I#^+Qzl

Demonstrasi

Pendekatan kekerasan ekstrim. Hasilkan semua string dengan panjang yang sesuai dengan karakter di kedua string, filter untuk palindrom dan untuk berisi input kedua, petakan ke jarak hamming dari string pertama, output terkecil.

Penjelasan:

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

Sesuatu seperti ini adalah apa yang saya pikirkan, tetapi memutuskan O ((m + n) ^ n) terlalu O (buruk). : D
PurkkaKoodari

3

Pyth, 45 byte

hSmsnVQdf}zTsmm+hc2KsXcd+Bklz1z_hc2PKh-lQlz_B

Cobalah online. Suite uji.

Saya masih belum benar-benar puas dengan bagaimana ini terjadi. Tapi setidaknya itu cukup sulit untuk dipahami tanpa penjelasan sekarang. (Sukses, kurasa?)

Penjelasan

  • Ambil A sebagai Qdan B sebagai z.
  • m... _BQHitung yang berikut untuk A dan kebalikannya sebagai d:
    • mh-ldlzHitung yang berikut untuk semua kdari 0 hingga len(A) - len(B)inklusif:
      • +BklzDapatkan pasangan k, k + len(B).
      • cdBerpisah ddi indeks-indeks itu.
      • X1zGanti bagian kedua (tengah) dengan B.
      • KsGabungkan potongan dan simpan K. B sekarang dimasukkan pada posisi kdi A atau kebalikannya.
      • hc2Pisahkan string yang dihasilkan menjadi dua dan simpan bagian pertama. Ini memberikan setengah dari string dengan karakter tengah yang mungkin.
      • hc2PKHapus karakter terakhir dan lakukan split yang sama, menjaga potongan pertama. Ini memberikan setengah dari string tanpa karakter tengah yang memungkinkan.
      • +... _Tambahkan kebalikan dari bagian yang lebih pendek ke bagian yang lebih panjang. Kami sekarang memiliki palindrome.
  • s Menggabungkan hasil untuk A dan kebalikannya.
  • f}zT Hapus semua string yang tidak mengandung B.
  • mHitung yang berikut untuk semua string yang dihasilkan d:
    • nVQd Dapatkan ketidaksetaraan berpasangan dengan A. Ini memberi True untuk pasangan yang perlu diubah.
    • sJumlahkan daftar. Ini memberi jarak Hamming.
  • hS Ambil hasil minimum.

1

JavaScript (Firefox 30+), 152 146 byte

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

Pendekatan brute force: menghasilkan setiap kemungkinan tumpang tindih A dan B, membuat masing-masing menjadi palindrom, menghitung jarak Hamming dari A, dan mengambil jarak terkecil yang dihasilkan.

Mungkin bisa bermain golf sedikit lebih ...

Cuplikan tes

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.