태그 보관물: palindrome

palindrome

현을 팰 린팅 올바른 위치가

소개

모르는 사람들에게 회문은 문자열이 문자열과 거꾸로 같을 때입니다 (구멍 뚫기, 공백 등 제외). 회 문의 예는 다음과 같습니다.

abcdcba

이것을 뒤집 으면 다음과 같이 끝납니다.

abcdcba

어느 것도 동일합니다. 그러므로 우리는 이것을 회문이라고 부릅니다. 일을 귀찮게하기 위해 문자열의 예를 살펴 보겠습니다.

adbcb

이것은 회문이 아닙니다. 이것을 palindromize하기 위해, 우리는 반전 된 문자열을 초기 문자열 의 오른쪽에있는 초기 문자열 에 병합하여 두 버전을 그대로 유지해야합니다. 짧을수록 좋습니다.

가장 먼저 시도 할 수있는 것은 다음과 같습니다.

adbcb
bcbda
^^ ^^

모든 문자가 일치하는 것은 아니므로 반전 된 문자열의 올바른 위치가 아닙니다. 우리는 오른쪽으로 한 걸음갑니다 :

adbcb
 bcbda
 ^^^^

이것은 또한 모든 문자와 일치하지 않습니다. 우리는 오른쪽으로 또 다른 단계를 밟습니다.

adbcb
  bcbda

이번에는 모든 문자가 일치 합니다. 우리는 할 수 있습니다 병합 두 문자열 그대로를 떠나는 . 최종 결과는 다음과 같습니다.

adbcbda

이것은 palindromized 문자열 입니다.


작업

소문자 만 포함 된 문자열 (적어도 하나의 문자가있는 문자열) (또는 더 적합한 경우 대문자)이 제공되면 palindromized string을 출력하십시오 .


테스트 사례

Input     Output

abcb      abcba
hello     hellolleh
bonobo    bonobonob
radar     radar
hex       hexeh

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!



답변

젤리, 11 10 바이트

ṫỤfU$Ḣœ^;U

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

작동 원리

ṫỤfU$Ḣœ^;U  Main link. Argument: s (string)

 Ụ          Yield all indices of s, sorted by their corr. character values.
ṫ           Tail; for each index n, remove all characters before thr nth.
            This yields the list of suffixes of s, sorted by their first character,
            then (in descending order) by length.
    $       Combine the two links to the left into a chain:
   U        Upend; reverse all suffixes.
  f         Filter; only keep suffixes that are also reversed suffixes.
            This gives the list of all palindromic suffixes. Since all of them
            start with the same letter, they are sorted by length.
     Ḣ      Head; select the first, longest palindromic suffix.
      œ^    Multiset symmetric difference; chop the selected suffix from s.
         U  Upend; yield s, reversed.
        ;   Concatenate the results to the left and to the right.

답변

Pyth (커밋 b93a874), 11 바이트

.VkI_IJ+zbB

테스트 스위트

이 코드는 현재 버전의 Pyth, commit b93a874 의 버그를 이용합니다 . 버그는 _IJ+zb마치 Pyth의 설계 의도에 따라와 같이 구문 분석되어야 할 때 q_J+zbJ+zb와 동일 _I+zb+zb하게 구문 분석되며 q_J+zbJ이는에 해당합니다 _I+zb. 이렇게하면 버그를 수정 한 후 바이트를 저장할 수 있습니다 .VkI_IJ+zbJB. 버그가 수정되면 올바른 코드가됩니다 . 대신 그 코드를 설명하겠습니다.

기본적으로 코드 무차별은 입력에 추가되어 회문을 형성하고 결합 된 문자열을 출력 할 수있는 가장 짧은 문자열을 찾을 때까지 가능한 모든 문자열을 강제 실행합니다.

.VkI_IJ+zbJB
                z = input()
.Vk             For b in possible strings ordered by length,
       +zb      Add z and b,
      J         Store it in J,
    _I          Check if the result is a palindrome,
   I            If so,
          J     Print J (This line doesn't actually exist, gets added by the bug.
          B     Break.

답변

파이썬, 46 바이트

f=lambda s:s*(s==s[::-1])or s[0]+f(s[1:])+s[0]

끈이 회 문인 경우 반환하십시오. 그렇지 않으면, 나머지 문자열에 대해 첫 번째 문자를 재귀 결과 주위에 끼 웁니다.

고장 예 :

f(bonobo)
b  f(onobo) b
b o f(nobo) o b
b o n f(obo) n o b
b o n obo n o b

답변

하스켈, 36 바이트

f s|s==reverse s=s|h:t<-s=h:f t++[h]

더 읽기 쉽게 :

f s
 |s==reverse s = s
 |(h:t)<-s     = h:(f t)++[h]

끈이 회 문인 경우 반환하십시오. 그렇지 않으면 문자열의 꼬리에 대한 첫 번째 문자를 재귀 결과 주위에 끼 웁니다.

스트링 sh:t두 번째 가드에서 분리 되어이 경우 필러가 1>0필요하지 않습니다. 이것은 s@(h:t)입력 보다 짧습니다 .


답변

Pyth- 16 12 바이트

@FryAmTheEggman 덕분에 4 바이트가 절약되었습니다.

FGITW, 많은 골프 가능.

h_I#+R_Q+k._

테스트 스위트 .


답변

Brachylog , 16 6 5 바이트 (비경쟁)

:Ac.r

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

초기 답변을 게시했을 때 여전히 Java의 이전 구현에있었습니다. Prolog에서 모든 것을 다시 프로그래밍했기 때문에 이제는 처음부터 그대로 작동합니다.

설명

(?):Ac.        Output is the concatenation of Input with another unknown string A
      .r(.)    The reverse of the Output is the Output

역 전파를 사용하면 첫 번째 유효한 값 A이 입력에 연결되어 회문으로 만들 수있는 가장 짧은 값 이됩니다.

대체 솔루션, 5 바이트

~@[.r

이것은 “출력은 입력을 문자열과 연결하는 것”을 말하는 대신 “출력은 A입력이 출력의 접두사 인 문자열 ” 이라는 것을 제외하고는 위의 답변과 거의 동일합니다 .


답변

자바 스크립트 (ES6), 92 바이트

(s,a=[...s],r=a.reverse().join``)=>s.slice(0,a.findIndex((_,i)=>r.startsWith(s.slice(i))))+r

원래 문자열과 반전 사이의 겹침을 계산하고 슬라이스합니다.