Zszyj razem palindrom z podciągów palindromicznych

14

Biorąc pod uwagę ciąg l, znajdź wszystkie palindromiczna podciągi pz l(w tym duplikaty i pojedynczych ciągów znaków). Następnie przestaw wszystkie podłańcuchy w pprawidłowy palindrom (może być wiele poprawnych odpowiedzi). Jeśli nie można zmienić układu pna pojedynczy palindrom, program może mieć niezdefiniowane zachowanie (błąd, przepełnienie stosu, wychodzenie, zawieszenie / przedwczesne zabójstwo Johna Dvoraka itp.)


Przykłady

Ważne przypadki testowe

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

Nieprawidłowe przypadki testowe (niemożliwe)

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>

Zasady

  • Jeśli słowo wejściowe jest samym palindromem, zawsze będzie ważne jako wejście.
  • Należy zwrócić tylko jeden podciąg, który wybierzesz jest dowolny, o ile jest poprawny.
  • Jeśli dane wejściowe nie mają realnych wyników, kod może mieć niezdefiniowane zachowanie.
  • Dane wejściowe będą zawierać między znakami ASCII do wydruku 0x20-0x7E.
  • To jest , zwycięzcą jest najniższa liczba bajtów.
Urna Magicznej Ośmiornicy
źródło
1
Pierwszy proponowany wynik "abbccdd"jest błędny: dwie ostatnie litery powinny być "bb", nie "dd".
Fatalize
Czy możemy zwrócić tablicę podciągów zamiast jednego ciągu?
Kudłaty
Czy mogę wziąć listę znaków jako dane wejściowe?
alephalpha
1
Mówiąc, że zachowanie jest akceptowalne, masz na myśli powieszenie osoby, która wyraziła swój wkład?
John Dvorak
@JohnDvorak wyjaśnione.
Magic Octopus Urn

Odpowiedzi:

8

Brachylog , 10 bajtów

{s.↔}ᶠpc.↔

Wypróbuj online!

Nie działa (tzn. Drukuje false.), jeśli nie jest to możliwe.

Wyjaśnienie

{   }ᶠ         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
Fatalizować
źródło
3

Orzech kokosowy , 140 bajtów

s->p(map(''.join,permutations(p(v for k in n(s)for v in n(k[::-1])))))[0]
from itertools import*
n=scan$((+))
p=list..filter$(x->x==x[::-1])

Wypróbuj online!

ovs
źródło
3

JavaScript (ES6), 193 bajty

„Spójrz Ma, brak wbudowanej permutacji!”(Więc tak ... to długo ...)

Zwraca pustą tablicę, jeśli nie ma rozwiązania.

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

Próbny

W jaki sposób?

Podzielmy kod na mniejsze części.

Definiujemy P () , funkcję, która zwraca s, jeśli s jest palindromem, lub fałsz w przeciwnym razie.

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

Obliczamy wszystkie podciągi z ciągu wejściowego s . Za pomocą P () izolujemy niepuste palindromy i przechowujemy je w tablicy a .

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

Główną funkcją rekurencyjne f () wykonuje wejściu i obliczania wszystkich permutacji. Aktualizuje S , gdy sam permutację palindrom (raz połączone) i ewentualnie wraca do końcowej wartości 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
źródło
2

Galaretka , 13 bajtów

ŒḂÐf
ẆÇŒ!F€ÇḢ

Wypróbuj online!

Drukuje 0w niewłaściwej obudowie.

HyperNeutrino
źródło
2

05AB1E , 13 12 bajtów

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

Wypróbuj online!

-1 bajt dzięki Magicznej Ośmiornicy Urnie i Enigmie.

Kaldo
źródło
Jautomatycznie factorizes więc nie trzeba €Jpo prostu J; powinieneś także zwrócić jedną z palindromów, nie wszystkie. Wypróbuj online! obowiązuje dla tej samej liczby bajtów.
Magic Octopus Urn
@MagicOctopusUrn Naprawiono, dziękuję!
Kaldo
Ùćmoże być ¤(lub kilka innych opcji)
Emigna
@Emigna nie jestem pewien, dlaczego nie widziałem, że Ùnie było potrzebne.
Magic Octopus Urn
Enigma Mój zły, z nieznanego powodu myślałem, że powinniśmy wyświetlić wszystkie unikalne palindromy, stąd oryginalne. Dzięki za wskazówkę, naprawione!
Kaldo
2

Stax , 13 bajtów

绬►Ö∞j∞:Æ╘τδ

Uruchom przypadki testowe (na mojej bieżącej maszynie zajmuje to około 10 sekund)

Jest to odpowiednia reprezentacja ascii tego samego programu.

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

Nie jest to czysta brutalna siła, ale jest tak mała, jak napisana przeze mnie implementacja brutalnej siły. Ten spowodował awarię mojej przeglądarki po około 10 minutach. W każdym razie, oto jak to działa.

: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.
rekurencyjny
źródło
2

Rubin , 131 123 120 bajtów

->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}

Wypróbuj online!

Lambda przyjmuje łańcuch i zwraca łańcuch. Zwraca, nilgdy nie ma rozwiązania.

-5 bajtów Wymienić select{|t|l[t]}zselect(&l)

-3 bajtów Wymienić map{..}.flattenzflat_map{...}

-1 bajtów: Pętla na długości podciągu i początku podciągu, zamiast ponad podciągu i końcu podciągu

-2 bajty: zadeklaruj zprzy pierwszym użyciu zamiast wcześniej

->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
źródło
1

Pyth , 13 bajtów

h_I#sM.p_I#.:

Wypróbuj online!

-1 bajt dzięki Mr. Xcoder

HyperNeutrino
źródło
Lol Byłem tak pewien, że nikt inny nie korzysta z Pytha, że ​​przesłałem własną osobną odpowiedź (teraz usuniętą) przed zobaczeniem twojej. Możesz użyć h_I#sM.p_I#.:lub e_IDsM.p_I#.:dla 13 bajtów.
Pan Xcoder
@ Mr.Xcoder Oh haha: P tak, rzadko używam Pytha, nie wiem, dlaczego zdecydowałem się go użyć. Dzięki!
HyperNeutrino
1

Python 3 , 167 bajtów

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*

Wypróbuj online!

-2 bajty dzięki Mr. Xcoder

HyperNeutrino
źródło
Możesz użyć, a[i:j+1]jeśli for j in range(i,len(a))zamiast tego użyjesz , dla -2 bajtów.
Pan Xcoder
1

Japt , 19 bajtów

Utrudnione przez to, że Japt nie jest (jeszcze) w stanie uzyskać wszystkich podciągów łańcucha (a częściowo przez mój obecny poziom wyczerpania!).

Wyprowadza, undefinedjeśli nie ma rozwiązania.

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

Spróbuj


Wyjaśnienie

                        :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
Kudłaty
źródło
1
Czy twoje pytanie dotyczące listy podciągów można po prostu usunąć ¬z odpowiedzi: P?
Magic Octopus Urn
1
Myślałem, że mógłbym to usunąć, ale wtedy bym potrzebował, æ_¬êQaby i tak nie zaoszczędziłoby żadnych bajtów!
Kudłaty
Hahaha, od tego momentu będę uważał na twoje sposoby oszczędzania bajtów;). Próbowałem go usunąć sam, aby to sprawdzić, ale uświadomiłem sobie, że polecenia japt nie działają tak, jak myślę, że działają lol.
Magic Octopus Urn
1

Łuska , 12 bajtów

ḟS=↔mΣPfS=↔Q

Wypróbuj online!

Wyjaśnienie

ḟ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
źródło
0

J , 53 bajty

[:{:@(#~b"1)@(i.@!@#;@A.])@(#~(0<#*b=.]-:|.)&>)@,<\\.

Wypróbuj online!

Galen Iwanow
źródło