Dzisiaj wykonasz kolejne wyzwanie palindromowe!
Twoim dzisiejszym zadaniem jest pobranie ciągu znaków i określenie minimalnej liczby liter wymaganych do wstawienia, aby przekształcić go w palindrom.
Na przykład weźmy ciąg fishes
.
W takim przypadku najlepszym sposobem byłoby dodanie h if
, więc wynik wyniósłby 3.
fishe s
h if
---------
fishehsif
Teraz spróbujmy z codegolf
. Ponieważ jest to powtórzenie o
, możemy po prostu zrobić:
codeg o lf
fl ed c
-------------
flcodegedoclf
aby uzyskać wynik 5.
Przypadki testowe
ppcg -> 2
codegolf -> 5
palindrome -> 9
stackexchange -> 8
programmingpuzzlesandcodegolf -> 20
code-golf
string
palindrome
Oliver Ni
źródło
źródło
ppcg
, wynik to 4 + 2 = 6)Odpowiedzi:
Pyth, 10 bajtów
pakiet testowy.
Istnieje kilka równoważnych cech, których szukamy:
Powszechnym pomysłem jest „szkielet” liter na wejściu, które są dopasowane do liter wejścia w produkcie końcowym.
Ten szkielet jest zawsze palindromem, a litery pasują do odwróconych odpowiedników. Każda inna niż szkielet litery nie ma sobie równych i musi mieć wstawiony odpowiednik.
Zamiast tego alternatywa o tej samej długości wykorzystuje czwarty warunek, długość wejścia pomniejszoną o długość jego najdłuższej podsekwencji palindromicznej
Link do pakietu testowego.
Ta część jest inna
W obu przypadkach zamiast usuwać podsekwencję palindromiczną z wejścia i przyjmować długość, moglibyśmy zamiast tego odjąć jej długość od długości wejścia. Albo jeden kosztuje 4 bajtów:
-lQl
vsl.-Q
.źródło
Python, 112 bajtów
Bardzo nieefektywne.
Wypróbuj online! Musisz poczekać minutę na zakończenie ostatniej sprawy.
Zadzwoń
e(<string>, 0, <length of string - 1>)
, np. E („ryby”, 0, 5) `.Niegolfowane (w pewnym sensie) z wyjaśnieniem:
źródło
l=0
.05AB1E , 11 bajtów
Wykorzystuje kodowanie CP-1252 .
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Brachylog , 9 bajtów
Wypróbuj online!
To wyzwanie naprawdę wymagało odpowiedzi Brachylog v2, ponieważ palindromizacja wstawiania jest w tym języku tak intuicyjna.
Wyjaśnienie
⊆P↔P
tak naprawdę działa palindromizacja przez wstawienie (zobacz ten przykład )źródło
C,
89121 bajtówBezwstydny port odpowiedzi Olivera nie mógł wymyślić żadnego krótszego rozwiązania.
g
wywołujef
ze wskaźnikiem do pierwszego i ostatniego znaku ciągu (ostatni znak jest częścią ciągu, a nie'\0'
). Staje się jeszcze bardziej nieefektywny, ponieważ w przypadkuf
jest wywoływany dwa razymin
.Nie golfowany:
Stosowanie:
źródło
Brachylog v1 , 13 bajtów
Wypróbuj online!
Za pomocą tego kodu możesz sprawdzić znalezione palindromy .
Wyjaśnienie
Jestem prawie zaskoczony, że to nawet działa, widząc, jak to jest absurdalnie proste.
Gwarantuje to znalezienie najmniejszego palindromu, ponieważ
IrI
wygeneruje ciągi o większej długości podczas cofania, zaczynając od pustego ciągu.Nie jest to wystarczająco wydajne, aby obliczyć ostatni przypadek testowy na TIO, ze względu na użycie
s - Ordered subset
.źródło
Partia,
234232 bajtyDziała, rekurencyjnie próbując wstawić niepasujące znaki na obu końcach, więc bardzo wolno (nie próbowałem ostatniego przypadku testowego). Limity rekurencji oznaczają, że i tak działa to tylko dla ograniczonej długości łańcucha, więc
99
jest to nieco arbitralne. Muszę używaćcall
parametrów jako zmiennych lokalnych, ponieważ nie mogłemsetlocal
pracować dla siebie, co oznacza, że%1
parametr:l
podprogramu jest wyrażeniem, które ocenia liczbę wykonanych do tej pory wstawek.źródło