Tìm kiếm tiểu thư palindromes.


24

Mã ngắn nhất tìm thấy tất cả các "tiểu khung" duy nhất của một chuỗi, đó là: bất kỳ chuỗi con nào có độ dài> 1 là một palindrom.

vd

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

vd

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

1
Một chuỗi có thể là phụ của nó không? Vì một chuỗi là chuỗi con của riêng nó.
JPvdMerwe

@JPvdMerwe: Vâng, tất nhiên rồi.
Eelvex

Trên thực tế quan trọng hơn: đầu ra 333phải là gì? Cuối cùng, bạn sẽ in 33hai lần
JPvdMerwe

@JPvdMerwe: '333' -> '33', '333'. Tôi sẽ chỉnh sửa câu hỏi cho phù hợp. Cảm ơn.
Eelvex

Làm thế nào là đầu ra được chỉ định? Dấu phẩy được phân cách bằng dấu ngoặc kép là mỗi bảng phụ như bạn trình bày ở đây? Một p phụ trên mỗi dòng?
Joey

Câu trả lời:


11

J, 24 31 40

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

Sử dụng mẫu:

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

Lấy cái đó đi, GolfScript!


Thừa nhận đi, bạn chỉ cần đặt một bãi rác từ /dev/randomđây để đánh lừa chúng tôi ;-)
Joey

@Joey hãy tự mình thử nó; p (TBH, tôi không tin rằng nó có thể hoạt động ngay từ đầu)
JB

Tôi khá chắc chắn đó là mã thực tế. Tôi đã dành một ngày cuối tuần để cố gắng quấn đầu quanh J, nhưng thất bại thảm hại. Tuy nhiên, tôi nhận ra mã; Tôi chỉ không hiểu nó làm gì ;-)
Joey

2
Điều này không thể được rút ngắn thành ~.(#~(1<#*]-:|.)&>),<\\.(24 ký tự)?
ephemient

@ephemient Nó thực sự. (Có vẻ như tôi bị mắc kẹt trong suy nghĩ "câu trả lời phải là một chức năng", không áp dụng ở đây.) Đã chỉnh sửa, cảm ơn!
JB

7

Con trăn 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

Con trăn - 138 136

Mã này không trùng lặp các palindromes phụ.

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
Thay đổi '"'+t+'"'để ttiết kiệm không gian, mặc dù nó sử dụng dấu ngoặc đơn.
Thomas O

3

Ruby - 126 102 97 ký tự

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, 48 ký tự

subpalindrom.gs

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

Sử dụng:

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

Hoạt động đầu tiên {,}{(;}/biến một chuỗi thành một danh sách các chuỗi con. Một biến đổi hàng đầu tương tự sau đó được ánh xạ qua kết quả. Sau đó làm phẳng với {+}*, lọc các palindromes bằng cách sử dụng vị ngữ .,1>\.-1%=*, lấy các giá trị duy nhất với.& , sau đó in đẹp.

Sẽ là gọn gàng hơn để trích xuất các biến đổi dấu vết thành một khối và tái sử dụng nó như là một sự thay thế cho các chuỗi con sau khi đảo ngược từng chuỗi con, nhưng tôi không thể tìm ra cách làm ngắn gọn.


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)

Thay thế main=getLine>>=(\x->putStrLn$intercalate", "$toList$p x)bằng main=getLine>>=putStrLn.intercalate", ".toList.p. Tôi cũng sẽ thay thế một cuộc gọi đến pvới cơ thể của nó.
Yasir Arsanukaev

Chất nền / = subsequences! Chương trình của bạn báo cáo nhiều subpalindromes hơn đầu ra tham chiếu, ví dụ 1. (ví dụ "1111")
JB

2

J, 48

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

ví dụ

~.(#~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).

Sử dụng mẫu:

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

Điều này hy vọng đầu vào trên stdin và sẽ ném tất cả các palindromes được tìm thấy trên mỗi dòng trên thiết bị xuất chuẩn:

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

(Khi chạy từ cmdnó trở thành echo 12131331|powershell -file subp.ps1- nó chỉ $inputmang một ý nghĩa hơi khác tùy thuộc vào cách tập lệnh được gọi, nhưng nó có thể là stdin, chỉ là không tương tác.)

2011-01-30 13:57 (111) - Nỗ lực đầu tiên.

2011-01-30 13:59 (109) - Khai báo biến nội tuyến.

2011-06 / 02 13:18 (104) - Làm lại việc tìm chuỗi con bằng cách nối một mảng char thay vì gọi .Substring()và nội tuyến thêm một chút.


2

Q, 78

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

sử dụng

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

Võng mạc , 34 27 byte

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

Hãy thử trực tuyến!

Bộ kiểm tra cần một M vì nó được theo sau bởi một giai đoạn khác để chèn các dòng trống giữa các trường hợp kiểm thử.

Giải trình

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

In ( !) tất cả các kết quả khớp duy nhất ( @), chồng chéo ( &) của biểu thức chính quy (.)+.?(?<-1>\1)+(?(1)^). Điều này phù hợp với một palindrom có ​​độ dài từ 2 trở lên bằng cách sử dụng các nhóm cân bằng. Có một sự cảnh báo cho phần "tất cả các trận đấu chồng chéo": chúng ta có thể nhận được nhiều nhất một trận đấu cho mỗi vị trí bắt đầu. Tuy nhiên, nếu hai palindrome có chiều dài khác nhau bắt đầu ở cùng một vị trí, palindrom ngắn hơn sẽ xuất hiện lại ở cuối palindrom dài hơn. Và vì sự tham lam của các +ưu tiên phù hợp lâu hơn, dù sao chúng ta cũng sẽ nhận được tất cả các palindromes.


2

05AB1E , 11 10 byte

ŒÙʒÂQ}žQSK

Hãy thử trực tuyến!



@scottinet thất bại cho người độc thân, EG1234142141410010101000
Bạch tuộc ma thuật Urn

1
Bạn cũng vậy, nhưng không phải theo cùng một cách. o_O Có một cái gì đó đang diễn ra cần điều tra. Trong khi đó, đây là phiên bản 10 byte dường như hoạt động
scottinet

Có một lỗi với uniquify, tôi đã sửa nó. Bây giờ cả câu trả lời 11 byte của bạn và 9 byte của tôi đều hoạt động :-)
scottinet

@scottinet Bộ 10 của bạn cũng có thể là 9-byter bằng cách đổi 1›thành . :)
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 byte

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}

Hàm này lấy một chuỗi làm đầu vào và đầu ra một mảng.


1

Clojure, 81 byte

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

forlà một kết hợp hoàn hảo ở đây :) Có thể sử dụng :when(=(reverse p)p)nếu đầu vào là danh sách các ký tự HOẶC một chuỗi đầy đủ không được tính là một bảng màu, thực sự trong trường hợp đó, phạm vi tối đa icũng có thể (count %).

Trường hợp nhỏ gọn nhất để tham khảo:

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

1

Python, 83 102 ký tự

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

Cụm từ (t[1:]or())and... tương đương với(...)if t[1:]else() và lưu một ký tự! Tôi quá tự hào về điều này, được tiết kiệm.

Thí dụ:

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

Để giữ điều này một táo so với táo so với câu trả lời Scala khác, tôi cũng biến tôi thành một đối tượng mở rộng Ứng dụng. Thay vì lặp lại chuỗi đầu vào bằng tay và sử dụng chuỗi con, tôi tận dụng trượt () để tạo một chuỗi tất cả các chuỗi con cho tôi.


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


Xin chào Lalith, tôi đã rút ngắn mã của bạn một chút: Không trống trước khi nhường và mở rộng Ứng dụng thay vì ghi đè chính, println => in và phân biệt => to Set
người dùng không biết

1

Perl 6 ,  35  32 byte

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

Kiểm tra nó

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

Kiểm tra nó

Mở rộng:

{  # 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 byte

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

Hãy thử trực tuyến!

{∪⍵/⍨≡∘⌽¨⍨⍵}∘⊃(,/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.

Do OP gọi "mã", đoạn mã ∪w/⍨≡∘⌽¨⍨w←⊃,/1↓(⍳∘≢,/¨⊂)hợp lệ.
Adám

@ Adám Tôi nghĩ rằng tôi sẽ giữ câu trả lời này vì nó là vì lợi ích của các tiêu chuẩn trang web hiện đại, đặc biệt là vì nó không giành được chiến thắng chung.
lirtosiast

1

Japt , 14 byte

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

Hãy thử trực tuyến!

Giải trình:

Êò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 byte

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

Hãy thử trực tuyến!

Ít chơi gôn hơn:

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

1

Brachylog , 11 byte

{s.l>1∧.↔}ᵘ

Hãy thử trực tuyến!

(Tiêu đề trong liên kết bị hỏng tại thời điểm đăng, vì vậy đây là vị từ (tương đương chức năng trong Brachylog) chỉ trong trường hợp thử nghiệm đầu tiên, wở cuối để thực sự in đầu ra.)

               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)

Tôi cảm thấy như có một cách ngắn hơn để kiểm tra xem độ dài có lớn hơn 1. (Nếu nó không lọc ra các palindromes tầm thường, thì nó sẽ như vậy {s.↔}ᵘ.)


1

APL (NARS), 65 ký tự, 130 byte

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

kiểm tra:

  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

có ai đó hiểu rõ hơn tại sao, và có thể giải thích điều này tốt hơn, không phải thay đổi tất cả ... Tôi không chắc chắn về mã này, có thể nếu các ví dụ kiểm tra nhiều hơn, sẽ có lỗi xảy ra ...


1

Japt , 9 byte

ã â fÅfêU

Thử nó

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

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

Hãy thử nó ở đây.

Nếu một chức năng không được phép và một chương trình đầy đủ là bắt buộc, thay vào đó là 256 255 253 byte :

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

Hãy thử nó ở đây.

Giải trình:

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 byte

Trả về một bộ .

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

Các trường hợp thử nghiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.