Зшийте разом паліндром з паліндромних підрядів


14

Отримуючи рядок l, знайти всі паліндромний подстроку pз l( в тому числі дублікатів та окремих рядків символів). Далі переставіть усі підрядки у pдійсний паліндром (може бути кілька правильних відповідей). Якщо неможливо переставити pв єдиний паліндром, у вашій програмі може бути невизначена поведінка (помилка, переповнення стека, вихід, повішення / несвоєчасне вбивство Джона Дворака тощо).


Приклади

Дійсні тестові випадки

l = anaa
p = ['a', 'n', 'a', 'a', 'aa', 'ana']
result = anaaaaana or aanaaanaa or aaananaaa

l = 1213235
p = ['1', '2', '1', '3', '2', '3', '5', '121', '323']
result = 1213235323121

l = racecar
p = ['r', 'a', 'c', 'e', 'c', 'a', 'r', 'cec', 'aceca', 'racecar']
result = racecarcecaacecracecar (there are others)

l = 11233
p = ['1', '11', '1', '2', '3', '33', '3']
result = 113323311 or 331121133

l = abbccdd
p = ['a', 'b', 'bb', 'b', 'c', 'cc', 'c', 'd', 'dd', 'd']
result = bbccddaddccbb or ccbbddaddbbcc or (etc...)

l = a
p = ['a']
result = a

Недійсні випробування (не можливі)

l = 123456789
p = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
result = <not possible, behavior undefined>

l = hjjkl
p = ['h', 'j', 'jj', 'j', 'k', 'l']
result = <not possible, behavior undefined>

l = xjmjj
p = ['x', 'j', 'jmj', 'm', 'j', 'jj', 'j']
result = <not possible, behavior undefined>

Правила

  • Якщо слово введення є самим паліндром, воно завжди буде дійсним як введення.
  • Повертається лише одна підрядка, яку ви обрали довільно, доки вона дійсна.
  • Якщо вхід не має життєздатного виводу, у вашого коду може бути невизначена поведінка.
  • Вхідні дані містять лише символи ASCII для друку між ними 0x20-0x7E.
  • Це , найнижчий байт - переможець.

1
Перший запропонований результат для "abbccdd"помилковий: два останні букви мають бути "bb", ні "dd".
Фаталізувати

Чи можемо ми повернути масив підрядів, а не один рядок?
Кудлатий

Чи можу я взяти список символів як вхідний?
алефальфа

1
Висячи прийнятну поведінку, ви маєте на увазі повісити людину, яка дала йому внесок?
Джон Дворак

@JohnDvorak уточнив.
Чарівний восьминіг Урна

Відповіді:




3

JavaScript (ES6), 193 байт

"Дивись Ма, ніякої вбудованої перестановки!"(Так так ... це довго ...)

Повертає порожній масив, якщо немає рішення.

f=(s,a=[].concat(...[...s].map((_,i,a)=>a.map((_,j)=>s.slice(i,j+1)))).filter(P=s=>[...s].reverse().join``==s&&s),m=S=[])=>S=a.map((_,i)=>f(s,b=[...a],[...m,b.splice(i,1)]))>''?S:P(m.join``)||S

Демо

Як?

Розбиймо код на більш дрібні частини.

Ми визначимо P () , функцію, яка повертає s, якщо s - паліндром, або помилково інакше.

P = s => [...s].reverse().join`` == s && s

Ми обчислюємо всі підрядки вхідного рядка s . Використовуючи P () , ми виділяємо не порожні паліндрами і зберігаємо їх у масиві a .

a = [].concat(...[...s].map((_, i, a) => a.map((_, j) => s.slice(i, j + 1)))).filter(P)

Основна рекурсивна функція F () приймає в якості вхідних даних і обчислити всю його перестановку. Він оновлює S щоразу , коли сама перестановка паліндром (один раз приєднався), і в кінці кінців повертається остаточне значення S .

f = (                        // given:
  a,                         //   a[] = input array
  m = S = []                 //   m[] = current permutation of a[]
) =>                         //   and S initialized to []
  S = a.map((_, i) =>        // for each element at position i in a[]:
    f(                       //   do a recursive call with:
      b = [...a],            //     b[] = copy of a[] without the i-th element
      [...m, b.splice(i, 1)] //     the element extracted from a[] added to m[]
    )                        //   end of recursive call
  ) > '' ?                   // if a[] was not empty:
    S                        //   let S unchanged
  :                          // else:
    P(m.join``) || S         //   update S to m.join('') if it's a palindrome


2

05AB1E , 13 12 байт

ŒʒÂQ}œJʒÂQ}¤

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

-1 байт завдяки магічній урній та енігмі.


Jавтоматично фактуризує, так що вам не потрібно €Jпросто J; Крім того, ви повинні повернути один із паліндромів, не все. Спробуйте в Інтернеті! дійсний для одного і того ж підрахунку байтів.
Чарівний восьминога Урна

@MagicOctopusUrn Виправлено, дякую!
Калдо

Ùćможе бути ¤(або ряд інших варіантів)
Emigna

@Emigna не впевнений, чому я не бачив Ùпотрібного.
Чарівний восьминіг Урна

Енігма Моя погана, з невідомих причин я подумав, що ми повинні відобразити всі унікальні паліндроми, звідси оригінальний Ù. Дякую за пораду, виправлено!
Калдо

2

Стакс , 13 байт

绬►Ö∞j∞:Æ╘τδ

Запустити тестові справи (на моїй нинішній машині це займає близько 10 секунд)

Це відповідне представлення ascii тієї самої програми.

:e{cr=fw|Nc$cr=!

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

:e                  Get all contiguous substrings
  {cr=f             Keep only those that are palindromes
       w            Run the rest of the program repeatedly while a truth value is produced.
        |N          Get the next permutation.
          c$        Copy and flatten the permutation.
            cr=!    Test if it's palindrome.  If not, repeat.
                    The last permutation produced will be implicitly printed.

2

Рубі , 131 123 120 байт

->s{m=->t{t==t.reverse}
(1..z=s.size).flat_map{|l|(0..z-l).map{|i|s[i,l]}}.select(&m).permutation.map(&:join).detect &m}

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

Лямбда, що приймає рядок і повертає рядок. Повертається, nilколи рішення не існує.

-5 байт: Замініть select{|t|l[t]}наselect(&l)

-3 байти: Замініть map{..}.flattenнаflat_map{...}

-1 байт: переведіть цикл на довжину підрядки та початок підрядки замість початку та підрядки підрядки

-2 байти: zзаздалегідь оголосити замість цього

->s{
  l=->t{t==t.reverse}        # Lambda to test for palindromes
  (1..z=s.size).flat_map{|l| # For each substring length
    (0..z-l).map{|i|         # For each substring start index
      s[i,l]                 # Take the substring
    }
  }                          # flat_map flattens the list of lists of substrings
  .select(&l)                # Filter to include only palindromic substrings
  .permutation               # Take all orderings of substrings
  .map(&:join)               # Flatten each substring ordering into a string
  .detect &l                 # Find the first palindrome
}

1

Pyth , 13 байт

h_I#sM.p_I#.:

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

-1 байт завдяки спадару Xcoder


Lol Я був настільки впевнений, що ніхто більше не використовує Pyth, що я подав власну окрему відповідь (тепер видалено), перш ніж побачити вашу. Ви можете використовувати h_I#sM.p_I#.:або e_IDsM.p_I#.:для 13 байт.
Містер Xcoder

@ Mr.Xcoder О-ха-ха: P Так, я навряд чи коли-небудь використовую Pyth, не знаю, чому я вирішив його використовувати. Спасибі!
HyperNeutrino

1

Python 3 , 167 байт

lambda a:g(sum(k,[])for k in permutations(g(a[i:j+1]for i in range(len(a))for j in range(i,len(a)))))[0]
g=lambda k:[e for e in k if e==e[::-1]]
from itertools import*

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

-2 байти завдяки панові Xcoder


Ви можете використовувати, a[i:j+1]якщо потім використовувати for j in range(i,len(a))замість цього, для -2 байт.
Містер Xcoder

1

Japt , 19 байт

Перешкодила, що Japt ще не змогла отримати всі підрядки рядка (і частково за моїми поточними рівнями виснаження!).

Виходи, undefinedякщо немає рішення.

Êõ@ãX fêQÃc á m¬æêQ

Спробуй це


Пояснення

                        :Implicit input of string U
Ê                       :Length of U
 õ                      :Range [1,Ê]
  @      Ã              :Pass each X through a function
   ãX                   :  Substrings of U of length X
      f                 :  Filter
       êQ               :    Is it a palindrome?
          c             :Flatten
            á           :Permutations
              m         :Map
               ¬        :  Join to a string
                æêQ     :Get first element that is a palindrome

1
Ваше питання про список підрядків просто видалити ¬зі своєї відповіді: P?
Чарівний восьминога Урна

1
Думав, що я можу видалити, але тоді мені знадобилося б, æ_¬êQтак що це не зберегло б жодного байта!
Кудлатий

Ха-ха-ха, я відтепер буду насторожено ваших способів збереження байтів;). Я спробував видалити його сам, щоб перевірити, але зрозумів, що команди japt не працюють так, як я думаю, вони працюють лол.
Чарівний восьминіг Урна


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