To był inspirowany przez teraz usunięte CS.SE pytanie .
Zadanie
Biorąc pod uwagę dwa niepuste ciągi wejściowe A i B, wypisz najmniejszą odległość od A do palindromu zawierającego B jako podłańcuch. Odległość jest definiowana przez liczbę zamienników postaci ( odległość Hamminga ).
Ograniczenia
- Rozsądne wejście: istnieje palindrom. Oznacza to | A | ≥ | B |.
- A i B zawierają tylko małe znaki ASCII, małe i wielkie litery są odrębne (podobnie jak wszystkie inne znaki).
- Jeśli twój język nie radzi sobie ze znakami ASCII, możesz również użyć liczb całkowitych (lub innego rozsądnego typu danych) i możesz ograniczyć zakres do 128 elementów.
- Możesz pobierać dane wejściowe ze standardowego wejścia, argumentów funkcji, argumentów wiersza poleceń itp.
- Możesz podać wynik na stdout, zwrócić wartość itp.
- Nie musisz podawać działającego palindromu, wystarczy najmniejsza odległość do jednego.
Przykłady
A B Output
thilloaoyreot hello 4 (thelloaolleht)
benjonson stack 9 (stackcats)
neversaynever! odd 9 (neveroddoreven)
ppcggcpp gg 0 (ppcggcpp)
stars tat 1 (stats)
Punktacja
To jest kod golfowy, wygrywa najkrótszy kod w bajtach.
code-golf
string
palindrome
Społeczność
źródło
źródło
Pyth, 45 bajtów
Wypróbuj online. Zestaw testowy.
Nadal nie jestem do końca zadowolony z tego, jak to się potoczyło. Ale przynajmniej trudno to teraz zrozumieć bez wyjaśnienia. (Chyba sukces?)
Wyjaśnienie
Q
i B jakoz
.m
…_BQ
Oblicz następujące dla A i jego odwrotności jakod
:m
…h-ldlz
Oblicz następujące dla wszystkichk
od 0 dolen(A) - len(B)
włącznie:+Bklz
Zdobądź paręk, k + len(B)
.cd
Rozdzielaćd
na te indeksy.X
…1z
Zamień drugą (środkową) część na B.Ks
Połącz elementy i oszczędzajK
. B jest teraz wstawiony w pozycjik
w A lub na odwrocie.hc2
Podziel powstały ciąg na dwie części i zachowaj pierwszy kawałek. Daje to połowę łańcucha z możliwym środkowym znakiem.hc2PK
Usuń ostatnią postać i wykonaj ten sam podział, zachowując pierwszy kawałek. Daje to połowę łańcucha bez możliwego środkowego znaku.+
…_
Dodaj odwrotność krótszego elementu do dłuższego elementu. Mamy teraz palindrom.s
Połącz wyniki dla A i jego odwrotności.f}zT
Usuń wszystkie ciągi, które nie zawierają B.m
Oblicz następujące dla wszystkich wynikowych ciągówd
:nVQd
Uzyskaj nierówność parami z A. Daje to wartość True dla par, które należy zmienić.s
Zsumuj listę. To daje dystans Hamminga.hS
Weź minimalny wynik.źródło
JavaScript (Firefox 30+),
152146 bajtówPodejście z użyciem siły brutalnej: wygeneruj każde możliwe nakładanie się A i B, przekształć je w palindrom, oblicz odległości Hamminga od A i weź najmniejszą z powstałych odległości.
Prawdopodobnie można by grać w golfa trochę więcej ...
Testowy fragment kodu
Pokaż fragment kodu
źródło