"하위 회문"찾기.


24

문자열의 모든 고유 한 "하위 팔린 드롬" 을 찾는 가장 짧은 코드입니다 .

예. 1

input: "12131331"
output: "33", "121", "131", "313", "1331"

예 .2

input: "3333"
output: "33", "333", "3333"

1
문자열이 자체 하위 회문이 될 수 있습니까? 문자열은 자체 하위 문자열이므로
JPvdMerwe

@JPvdMerwe : 물론입니다.
Eelvex

실제로 더 중요한 것은 무엇을 출력해야 333하는가? 순진 당신은 인쇄 끝장 33두 번
JPvdMerwe

@JPvdMerwe : '333'-> '33', '333'. 그에 따라 질문을 편집하겠습니다. 감사.
Eelvex

출력은 어떻게 지정됩니까? 따옴표로 쉼표로 구분하면 여기에 설명 된 것처럼 각 하위 회문이 있습니다. 한 줄에 하나의 하위 p?
Joey

답변:


11

J, 24 31 40

~.(#~(1<#*]-:|.)&>),<\\.

샘플 사용 :

   ~.(#~(1<#*]-:|.)&>),<\\. '12131331'
┌───┬───┬───┬────┬──┐
│121│131│313│1331│33│
└───┴───┴───┴────┴──┘
   ~.(#~(1<#*]-:|.)&>),<\\. '3333'
┌──┬───┬────┐
│33│333│3333│
└──┴───┴────┘

가져 가세요, GolfScript!


인정, 당신은 /dev/random여기에서 덤프를 넣어 우리를 속이는 ;-)
Joey

@Joey 스스로 시도해보십시오 .p (TBH, 처음에는 작동하지 않는다고 생각했습니다)
JB

실제 코드임을 확신합니다. 주말에 J를 머리로 감싸려고 노력했지만 비참하게 실패했습니다. 여전히 코드를 인식하고 있습니다. 나는 그것이 무엇인지 이해하지 못한다 ;-)
Joey

2
~.(#~(1<#*]-:|.)&>),<\\.문자 를 (24 자) 로 줄일 수 없습니까 ?
ephemient

@ephemient 그것은 실제로 않습니다. ( "답변은 기능이어야 함"사고 방식에 갇혀있는 것처럼 보입니다. 여기에는 해당되지 않습니다.) 편집했습니다. 감사합니다!
JB

7

파이썬 124

r=raw_input()
l=range(len(r))
print', '.join(set('"'+r[i:j+1]+'"'for i in l for j in l if i<j and r[i:j+1]==r[i:j+1][::-1]))

5

하스켈 98, 88 91 96

import List
main=interact$show.filter(\x->length x>1&&x==reverse x).nub.(tails=<<).inits

3

파이썬 - 138 (136)

이 코드는 하위 회문을 복제하지 않습니다.

r=raw_input()
i,l=0,len(r)
j=l
a=[]
while i<l-1:
 t=r[i:j];j-=1
 if t==t[::-1]:a+=['"'+t+'"']
 if j<i+2:i+=1;j=l
print", ".join(set(a))

1
변경 '"'+t+'"'하기 위해 t이 작은 따옴표를 사용하지만, 일부 공간을 절약 할 수 있습니다.
Thomas O

3

루비 -126102 97 자

s=gets
*m=*0..s.size
puts m.product(m).map{|h,j|(c=s[h,j+1]).size>1&&c==c.reverse ? c:0}.uniq-[0]

3

골프 스크립트, 48 자

subpalindrome.gs

{,}{(;}/{{,}{);}/}%{+}*{.,1>\.-1%=*},.&{`}%", "*

용법:

echo "12131331" | ruby golfscript.rb subpalindrome.gs

첫 번째 작업 {,}{(;}/은 문자열을 후행 하위 문자열 목록으로 바꿉니다. 그런 다음 유사한 선행 부분 문자열 변환이 결과 위에 매핑됩니다. 그런 다음으로 평면화 {+}*하고 술어를 사용하여 회문을 필터링하고으로 .,1>\.-1%=*고유 한 값을 잡고 .&예쁜 인쇄를합니다.

후행 하위 문자열 변환을 블록으로 추출하고 각 후행 하위 문자열을 반전시킨 후 선행 하위 문자열을 대체하는 것으로 재사용하는 것이 더 깔끔하지만, 그렇게하는 간결한 방법을 알아낼 수는 없습니다.


2

하스켈 -170 , 153

import Data.List
import Data.Set
p a=fromList$[show x|x<-subsequences a,x==reverse x,length x>1]
main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)

교체 main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)와 함께 main=getLine>>=putStrLn.intercalate", ".toList.p. 나는 또한 그 부름을 p몸으로 대체 할 것이다 .
Yasir Arsanukaev

부분 문자열 / = subsequences! 프로그램은 예 1과 같은 참조 출력보다 많은 하위 회문을보고합니다 (예 : "1111")
JB

2

J, 48

f=:,@:".
h=:\\.
~.(#~10&<)((]h-:"0&f|.h)#[:f]h)

예 :

~.(#~10&<)((]h-:"0&f|.h)#[:f]h) '12131331'
121 131 313 1331 33

2

프롤로그, 92

f(S,P):-append([_,X,_],S),X=[_,_|_],reverse(X,X),atom_codes(P,X).
p(S,R):-setof(P,f(S,P),R).

샘플 사용 :

?- p("12131331",R).
R = ['121', '131', '1331', '313', '33'].

?- p("3333",R).
R = ['33', '333', '3333'].

2

Windows PowerShell을 104 109 111

0..($l=($s="$input").length-1)|%{($a=$_)..$l|%{-join$s[$a..$_]}}|sort -u|?{$_[1]-and$_-eq-join$_[$l..0]}

이것은 stdin에 대한 입력을 예상하고 stdout에서 줄 당 하나씩 발견 된 모든 회문을 던질 것입니다.

PS Home:\SVN\Joey\Public\SO\CG183> '12131331'| .\subp.ps1
33
121
131
313
1331

(에서 실행하면 cmd그것은된다 echo 12131331|powershell -file subp.ps1- 그것은 단지의 $input스크립트 호출 방법에 따라 약간 다른 의미를 걸리지 만 그냥 대화 형 표준 입력 할 수 있습니다.)

2011-01-30 13:57 (111) – 첫 번째 시도.

2011-01-30 13:59 (109) – 인라인 변수 선언.

2011-06-02 13:18 (104) – 호출하는 대신 char 배열에 참여하여 부분 문자열 찾기를 다시 수행 .Substring()하고 조금 더 인라인했습니다.


2

문 78

{a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}

용법

q){a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}"12131331"
"121"
"131"
"313"
"1331"
"33"
q){a::x;(?)(,/)b@'(&:')({x~(|:)x}'')b:-1_1_'({(sublist[;a]')x,'1+c}')c::(!)(#)a}"3333"
"33"
"333"
"3333"

2

망막 , 34 27 바이트

&@!`(.)+.?(?<-1>\1)+(?(1)^)

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

테스트 스위트 M는 테스트 케이스 사이에 빈 줄을 삽입하기 위해 다른 단계가 뒤 따르기 때문에 필요합니다 .

설명

&@!`(.)+.?(?<-1>\1)+(?(1)^)

정규식과 일치하는 !모든 고유 ( @), 겹침 ( &)을 인쇄 합니다 (.)+.?(?<-1>\1)+(?(1)^). 이것은 균형 그룹을 사용하여 길이 2 이상의 회문과 일치합니다. "겹치는 모든 경기"부분에는 경고가 있습니다. 시작 위치 당 최대 하나의 경기를 얻을 수 있습니다. 그러나 길이가 다른 두 개의 회문이 같은 위치에서 시작하면 긴 회 문의 끝에 짧은 회문이 다시 나타납니다. +우선 순위 의 욕심이 더 길어 지므로 우리는 어쨌든 모든 회문을 얻습니다.


2

05AB1E , 11 10 바이트

ŒÙʒÂQ}žQSK

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



@scottinet는 싱글에 실패, EG1234142141410010101000
Magic Octopus Urn

1
당신도 마찬가지지만 같은 방식은 아닙니다. o_O 조사가 필요한 일이 있습니다. 그 동안, 여기에 작동하는 10 바이트 버전 이 있습니다
scottinet

단일화 관련 버그가있었습니다. 수정했습니다. 이제 11 바이트 응답과 9 바이트 하나의 작업 :-)
scottinet

@scottinet로 변경 1›하면 10 바이트는 9 바이트가 될 수 있습니다 . :)
Kevin Cruijssen

1

펄, 112

$_=<>;chop;s/./$&$' /g;
map{/../&&$_ eq reverse&&$h{$_}++}split/ /
  for grep{s/./$`$& /g}split/ /;
print for keys %h

1

JavaScript (ES6), 120 바이트

a=>{for(b=0,c=d=a.length,e=[];b<d;--c<b+2?(b++,c=d):1)(f=a.slice(b,c))==f.split``.reverse().join``&&e.push(f);return e}

이 함수는 문자열을 입력으로 받아서 배열을 출력합니다.


1

클로저, 81 바이트

#(set(for[i(range 2(+(count %)1))p(partition i 1 %):when(=(reverse p)(seq p))]p))

for여기에 완벽하게 일치가 :) 사용할 수 있었다 :when(=(reverse p)p)입력이 회문으로 간주하지 않았다 문자 또는 전체 문자열의 목록 인 경우 그 경우 실제로의 최대 범위 i가 될 수 (count %)도 있습니다.

참고로 가장 컴팩트 한 케이스 :

#(set(for[i(range 2(count %))p(partition i 1 %):when(=(reverse p)p)]p))

1

파이썬 83 개 102 문자

s=lambda t:(t[1:]or())and(t,)*(t==t[::-1])+s(t[1:])+s(t[:-1])
print set(s(input()))

문구 (t[1:]or())and...(...)if t[1:]else()하나의 문자와 동일하며 하나의 문자를 저장합니다! 저축을 감안할 때 나는 이것을 자랑스럽게 생각합니다.

예:

python x
"51112232211161"
set(['11', '22', '11122322111', '161', '111', '112232211', '1223221', '22322', '232'])

1

스칼라 127

object p extends App{val s=args(0);print(2.to(s.size).flatMap(s.sliding(_).toSeq.filter(c=>c==c.reverse)).toSet.mkString(" "))}

다른 스칼라 답변과 비교하여 사과를 사과 대 사과로 유지하기 위해 App을 확장하는 객체를 만들었습니다. 입력 문자열을 수동으로 반복하고 하위 문자열을 사용하는 대신 슬라이딩 ()을 활용하여 모든 하위 문자열 시퀀스를 만들었습니다.


1

스칼라 156 170

object o extends App{val l=args(0).length-2;val r=for(i<-0 to l;j<-i to l;c=args(0).substring(i,j+2);if(c==c.reverse))yield c;print(r.toSet.mkString(" "))}

object o{def main(s:Array[String]){val l=s(0).length-2;val r=for(i<-0 to l;j<-i to l;c=s(0).substring(i,j+2);if(c==c.reverse)) yield c;println(r.distinct.mkString(" "))}}


없음 빈 수율 전에 앱을 확장하는 대신 주,에 println => 인쇄 및 독특한 => toSet 덮어 쓰기 : 안녕하세요 Lalith, 나는 약간의 코드를 단축
사용자 알 수없는

1

펄 6 ,  35  32 바이트

{unique m:ex/(.+).?<{$0.flip}>/}

그것을 테스트

{set m:ex/(.+).?<{$0.flip}>/}

그것을 테스트

넓히는:

{  # bare block lambda with implicit parameter 「$_」

  set             # turn into a Set object (ignores duplicates)

  \             # stringify 「~」 all of these 「«」 (possibly in parrallel)
                  # otherwise it would be a sequence of Match objects

  m               # match
  :exhaustive     # in every way possible
  /
    ( .+ )        # at least one character 「$0」
    .?            # possibly another character (for odd sized sub-palindromes)
    <{ $0.flip }> # match the reverse of the first grouping
  /
}



1

APL (Dyalog Classic) , 27 바이트

{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/1↓⍳∘≢,/¨⊂)

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

{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/1↓⍳∘≢,/¨⊂)    Monadic train:
                                Enclose the input, '12131331'
                     ⍳∘≢          Range from 1 to length of input
                     ⍳∘≢,/¨⊂      List of list of substrings of each length
                   1            Remove the first list (length-1 substrings)
                ,/              Put the rest of the substrings into a single list.
{∪⍵/⍨≡∘⌽¨⍨⍵}                   To the result, apply this function which
                                   keeps all palindromes from a list:
      ≡∘⌽¨⍨⍵                    Boolean value of whether each (¨) string in argument
      ≡∘⌽                      is equal to its own reverse

  ⍵/⍨                           Replicate (filter) argument by those values.
                                 This yields the length >1 palindromes.
                                Remove duplicates from the list of palindromes.

OP가 "코드"를 호출하기 때문에 스 니펫 ∪w/⍨≡∘⌽¨⍨w←⊃,/1↓(⍳∘≢,/¨⊂)이 유효합니다.
Adám

@ Adám 현대 사이트 표준을 위해이 답변을 유지하겠다고 생각합니다. 특히 전반적인 승리를 얻지 못하기 때문입니다.
lirtosiast


1

PowerShell , 99 바이트

$args|% t*y|%{$s+=$_
0..$n|%{if($n-$_-and($t=-join$s[$_..$n])-eq-join$s[$n..$_]){$t}}
$n++}|sort -u

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

덜 골프 :

$args|% toCharArray|%{
    $substring+=$_
    0..$n|%{
        if( $n-$_ -and ($temp=-join$substring[$_..$n]) -eq -join$substring[$n..$_] ){
            $temp
        }
    }
    $n++
}|sort -Unique

1

Brachylog , 11 바이트

{s.l>1∧.↔}ᵘ

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

(링크의 헤더는 게시 할 때 끊어 졌으므로 여기 에 첫 번째 테스트 사례에 대한 술어 (Brachylog의 기능과 동일)가 있으며 w실제로 출력을 인쇄하기위한 끝에는가 있습니다.)

               The output is
{        }ᵘ    a list containing every possible unique
 s.            substring of
               the input
   l           the length of which
    >          is greater than
     1         one
      ∧        and
       .       which
        ↔      reversed
               is itself. (implicit output within the inline sub-predicate)

길이가 1보다 큰지 확인하는 더 짧은 방법이 있다고 생각합니다. (사소한 회문을 걸러 내지 않으면 그냥 있습니다 {s.↔}ᵘ.)


1

APL (NARS), 65 자, 130 바이트

{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}

테스트:

  r←{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}
  o←⎕fmt
  o r '1234442'
┌2───────────┐
│┌2──┐ ┌3───┐│
││ 44│ │ 444││
│└───┘ └────┘2
└∊───────────┘
  o r '3333'
┌3───────────────────┐
│┌4────┐ ┌3───┐ ┌2──┐│
││ 3333│ │ 333│ │ 33││
│└─────┘ └────┘ └───┘2
└∊───────────────────┘
  o r  "12131331"
┌5─────────────────────────────────┐
│┌4────┐ ┌3───┐ ┌2──┐ ┌3───┐ ┌3───┐│
││ 1331│ │ 121│ │ 33│ │ 313│ │ 131││
│└─────┘ └────┘ └───┘ └────┘ └────┘2
└∊─────────────────────────────────┘
  o r '1234'
┌0─┐
│ 0│
└~─┘


{0=≢m←∪b/⍨{1≥≢⍵:0⋄∧/⍵=⌽⍵}¨b←↑∪/{x[⍵;]⊂y}¨⍳≢x←11 1‼k k⊢k←≢y←⍵:⍬⋄m}
 y←⍵  assign the argument to y (because it has to be used inside other function)
 x←11 1‼k k⊢k←≢y   assign the lenght of y to k, call the function 11 1‼k k
                   that seems here find all partition of 1 2 ..k
 {x[⍵;]⊂y}¨⍳≢      make partition of arg ⍵ using that set x
 ∪/                set union with precedent to each element of partition y (i don't know if this is ok)
 b←↑               get first assign to b
 {1≥≢⍵:0⋄∧/⍵=⌽⍵}¨ for each element of b return 1 only if the argument ⍵ is such that 
                   "∧/⍵=⌽⍵" ⍵ has all subset palindrome, else return 0
 b/⍨               get the elements in b for with {1≥≢⍵:0⋄∧/⍵=⌽⍵} return 1
 m←∪               make the set return without ripetition element, and assign to m
 0=≢               if lenght of m is 0 (void set) than 
 :⍬⋄m              return ⍬ else return m

왜 누군가를 더 잘 알고 있으며 이것을 더 잘 설명 할 수 있습니다.이 모든 것을 바꾸지 않아도됩니다 ...이 코드가 확실하지 않습니다. 테스트 예제가 더 많으면 문제가 발생합니다 ...


1

Japt , 9 바이트

ã â fÅfêU

시도 해봐

ã â fÅfêU     :Implicit input of string
ã             :Substrings
  â           :Deduplicate
    f         :Filter elements that return truthy
     Å        :  Slice off first character
       f      :Filter elements that return true
        êU    :  Test for palindrome

0

Java 8, 202 201 199 바이트

import java.util.*;s->{Set r=new HashSet();String x;for(int l=s.length(),i=0,j;i<l;i++)for(j=i;++j<=l;)if((x=s.substring(i,j)).contains(new StringBuffer(x).reverse())&x.length()>1)r.add(x);return r;}

여기에서 시도하십시오.

함수가 허용되지 않고 전체 프로그램이 필요한 경우 대신 256 255 253 바이트입니다 .

import java.util.*;interface M{static void main(String[]a){Set r=new HashSet();String x;for(int l=a[0].length(),i=0,j;i<l;i++)for(j=i;++j<=l;)if((x=a[0].substring(i,j)).contains(new StringBuffer(x).reverse())&x.length()>1)r.add(x);System.out.print(r);}}

여기에서 시도하십시오.

설명:

import java.util.*;      // Required import for Set and HashSet

s->{                     // Method with String parameter and Set return-type
  Set r=new HashSet();   //  Return-Set
  String t;              //  Temp-String
  for(int l=s.length(),  //  Length of the input-String
          i=0,j;         //  Index-integers (start `i` at 0)
      i<l;i++)           //  Loop (1) from `0` to `l` (exclusive)
    for(j=i;++j<=l;)     //   Inner loop (2) from `i+1` to `l` (inclusive)
      if((t=s.substring(i,j) 
                         //    Set `t` to the substring from `i` to `j` (exclusive)
         ).contains(new StringBuffer(t).reverse())
                         //    If this substring is a palindrome,
         &t.length()>1)  //    and it's length is larger than 1:
        r.add(t);        //     Add the String to the Set
                         //   End of inner loop (2) (implicit / single-line body)
                         //  End of loop (1) (implicit / single-line body)
  return r;              //  Return the result-Set
}                        // End of method

0

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

반환 세트 .

s=>new Set((g=(s,r=[...s].reverse().join``)=>s[1]?(r==s?[s]:[]).concat(g(s.slice(1)),g(r.slice(1))):[])(s))

테스트 사례

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