Генератор двостороннього паліндромного закриття


24

Вступ

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

Для цього виклику ми розглянемо двостороннє паліндромне закриття таке, що

  • Лівий паліндромний Закриття вхідного рядка - це найкоротший можливий паліндром, який починається з вхідного рядка.
  • Правий паліндромний Закриття вхідного рядка - це найкоротший можливий паліндром, який закінчується вхідним рядком.
  • Двостороннє паліндромне закриття вхідного рядка є коротшим від лівого або правого паліндромного закриття вхідного рядка.

Завдання

Ваше завдання просте. З огляду на рядок (що складається лише з друкованих ASCII, нових ліній та пробілів), виведіть двостороннє паліндромне закриття цього рядка. У разі зв`язку будь-якого лівого або правого паліндромного закриття є дійсним висновком.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції, або друкуючи результат в STDOUT (або найближчу альтернативу) або повертаючи його як рядок.

Можна припустити, що вхід ніколи не буде порожнім рядком.

Кілька прикладів:

<Input>   -> <Output>
"abcdef"  -> "abcdefedcba"  (or "fedcbabcdef")
"abcba"   -> "abcba"
"abcb"    -> "abcba"
"cbca"    -> "acbca"

Початкова ідея ідеї переходить до VisualMelon, остаточна ідея за допомогою Мартіна та Згарба

У цій статті вперше були використані і визначені терміни паліндромне закриття, лівопалліндромне закриття та правопаліндромне закриття .


1
Я хотів би бачити розчин паліндрому ...
ojdo

2
@ojdo Я думав додати це як бонус, але я впевнений, що більшість відповідей просто використали коментарі для створення паліндрому. Якщо якась відповідь справді може бути і паліндром, не покладаючись на коментарі, я б залишив за це відповідь!
Оптимізатор

Відповіді:


11

Піта, 22 19

hfq_TTsm,+z_d+_dzyz

Спробуйте в Інтернеті .

Пояснення

Двостороння паліндромна замикання має або форму, AXабо XAде Xвхідна рядок і Aє підрядком X. Я фактично повинен бути суміжним підрядком X, префіксом для однієї форми, суфіксом для іншої форми. Але я не переймаюся цими дефолтами. Підрядок (суміжний чи ні) - це все, що мені потрібно в Pyth.

                        Implicit: z = raw_input() // Read a string
                 yz     A list with all substrings (contiguous or not) of z
       m                For each of these substrings d, build
        ,                  a pair of two strings:
         +z_d              ( z + inveres(d) ,
             +_dz            inverse(d) + z )
      s                 Sum (put all created pairs into a list)
 fq_TT                  filter elements T, where inverse(T) == T (Palindrom)
h                          Take the first element

Редагувати

Стара версія впорядковувала рядки після фільтрації за довжиною .olN.... Щойно зрозумів, що yповертає підряди, упорядковані по довжині. Тож ці паліндроми вже відсортовані.


6

Кліп , 40

(sl`f[a=ava}+m[i+v+ixx}Rlxm[i+xvu0ix}Rlx

Приклад

Documents>java -jar Clip4.jar palindrome.clip
abcb
abcba

Пояснення

(sl`                                        .- The shortest                     -.
    f[a=ava}                                .- palindrome                       -.
            +                               .- among the following two sets:    -.
             m[i      }Rlx                  .- For each number up to length(x)  -.
                +                           .- combine                          -.
                 v+ix                       .- the last i chars of x, reversed  -.
                     x                      .- and x.                           -.
                          m[i       }Rlx    .- For each number up to length(x)  -.
                             +              .- combine                          -.
                              x             .- x and                            -.
                               vu0ix        .- the first i chars of x, reversed.-.

6

CJam, 30 байт

Дійсно сподівався побачити відповідь CJam до теперішнього часу .. Тож ось це іде: P

q:Q,{)QW%/(Q+Q@+s}%{,}${_W%=}=

Я дуже ненавиджу цей {,}$блок там, але я отримую не упорядкований список можливих паліндром через алгоритм генерації, який я використовую.

Пояснення коду

q:Q,{            }%             "Read the input string, store in Q, take length and";
                                "run the code block that many times";
     )QW%                       "Increment the iteration index and Put reversed Q on stack";
         /                      "Split reversed Q into parts of incremented iteration index";
          (Q+                   "Take out the first part and prepend it to Q";
             Q@+s               "Take the rest of the parts and append them to Q";
                   {,}$         "At this point, we have all possible prepended and appended";
                                "sequences of the input string. Sort them by length";
                       {_W%=}=  "Take the first sequence which is a palindrome";

Спробуйте його онлайн тут


6
Я теж ненавиджу цей {,}$блок там! Жартую, я поняття не маю, що робить CJam.
Олексій А.

4

Пітон 2, 115 113 109 105 96 байт

f=lambda x:[x for x in sum([[x[:~i:-1]+x,x+x[i::-1]]for i in range(len(x))],[])if x==x[::-1]][0]

Можемо, сподіваємось, гольф далі. Біти, можливо, варті уваги:

  • використовуючи суму для двох розумінь списку в одному
  • побудова термінів у відсортованому порядку, щоб уникнути потреби в хв (запропоновано @Jakube)

1
Елементи не впорядковані впорядкованому порядку, тому це не вдається для подібних рядків a.
Sp3000

4

Математика, 96 байт

Має бути більш елегантний спосіб, ніж цей ...

""<>#&@@SortBy[r=Reverse;#/.{b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}&/@{r@#,#}&@Characters@#,Length]&

Це визначає неназвану функцію, яка бере рядок і повертає результат.

Основна ідея - це

  • Розділіть рядок на Characters.
  • Створіть масив із цього списку та його зворотний бік.
  • Використовуйте відповідність шаблонів, щоб знайти правильну паліндромність кожного з них:

    {b___,a__/;r@{a}=={a}}:>{b,r@{b,a}}
    

    Зауважте, що це фактично не повертає плоский список. Наприклад, {a,b,c}ви отримаєте

    {a,b,{c,b,a}}
    
  • Сортуйте два результати за довжиною.

  • Виберіть коротший і приєднайте його назад до рядка ""<>#&@@.

Він видає, abacabaколи вхід є abac. Правильна відповідь cabac. Я думаю, вам слід розрівняти їх перед сортуванням за довжиною.
алефальфа

1
@alephalpha Знайшов краще виправлення, яке не вимагало зміни розміру коду (і я насправді мав намір не сортувати його).
Мартін Ендер

2

Брахілог (2), 6 байт, виклик після публікації мови

~{↔?a}

Спробуйте в Інтернеті!

Як зазвичай для Brachylog, це функція, а не повна програма.

Пояснення

~{↔?a}
~{   }   Find a value that produces {the input} upon doing the following:
  ↔        reversing it;
   ?       asserting that we still have the same value;
    a      and taking either a prefix, or a suffix.

Наскільки я знаю (це не моя мова, але це здається малоймовірним), aне був доданий до Брахілог для цього виклику, але він тут дуже корисний. Ми використовуємо метод "зворотний і стверджуємо, що він не змінився", щоб стверджувати, що знайдене нами значення - паліндром.

Що ж стосується того, чому це створює найкоротший паліндром, на порядок оцінки Пролога (а отже, і Брахілога) сильно впливає перше, що він оцінює. У цьому випадку це команда "зворотного", і (як і більшість операцій зі списком) вона встановлює порядок оцінки, спрямований на мінімізацію розміру списку, що виходить. Оскільки це точно так само, як і розмір виводу, програма щасливо закінчується мінімізуванням абсолютно правильної речі, тобто, мені не потрібно було додавати явних підказів.


a- Adfix не було додано для цього завдання. Я не мав доступного символу з хорошою мнемонікою для префікса та суфіксу, тому я об'єднав обидва в adfix, який може приймати підписки для вибору префіксів або суфіксів лише за потреби.
Фаталізувати

1

Рубі, 76 + 2 = 78

За допомогою прапорів командного рядка -pl( lможливо, вони не знадобляться в залежності від того, як ви робите дані), запустіть

$_=[[$_,r=$_.reverse]*"\0",r+"\0#$_"].min_by{|s|s.sub!(/(.*)\0\1/){$1}.size}

Даний рядок 'abaa', генерує рядки 'cbca 0 acbc' та 'acbc 0 cbca', де 0 - недрукований символ з кодом ascii 0. Потім він видаляє одну копію найдовшої повторюваної рядки, що обрамляє 0, яку вона знаходить у кожній, 'a' у першому та 'cbc' у другому, щоб отримати два закриття. Потім виводиться найкоротший результат.

Єдине дійсно дивне, що стосується коду гольфу, це те, що він скорочує рядки на місці, сортуючи їх, до чого ми можемо відійти, тому що min_byвиконується лише один раз за кожний елемент, який порівнюється (і тому, що це Шварцавська трансформація і тому, що є лише два елементи для порівняння).


1

Python 3, 107 байт


f=lambda a:[i for i in[a[:i:-1]*j+a+a[-1-i::-1]*(1-j)for i in range(len(a))for j in(0,1)]if i==i[::-1]][-1]

Перевіряти:

>>> print("\n".join(map(f, ["abcdef", "abcba", "abcb", "cbca"])))
abcdefedcba
abcba
abcba
acbca

1

Haskell, 107 байт

import Data.List
r=reverse
f s=snd$minimum[(length x,x)|x<-map(s++)(tails$r s)++map(++s)(inits$r s),x==r x]

Тест:

*Main> mapM_ (putStrLn.f) ["abcdef", "abcba", "abcb", "cbca"]
abcdefedcba
abcba
abcba
acbca

1

J, 66 62 байт

3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

Досить прямо. Два хитрощі, якими я користуюся:

Праве паліндромне замикання - ліве паліндромне закриття перевернутої струни.

Пошук довжини рядка з мінімальною довжиною і паліндромності з виразом min (is_palindrome / length).

   f=.3 :'>({~[:(i.>./)(#%~[-:|.)@>),(<@([,|.@{.~)"#:i.@#"1)y,:|.y'

   f 'lama'
lamal

Спробуйте його онлайн тут.

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