Wprowadzenie
Zamknięcie palindromiczne ciągu wejściowego jest najkrótszym palindromem, który można zbudować z ciągu wejściowego, w którym końcowy palindrom rozpoczyna się od ciągu wejściowego.
W przypadku tego wyzwania rozważymy dwukierunkowe zamknięcie palindromiczne, takie jak
- Lewe palindromiczne zamknięcie ciągu wejściowego jest najkrótszym możliwym palindromem, który zaczyna się od ciągu wejściowego.
- Prawe palindromiczne zamknięcie ciągu wejściowego jest najkrótszym możliwym palindromem, który kończy się na ciągu wejściowym.
- Dwukierunkowe zamknięcie palindromiczne ciągu wejściowego jest krótsze z lewego lub prawego zamknięcia palindromowego ciągu wejściowego.
Zadanie
Twoje zadanie jest proste. Biorąc pod uwagę ciąg znaków (składający się tylko z drukowalnego ASCII, nowych wierszy i białych znaków), należy wygenerować dwukierunkowe palindromiczne zamknięcie tego ciągu. W przypadku remisu jedno lub drugie lewe lub prawe zamknięcie palindromiczne jest prawidłowym wyjściem.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i albo drukując wynik do STDOUT (lub najbliższej alternatywy), albo zwracając go jako ciąg znaków.
Możesz założyć, że wejście nigdy nie będzie pustym ciągiem.
Kilka przykładów:
<Input> -> <Output>
"abcdef" -> "abcdefedcba" (or "fedcbabcdef")
"abcba" -> "abcba"
"abcb" -> "abcba"
"cbca" -> "acbca"
Pierwotny pomysł na pomysł trafia do VisualMelon, ostatni pomysł z pomocą Martina i Zgarba
Terminy zamknięcie palindromowe, zamknięcie lewopalindromowe i zamknięcie prawopalindromowe zostały po raz pierwszy użyte i zdefiniowane w tym artykule .
źródło
Odpowiedzi:
Pyth,
2219Wypróbuj online .
Wyjaśnienie
Dwukierunkowe zamknięcie palindromowe ma albo postać,
AX
alboXA
gdzieX
jest łańcuchem wejściowym iA
jest podłańcuchemX
. Właściwie to muszę być ciągłym podciągiemX
, prefiksem jednej formy, sufiksem drugiej formy. Ale mnie to nie obchodzi. Podciąg (ciągły lub nie) jest wszystkim, czego potrzebuję w Pyth.Edytować
Stara wersja uporządkowała ciągi po filtrowaniu według długości
.olN...
. Właśnie zdałem sobie sprawę, żey
zwraca podłańcuchy uporządkowane według długości. Więc te palindromy są już posortowane.źródło
Klip , 40
Przykład
Wyjaśnienie
źródło
CJam, 30 bajtów
Naprawdę miałem nadzieję, że zobaczę odpowiedź CJam. Więc proszę: P
Naprawdę nienawidzę tego
{,}$
bloku, ale otrzymuję nieuporządkowaną listę możliwych palindromów z powodu algorytmu generowania, którego używam.Wyjaśnienie kodu
Wypróbuj online tutaj
źródło
{,}$
bloku! Żartuję, nie mam pojęcia, co robi CJam.Python 2,
11511310910596 bajtówMam nadzieję, że golf dalej. Warto zwrócić uwagę na bity:
źródło
a
.Mathematica, 96 bajtów
Musi być bardziej elegancki sposób niż ten ...
Definiuje nienazwaną funkcję, która pobiera ciąg znaków i zwraca wynik.
Podstawową ideą jest
Characters
.Użyj dopasowania wzorca, aby znaleźć odpowiednią palindromikę każdego z nich:
Zauważ, że tak naprawdę to nie zwraca płaskiej listy. Np. Za
{a,b,c}
dostanieszPosortuj dwa wyniki według długości.
""<>#&@@
.źródło
abacaba
gdy wejście jestabac
. Prawidłowa odpowiedź tocabac
. Myślę, że powinieneś je spłaszczyć przed sortowaniem według długości.Brachylog (2), 6 bajtów, wyzwanie dotyczące postdatacji języka
Wypróbuj online!
Jak zwykle w przypadku Brachylog, jest to funkcja, a nie pełny program.
Wyjaśnienie
O ile mi wiadomo (to nie jest mój język, ale wydaje się mało prawdopodobny),
a
nie został dodany do Brachylog do tego wyzwania, ale przydaje się tutaj naprawdę. Używamy metody „odwróć i stwierdzamy, że się nie zmieniła”, aby stwierdzić, że znalezioną przez nas wartością jest palindrom.Jeśli chodzi o to, dlaczego powoduje to powstanie najkrótszego palindromu, na pierwszą kolejność oceny ma duży wpływ na kolejność oceny Prologa (a więc i Brachyloga). W tym przypadku jest to polecenie „odwrotne” i (podobnie jak większość operacji na liście) ustawia kolejność oceny, której celem jest zminimalizowanie rozmiaru wynikowej listy. Ponieważ jest to to samo, co rozmiar wyjścia, program szczęśliwie kończy przypadkiem minimalizację dokładnie właściwej rzeczy, co oznacza, że nie musiałem dodawać żadnych wyraźnych wskazówek.
źródło
a
- Adfix nie został dodany do tego wyzwania. Nie miałem dostępnego symbolu z dobrymi mnemonikami dla prefiksu i sufiksu, dlatego połączyłem oba w adfiks, który może pobierać indeksy dolne, aby wybierać prefiksy lub sufiksy tylko w razie potrzeby.Rubin, 76 + 2 = 78
Z flagami wiersza polecenia
-pl
(l
mogą nie być potrzebne w zależności od tego, jak robisz wprowadzanie danych), uruchomBiorąc pod uwagę ciąg „abaa”, generuje ciągi „cbca 0 acbc” i „acbc 0 cbca”, gdzie 0 to niedrukowalny znak z kodem ascii 0. Następnie usuwa jedną kopię najdłuższej powtarzającej się ramki 0, którą znajdzie w każdym, „a” w pierwszym i „cbc” w drugim, aby uzyskać dwa zamknięcia. Następnie wyświetla najkrótszy wynik.
Jedyną naprawdę dziwną rzeczą w kodzie golfowym jest to, że skraca ciągi w miejscu podczas sortowania, co możemy uniknąć, ponieważ
min_by
wykonuje blok tylko raz na porównywany element (zarówno dlatego, że jest to transformacja Schwartziana, jak i ponieważ są tylko dwa elementy do porównania).źródło
Python 3, 107 bajtów
Testować:
źródło
Haskell, 107 bajtów
Test:
źródło
J,
6662 bajtówCałkiem proste. Dwie sztuczki, których używam:
Prawe zamknięcie palindromowe to lewe zamknięcie palindromowe odwróconego łańcucha.
Znalezienie długości łańcucha o minimalnej długości i palindromity za pomocą wyrażenia min (is_palindrome / length).
Wypróbuj online tutaj.
źródło