땅딸막 한 회문


15

회문은 재미 있지만 다른 현 중 일부는 빠져 나가기 시작했습니다. 우리는이 끈들을 회문 덩어리의 회문 으로 나눠서 두툼한 회문 으로 바꿀 수 있습니다 .

예를 들어, 문자열 "abcabca"을 문자별로 읽는다면 회문이 아니지만, 우리는 그것을 청각 회문 으로 만드는 세 가지 방법이 있습니다 .

["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]

보시다시피 chunky palindromicness는 매우 포괄적 인 개념입니다. 모든 끈은 적어도 한 가지 방법으로 뭉친 회문으로 바뀔 수 있습니다.

직무

문자열을 입력으로 수신하고 회문 청크를 반환하는 프로그램 또는 함수를 작성하십시오 ( 즉, 회문 배열 인 파티션 수).

테스트 사례

 OUTPUT | INPUT
--------+---------------------------------------------
      1 | ""                                          
      1 | "a"                                         
      1 | "ab"                                        
      2 | "aa"                                        
      2 | "aaa"                                       
      3 | "abcabca"                                   
      4 | "abababab"                                  
     28 | "abcabcaabababababcabca"                    
      1 | "bbbbabababbbbababbbaaaaa"                  
     20 | "ababbaaaabababbbaaabbbaa"                  
      5 | "baaabaabababaababaaabbaab"                 
     62 | "bbaaababbabbabbbabaabaabb"                 
      2 | "a man a plan a canal panama"               
     25 | "ama nap lan aca nal pan ama"               
     93 | "SATOR   AREPO   TENET   OPERA   ROTAS"     
    976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
  28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

추가 규칙

  • 입력은 42 자 이하의 인쇄 가능한 ASCII 문자로 구성되며, 선택적으로 언어의 문자열 분리 문자 및 / 또는 줄 바꿈 문자로 둘러싸여 있다고 가정 할 수 있습니다.

  • 유효한 각 입력 문자열 에 대해 내 컴퓨터에서 코드가 1 분 이내에 완료되어야합니다 (Intel Core i7-3770, 16 GiB RAM, Fedora 21).

    적절한 알고리즘을 사용하면이 시간 제한을 쉽게 준수 할 수 있어야합니다. 그러나 입력 문자열의 모든 파티션을 반복 할 수는 없습니다.

  • 출력을 STDOUT으로 인쇄하기로 선택한 경우 단일 줄 바꿈이 이어질 수 있습니다.

  • 표준 규칙이 적용됩니다.

답변:


4

Pyth, 40 34 27 22 바이트

Lhsmy:bd_df!xb>TbS/lb2

온라인 통역사에서 사용해보십시오 .

초기 40 바이트 버전에서 크게 줄었습니다. FryAmTheEggman에게 총 6 바이트를 절약 한 유용한 연산자 (문서를 찾기가 어렵습니다!)를 지적 해 주셔서 감사합니다. 의 결과를 해석하여 저장 영리한 단일 바이트 데니스 덕분에 x- truthy / falsy 값보다는 인덱스로서 !xb>Tb가 아니라 q<bT>Tb.


작동 방식 :

의 하위 y문자열 b에서 재귀 적으로 호출 하여 문자열 청크를 결정 하는 함수 를 정의합니다 b. 함수는 Pyth에서 자동으로 메모되므로 재귀는 시간면에서 오버 헤드가 거의 없습니다.

L                              def y(b): return ___
                 S/lb2         The range [1,2,...,len(b)/2]
          f!xb>Tb              Filter n for which b[:n] == b[-n:]
   m                           Map each n in the list to...
    y:bd_d                     y(b[d:-d])       
 hs                            Take the sum and add one (implicit return)

예, Pyth를 배우는 대부분은 공동 / 시행 착오 / 렉서 읽기, 훨씬 더 골프를 잘칩니다! :)
FryAmTheEggman

1
1. 함수를 제출하여 2 바이트를 절약 할 수 있습니다. 로 전화 할 필요가 없습니다 yz. 2. 두 개의 맵과 필터 대신 단일 맵과 조건부 ( link )를 사용하여 3 바이트를 절약 할 수 있습니다 .
Dennis

2

CJam ( 41 39 바이트)

qM{_,2/,\f{\~_2$>@2$<@~)/(@=\M*j*}1b)}j

온라인 데모

이것은 각 "중앙"문자열에 대해 청키 한 회 문의 수를 찾는다는 의미에서 "열심하다"(즉, 원래 문자열의 양쪽 끝에서 동일한 수의 문자를 제거한 결과), 자동 메모리 사용을 사용하기 때문에 j연산자 각각은 한 번만 계산되어 매우 빠른 프로그램을 제공합니다 (메모되지 않은 구현에서 몇 개의 문자 저장).

1 바이트 절약을위한 Dennis에게 감사합니다.


1

Mathematica, 77 72 57 바이트

1+Tr[#0/@ReplaceList[#,{a__,b___,a__}:>{b}]]&@*Characters

1

펄, 86 바이트

84 바이트 코드 + 2 개 스위치

더 짧은 방법이 있지만 여기에 있습니다.

perl -lpe 'sub c{my($x,$i)=@_;$x=~/^(.{$i})(.*)\1$/&&c($2,0*++$s)while++$i<length$x}c$_;$_=++$s'

줄당 하나의 문자열 인 STDIN에서 입력을 가져옵니다.

Explanation : values의 1<=$i<length(input string)경우 정규식 /^(.{$i})(.*)\1$/을 사용 하여 왼쪽 및 오른쪽 청크를 가져오고 개수를 증가시킵니다. 그런 다음 문자열의 중앙 부분에 대해 반복적으로 동일하게 수행합니다.

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