「サブパリンドローム」を見つける。


24

文字列のすべての一意の「サブパリンドローム」、つまり、パリンドロームである長さ> 1のサブストリングを見つける最短コード。

例1

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

例2

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

1
文字列はそれ自身のサブパリンドロームにできますか?文字列はそれ自身の部分文字列ですから。
-JPvdMerwe

@JPvdMerwe:はい、もちろんです。
エルベックス

実際、もっと重要なのは、何を出力する必要が333あるかということです。単純に332回印刷することになります
-JPvdMerwe

@JPvdMerwe: '333'-> '33'、 '333'。それに応じて質問を編集します。ありがとう。
エルベックス

出力はどのように指定されますか?ここで示すように、引用符で区切られたカンマ区切りのサブパリンドロームがありますか?1行に1つのサブP
ジョーイ

回答:


11

J、24 31 40

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

使用例:

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

どうぞ、GolfScript!


認めてください、あなたは/dev/random私たちを欺くためにここからダンプを置くだけです;
ジョーイ

自分自身でそれを試し@Joey; P(TBH、私はそれが最初のいずれかで仕事ができると信じていませんでした)
JB

実際のコードだと確信しています。私は週末にJの周りに頭を巻こうとして過ごしましたが、惨めに失敗しました。それでも、私はコードを認識しています。私はそれが何をするのか理解していません;
ジョーイ

2
これは~.(#~(1<#*]-:|.)&>),<\\.(24文字)に短縮できませんか?
一時的な

@ephemient確かにそうです。(「答えは機能でなければならない」という考え方にこだわっているように見えますが、ここでは当てはまりません。)編集、ありがとう!
JB

7

Python 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

Haskell 98、88 91 96

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

3

Pythonの- 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て、スペースを節約しますが、単一引用符を使用します。
トーマス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

Golfscript、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そのボディに置き換えます。
ヤシルアルサヌカエフ

部分文字列/ = 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で1行に1つずつスローします。

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)–呼び出し.Substring()やインライン化を行う代わりに、char配列を結合して部分文字列の検索をやり直します。


2

Q、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以上の回文と一致します。「すべての重複一致」部分には注意事項があります。開始位置ごとに最大1つの一致を取得できます。ただし、長さが異なる2つのパリンドロームが同じ位置から始まる場合、長いパリンドロームの終わりに短いパリンドロームが再び現れます。そして、+優先順位の貪欲さはより長くマッチするので、とにかくすべての回文を取得しています。


2

05AB1E11 10バイト

ŒÙʒÂQ}žQSK

オンラインでお試しください!



@scottinetはシングル、EG1234142141410010101000
マジックタコ

1
あなたも同じですが、同じ方法ではありません。o_O調査が必要な何かが進行中です。それまでの間、ここに動作するように見える10バイトのバージョンがあります
スコティネット

uniquifyにバグがあったため、修正しました。今、あなたの11バイトの答えと私の9バイトの1つの仕事の両方:
scottinet

@scottinetに変更すると、10バイトも9バイトに1›なります。:)
ケビンクルーッセン

1

Perl、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

Clojure、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

Python、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() 1文字に、1文字を節約します!節約を考えると、私はこれを非常に誇りに思っています。

例:

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

1

Scala 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(" "))}

これを他のScalaの回答と比較するために、Appを拡張するオブジェクトも作成しました。入力文字列を手動で繰り返して部分文字列を使用するのではなく、sliding()を利用してすべての部分文字列のシーケンスを作成しました。


1

Scala 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(" "))}}


こんにちはLalith、私はあなたのコードを少し短くしました:main、println => print and distinct => toSetを上書きする代わりに、yieldとAppを拡張する前に空白なし
ユーザー不明

1

Perl 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私は、特に全体的な勝利を得られないので、現代のサイト標準のためにこの答えを維持すると思います。
リルトシアスト



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

誰かが理由をよく知っており、これをすべて変更することなく、より良く説明することができます...私はこのコードには確信がありません、テスト例がもっと多い場合、可能性があります...



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

JavaScript(ES6)、107バイト

Setを返します。

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.