Сшиваем вместе палиндром из палиндромных нитей

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 уточнил.
Волшебная урна осьминога

Ответы:

8

Брахилог , 10 байт

{s.↔}ᶠpc.↔

Попробуйте онлайн!

Сбои (т.е. печатает false. ), если это невозможно.

объяснение

{   }ᶠ         Find all…
 s.              …substrings of the input…
  .↔             …which are their own reverse
      p        Take a permutation of this list of palindromes
       c.      The output is the concatenation of this permutation
        .↔     The output is its own reverse
Fatalize
источник
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 - палиндром, или false в противном случае.

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
Arnauld
источник
2

05AB1E , 13 12 байт

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

Попробуйте онлайн!

-1 байт благодаря Волшебной Урне Осьминога и Энигме.

Kaldo
источник
Jавтоматически факторизуется, поэтому вам не нужно €Jпросто J; Кроме того, вы должны вернуть один из палиндромов, а не все. Попробуйте онлайн! действителен для того же количества байтов.
Волшебная Урна Осьминога
@MagicOctopusUrn Исправлено, спасибо!
Кальдо
Ùćможет быть ¤(или ряд других вариантов)
Emigna
@ Emigna не уверена, почему я не видела, что в Ùэтом не было необходимости.
Волшебная Урна Осьминога
Загадка Мой плохой, по неизвестной причине я думал, что мы должны были показать все уникальные палиндромы, следовательно, оригинал Ù. Спасибо за совет, исправлено!
Кальдо
2

Stax , 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
}
benj2240
источник
1

Pyth , 13 байт

h_I#sM.p_I#.:

Попробуйте онлайн!

-1 байт благодаря мистеру Xcoder

HyperNeutrino
источник
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

HyperNeutrino
источник
Вы можете использовать, a[i:j+1]если затем используете for j in range(i,len(a))вместо -2 байт.
мистер Xcoder
1

Japt , 19 байт

Помешанный Яптом (пока) не получить все подстроки строки (и частично из-за моих текущих уровней истощения!).

Выводы, 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чтобы это не спасло бы байты в любом случае!
Shaggy
Хахаха, я позабочусь о том, чтобы с осторожностью относиться к твоим способам сохранения байтов;). Я попытался удалить его сам, чтобы проверить, но понял, что команды japt не работают, как я думаю, что они работают, lol.
Волшебная Урна Осьминога
1

Шелуха , 12 байт

ḟS=↔mΣPfS=↔Q

Попробуйте онлайн!

объяснение

ḟS=↔mΣPfS=↔Q  Implicit input, a string.
           Q  List of substrings.
       f      Keep those
        S=↔   that are palindromic (equal to their reversal).
      P       Permutations of this list.
    mΣ        Flatten each.
ḟ             Find an element
 S=↔          that is palindromic.
Zgarb
источник