“Alt palindromlar” bulma.


24

Bir dizgenin tüm benzersiz "alt palindromlarını" bulan en kısa kod , yani: palindrom olan, uzunluğu> 1 olan herhangi bir alt dize.

eg.1

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

eg.2

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

1
Bir dize kendi alt palindromu olabilir mi? Bir dize kendi alt dize olduğundan.
JPvdMerwe,

@JPvdMerwe: Evet, ders dışı.
Eelvex

Aslında daha da önemlisi: Çıktı ne olmalı 333? 33
Naively

@JPvdMerwe: '333' -> '33', '333'. Soruyu buna göre düzenleyeceğim. Teşekkürler.
Eelvex

Çıktı nasıl belirtilir? Alıntılarla virgülle ayrılmış olarak, burada gösterildiği gibi her bir alt palindromu oluşturuyor musunuz? Satır başına bir alt-p?
Joey

Yanıtlar:


11

J, 24 31 40

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

Örnek kullanım:

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

Al şunu GolfScript!


Kabul et, sadece /dev/randombizi kandırmak için buradan bir çöplük koyuyorsun ;-)
Joey

@Joey kendin için denesene; p (TBH, ilk önce de işe yarayacağına inanmıyordum)
JB

Gerçek kod olduğuna eminim. Bir hafta sonunu kafamı J'nin etrafına sarmaya çalışarak geçirdim, ama perişan bir şekilde başarısız oldum. Yine de kodu tanıyorum; Sadece ne yaptığını anlamıyorum ;-)
Joey

2
Bu kısaltılamaz mı ~.(#~(1<#*]-:|.)&>),<\\.(24 karakter)?
ephemient

@ephemient Gerçekten de öyle. (Görünüşe göre, burada geçerli olmayan "cevap bir işlev olmalı" zihniyetinde sıkışıp kaldım.) Düzenlendi, teşekkürler!
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

Bu kod alt palindromları çoğaltmaz.

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
Tek tırnak kullanmasına rağmen biraz yer kazanmak '"'+t+'"'için değiştirin t.
Thomas O

3

Yakut - 126 102 97 karakter

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

Golf yazısı, 48 karakter

subpalindrome.gs

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

Kullanımı:

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

İlk işlem {,}{(;}/bir dizgiyi izleyen alt dizgelerin listesine dönüştürür. Daha sonra benzer bir öncül-alt dizilimi dönüşümü sonuç üzerinde eşlenir. Daha sonra düzleştirin {+}*, yüklemeyi kullanarak palindromları süzün .,1>\.-1%=*, ile benzersiz değerleri yakalayın .&, sonra güzel baskı yapın.

İzleyen-alt dizileri dönüşümü bir blok olarak çıkarmak ve onu tekrar izleyen her alt dizgiyi tersine çevirdikten sonra ön-alt dizilerin yerine kullanmak için tekrar kullanmak daha uygun olacaktır, ancak bunu yapmanın özlü bir yolunu bulamıyorum.


2

Haskell - 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)

Değiştir main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)ile main=getLine>>=putStrLn.intercalate", ".toList.p. Ben de ponun yerine bir çağrı koyardım.
Yasir Arsanukaev

Substrings / = subsequences! Programınız, örnek 1'deki referans çıktısından daha fazla alt palindrom bildirir (örneğin, "1111")
JB,

2

J, 48

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

Örneğin

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

2

Prolog, 92

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

Örnek kullanım:

?- 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]}

Bu stdin'de girdi bekler ve bulunan tüm palindromları stdout'ta her satıra bir tane atar:

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

(Ondan cmdkaçıldığında echo 12131331|powershell -file subp.ps1- $inputbetiğin nasıl çağrıldığına bağlı olarak sadece biraz farklı bir anlam alır, ancak etkileşimli değil, stdin olabilir.)

2011-01-30 13:57 (111) - İlk deneme.

2011-01-30 13:59 (109) - Satır içi değişken bildirimi.

2011-06-02 13:18 (104) - Aramak yerine bir karakter dizisine katılarak alt dizginin bulunmasını .Substring()reddetti ve biraz daha fazla çizildi.


2

Q, 78

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

kullanım

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

Retina , 34 27 bayt

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

Çevrimiçi deneyin!

Test takımının bir testi Molması gerekir, çünkü test durumları arasına boş satırlar koymak için başka bir aşama izlenir.

açıklama

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

Yazdır ( !) tüm benzersiz ( @), örtüşen ( &) regex eşleşmeleri (.)+.?(?<-1>\1)+(?(1)^). Bu, dengeleme grupları kullanarak 2 veya daha fazla uzunlukta bir palindromla eşleşir. "Üst üste gelen tüm eşleşmeler" bölümüne bir uyarı var: Her başlangıç ​​pozisyonunda en fazla bir maç alabiliriz. Bununla birlikte, farklı uzunluktaki iki palindrom aynı pozisyonda başlarsa, daha kısa palindrom daha uzun palindromun sonunda tekrar belirecektir. Ve açgözlülüğünden beri+Öncelikleri daha uzun maçlar olduğundan, yine de tüm palindromları alıyoruz.


2

05AB1E , 11 10 bayt

ŒÙʒÂQ}žQSK

Çevrimiçi deneyin!



@scottinet bekarlar için başarısız oldu, EG1234142141410010101000
Magic Octopus Urn

1
Seninki de aynı şekilde değil. o_O Araştırılması gereken bir şey var. Bu arada, burada iş gibi görünen 10 baytlık bir sürüm var
scottinet

Benzersiz bir hata vardı, düzelttim. Şimdi hem 11
baytınız

@scottinet Sizin 10-Byter değiştirerek de bir 9 Byter olabilir 1›için . :)
Kevin Cruijssen

1

Perl, 112

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

1

JavaScript (ES6), 120 bayt

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}

Bu işlev giriş olarak bir dize alır ve bir dizi çıkarır.


1

Clojure, 81 bayt

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

forBurada mükemmel bir eşleşme oldu :) :when(=(reverse p)p)Girdi bir karakter listesi olsaydı kullanabilir miydi VEYA tam bir dize bir palindrom olarak sayılmazdı, bu durumda aslında en fazla iolabilir(count %) .

Referans için en kompakt durumda:

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

1

Python, 83 102 karakter

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

İfade (t[1:]or())and...eşdeğerdir(...)if t[1:]else() ve bir karakter kaydeder! Bu birikimden dolayı gurur duyuyorum.

Örnek:

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

Bunu, bir elmadan diğerine Scala cevabıyla karşılaştırmak için elmaları tutmak için, benim de App'i genişleten bir nesne yaptım. Giriş dizisini elle yinelemek ve alt dizgiyi kullanmak yerine, benim için tüm alt dizilerin bir dizisini oluşturmak için sliding () işlevinden yararlandım.


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


Merhaba Lalith, kodunu biraz kısalttım: Verimden önce boş bırakmadan ve ana yerine yazmak yerine App uzatmak, println => print ve distinct => toSet
bilinmeyen kullanıcı

1

Perl 6 ,  35  32 bayt

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

Dene

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

Dene

Expanded:

{  # 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 Klasik) , 27 bayt

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

Çevrimiçi deneyin!

{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/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 "kod" çağrısı nedeniyle, snippet ∪w/⍨≡∘⌽¨⍨w←⊃,/1↓(⍳∘≢,/¨⊂)geçerlidir.
Adám

@ Adám Sanırım bu cevabı modern site standartları uğruna olduğu gibi tutacağım, özellikle de genel kazanamadığı için.
lirtosiast

1

Japt , 14 bayt

Êò2@ãX fêSÃc â

Çevrimiçi deneyin!

Açıklama:

Êò2               #Get the range [2...length(input)]
   @      Ã       #For each number in that range:
    ãX            # Get the substrings of the input with that length
       fêS        # Keep only the palindromes
           c      #Flatten
             â    #Keep unique results

1

PowerShell , 99 bayt

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

Çevrimiçi deneyin!

Daha az golf oynadı:

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

1

Brachylog , 11 bayt

{s.l>1∧.↔}ᵘ

Çevrimiçi deneyin!

(Bağlantıdaki başlık gönderme sırasında kesildi, bu yüzden iştew asıl çıktıyı basmak için bir son olacak şekilde yalnızca ilk sınama durumundaki yordam (Brachylog'da işlev eşdeğeri) .)

               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)

Uzunluğun 1'den büyük olduğunu kontrol etmenin daha kısa bir yolu olduğunu hissediyorum (Önemsiz palindromları filtrelememesi durumunda, sadece olur {s.↔}ᵘ.)


1

APL (NARS), 65 karakter, 130 bayt

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

Ölçek:

  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

Birisi nedenini daha iyi biliyorsa ve bunu daha iyi açıklayabilir, hepsini değiştirmeden ... Bu koddan o kadar emin değilim, eğer test örnekleri daha fazla ise, bir şeyler ters gidecek ...


1

Japt , 9 bayt

ã â fÅfêU

Dene

ã â 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 bayt

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

Burada dene.

Bir işleve izin verilmiyorsa ve tam bir program gerekiyorsa, bunun yerine 256 255 253 bayttır :

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);}}

Burada dene.

Açıklama:

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 bayt

Bir Küme döndürür .

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

Test durumları

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.