Найменша відстань Хеммінга до паліндрому, що містить підрядок


17

Це був натхненний тепер видалені CS.SE питання .

Завдання

Враховуючи два непусті вхідні рядки 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

Демонстрація

Екстремальний підхід грубої сили. Створіть усі рядки відповідної довжини з символами в будь-якому рядку, фільтруйте за паліндрами та для вмісту другого вводу, переведіть на відстань перфорації від першого рядка, виведіть найменший.

Пояснення:

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

Спробуйте в Інтернеті. Тестовий набір.

Я все ще не зовсім задоволений тим, як це вийшло. Але принаймні це зараз важко зрозуміти без пояснень. (Успіх, я думаю?)

Пояснення

  • Візьміть в А як Qі В як z.
  • m_BQОбчисліть наступне як для A, так і для його зворотного зв'язку як d:
    • mh-ldlz Обчисліть наступне для всіх kвід 0 до len(A) - len(B)включно:
      • +BklzОтримайте пару k, k + len(B).
      • cd Розкол d за тими показниками.
      • X1z Замініть другу (середню) частину на B.
      • Ks З’єднайте шматки та збережіть K . B тепер вставляється в положення kA або його зворотний бік.
      • hc2Отриману нитку розділіть на дві частини і збережіть перший шматок. Це дає половину рядка з можливим середнім символом.
      • hc2PKВидаліть останній символ і зробіть той же розділ, зберігаючи перший шматок. Це дає половину рядка без можливого середнього символу.
      • +_Додайте зворотний бік коротшого шматка до довшого шматка. Зараз у нас є паліндром.
  • s Об'єднайте результати для A та його зворотний.
  • f}zT Видаліть усі рядки, які не містять B.
  • m Обчисліть наступне для всіх отриманих рядків d :
    • nVQd Отримайте парну нерівність з А. Це дає 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 і пройдіть найменшу з отриманих відстаней.

Можливо, можна було б пограти в гольф трохи більше ...

Фрагмент тесту

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.