회문 하위 문자열에서 회문 연결


14

문자열을 감안할 때 l, 모든 상동 문자열 찾기 pl(를 포함하여 중복 및 단일 문자열을). 그런 다음 모든 하위 문자열을 p유효한 회문으로 다시 정렬하십시오 (여러 정답이있을 수 있음). p단일 회문 으로 재 배열 할 수없는 경우 프로그램에 정의되지 않은 동작 (오류, 스택 오버플로, 종료, John Dvorak의 중단 / 때때하지 않은 살인 등)이있을 수 있습니다.


유효한 테스트 사례

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"합니다.
페이탈 라이즈

단일 문자열이 아닌 하위 문자열 배열을 반환 할 수 있습니까?
얽히고 설킨

문자 목록을 입력으로 사용할 수 있습니까?
alephalpha

1
허용되는 행동을 행한다는 것은 입력을 한 사람을 행하는 것을 의미합니까?
존 드보락

@JohnDvorak가 명확 해졌습니다.
Magic Octopus Urn

답변:


8

Brachylog , 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


3

자바 스크립트 (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를 , 함수가 반환 경우 의가 회문, 또는 거짓 그렇지.

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

온라인으로 사용해보십시오!

Magic Octopus Urn 및 Enigma 덕분에 -1 바이트.


J당신이 필요하지 않도록 자동으로 factorizes €J단지 J; 또한 회문 중 하나를 반환해야합니다. 온라인으로 사용해보십시오! 동일한 바이트 수에 유효합니다.
매직 문어 Urn

@MagicOctopusUrn 고정, 감사합니다!
Kaldo

Ùć될 수 있습니다 ¤(또는 여러 가지 다른 옵션)
Emigna

@Emigna는 왜 내가 필요하지 않은지 알지 못했습니다 Ù.
Magic Octopus Urn

수수께끼 내 나쁜, 알 수없는 이유로 나는 우리가 모든 독특한 회문을 표시해야한다고 생각했기 때문에 원래의 Ù. 팁 주셔서 감사합니다, 고정!
Kaldo

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{..}.flattenflat_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#.:

온라인으로 사용해보십시오!

Mr. Xcoder 덕분에 -1 바이트


Lol 나는 아무도 Pyth를 사용하여 아무도 당신의 것을보기 전에 별도의 답변을 제출했다는 것을 확신했습니다. h_I#sM.p_I#.:또는 e_IDsM.p_I#.:13 바이트를 사용할 수 있습니다 .
Mr. Xcoder

@ Mr.Xcoder Oh haha ​​: P 그래 Pyth를 거의 사용하지 않습니다. 왜 그것을 사용하기로 결정했는지 모르겠습니다. 감사!
HyperNeutrino


1

apt , 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입니까?
Magic Octopus Urn

1
내가 제거 할 수 있다고 생각 했지만 æ_¬êQ어쨌든 바이트를 저장하지 않았을 것입니다.
얽히고 설킨

하하, 지금부터 바이트 절약 방법에주의를 기울일 것입니다.). 확인하기 위해 직접 제거하려고 시도했지만 japt 명령이 작동한다고 생각하는 것처럼 작동하지 않습니다.
매직 문어 Urn

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.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.