Dây đeo


28

Một chuỗi là pairable nếu nó có thể được chia thành subtrings, mỗi trong số đó là một chuỗi lặp lại hai lần liên tiếp. Ví dụ, aabaaababbbabacó thể chịu được như:

aaba aaba
b b
ba ba

Đưa ra một chuỗi không trống của a'và b', xuất ra một giá trị Chân lý nếu nó có thể chịu được và giá trị Falsey nếu không.

Có thể mặc được:

aa
abaaba
bbababbb
aabaaababbbaba
babababa
bbbbbbbbbbbb
aaababbabbabbbababbaabaabaababaaba
aaaabaab

Không thể chịu được:

a
ba
baab
abaabaaba
bbbbbbbbbbbbbbb
baababbabaaaab
aaaaabbaaaaa

Tôi khuyến khích bạn đưa ra các giải pháp không dựa trên regex ngay cả khi đã có câu trả lời regex ngắn hơn trong ngôn ngữ của bạn. Bạn có thể đánh dấu chúng là "không regex". Theo regex, tôi có nghĩa là một mô hình chuỗi phù hợp với hệ thống con.


Bảng xếp hạng:


Chúng ta có thể sử dụng bất cứ điều gì khác hơn ab?
Erik the Outgolfer 2/11/2016

Nếu bbababbb có thể chịu được, tại sao baab và aaaaabbaaaaa không?
rnso

@rnso Theo hiểu biết của tôi, bbababbb có thể được chia thành 3 cặp: bb, abab và bb nối với nhau để tạo thành chuỗi gốc, trong khi hai cặp kia không thể.
Nắng Pun

Bởi câu hỏi "mỗi trong số đó (chuỗi con) là một chuỗi được lặp lại hai lần ĐẢM BẢO" và điều đó không hài lòng với bbababbb. Nếu không, baab cũng có thể được chia thành baab, và aaaaabbaaaaa thành aaaaa bb aaaaa.
rnso

@rnso Không chắc ý bạn là gì. Bằng cách liên tiếp, tôi có nghĩa là hai lần lặp lại nằm cạnh nhau. Trong "baa b", hai b được cách nhau bởi một, do đó không hoạt động.
xnor 2/11/2016

Câu trả lời:


11

Python 2, 68 63 byte

f=lambda s,n=1:s==2*s[:n]or''<s[n:]>-f(s,n+1)<f(s[n:])*f(s[:n])

Trả về Đúng hoặc Sai . Kiểm tra nó trên Ideone .


4
Đó là một đệ quy thực sự rõ ràng, sử dụng chỉ mục cho cả hai cho trung tâm của đôi và trung tâm để phân vùng. Thật buồn cười là sự thật được kiểm tra là ít hơn một cái gì đó. Tôi thấy một số cải tiến ...
xnor

8

Võng mạc , 11 byte

^((.+)\2)+$

Hãy thử tất cả các trường hợp thử nghiệm. Hai byte đầu tiên làm cho nó nhiều dòng.

Giải thích theo đúng nghĩa đen của các quy tắc, rõ ràng sử dụng regex, giống như tất cả các chương trình Retina sẽ.


2
Thật đáng tiếc, tôi đã chờ đợi 3 tuần để đăng bài này ...
ETHproductions


5
Rất tiếc! Tôi cũng chỉ đánh bại anh ta 10 giây, ... Tôi chắc chắn nếu tôi viết câu trả lời Hexagony, anh ta sẽ tha thứ cho tôi!
FryAmTheEggman

5
@FryAmTheEggman Tôi đang mong chờ nó. :)
Martin Ender

2
Nó hoàn toàn giống với Perl:perl -pE '$_=/^((.+)\2)+$/'
Dada

8

Thạch , 10 byte

ẆŒPẋ€€2F€ċ

Không chính xác hiệu quả ... Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ẆŒPẋ€€2F€ċ  Main link. Argument: s (string)

Ẇ           Window, generate the array of all substrings of s.
 ŒP         Powerset; generate all subarrays of substrings of s.
   ẋ€€2     Repeat each substring in each subarray twice.
            For example, ["ab", "a", "b"] becomes ["abab", "aa", "bb"].
       F€   Flatten the subarrays by concatenating their strings.
         ċ  Count how many times s appears in the generated strings.

Điều này ... có vẻ không hiệu quả. Bao lâu đầu vào này có thể xử lý trong một khung thời gian hợp lý?
John Dvorak

1
Nó cực kỳ không hiệu quả ( O (2 ^ n ^ 2) , tôi nghĩ vậy). Tôi phải kiểm tra tại địa phương. TIO hết bộ nhớ cho các chuỗi có độ dài 6 .
Dennis

8
Một chuỗi có độ dài 6 mất 3:20 phút trên máy của tôi và cần 6 GB bộ nhớ.
Dennis

1
@Dennis Chúng ta đừng làm 100 đầu vào sau đó, vì mọi thứ sẽ sụp đổ. Vâng, ngay cả TIO.
Erik các Outgolfer

@EriktheGolfer Đó là một ý tưởng hay vì nó sẽ làm chậm TIO một cách không cần thiết cho các mục đích sử dụng khác, nhưng nó sẽ không làm hỏng nó. Ngay khi hệ thống hết bộ nhớ, quá trình này sẽ bị OOM giết chết.
Dennis

5

Haskell, 72 69 byte (không có biểu thức chính quy)

g(a:b:c)|a==b=g c
g x=x==[]
any(g.words.concat).mapM(\c->[[c],c:" "])

Một cách tiếp cận vũ phu. Hãy thử nó trên Ideone .

Nhờ BlackCap cho -3 byte.

Giải trình

Hàm trợ giúp glấy một danh sách các chuỗi và kiểm tra xem nó có bao gồm các cặp chuỗi giống nhau không ["aa","aa","bba","bba","ab","ab"]. Hàm chính (ẩn danh) phân tách một chuỗi theo tất cả các cách có thể và kiểm tra xem có ít nhất một kết quả phân tách trong danh sách gchấp nhận.

g(a:b:c)                                  g on list with elements a, b and tail c,
        |a==b                              in the case that a==b,
             =g c                          recurses to the tail c.
g x=                                      g on any other list x
    x==[]                                  checks that x is empty.
                                           This includes the case where a is not equal
                                           to b, resulting in False.
any(g.words.concat).mapM(\c->[[c],c:" "]) The main function:
                    mapM(\c->[[c],c:" "])  Replace each letter c with either "c" or "c "
                                           in all possible ways, return list of results.
any(              ).                       Check that at least one result satisfies this:
            concat                          Concatenate the 1- or 2-letter strings,
      words.                                split again at each space,
    g.                                      apply g.

Bạn có thể thay thế or.mapbằngany
BlackCap

@BlackCap Tất nhiên, cảm ơn! Tôi ban đầu có any g.map(words.concat)và nghĩ rằng "hey, tôi có thể golf anyđể or" ...
Zgarb

5

Python 2, 60 byte

f=lambda s,t='':''<s>f(s[1:],t+s[0])|f(t and s)*f(t)>-(s==t)

Tôi hy vọng điều này là chính xác. Nó chạy khá chậm và andtrông không tối ưu.


1
Tôi đã thử sử dụng các chuỗi, nhưng tôi không thể đạt được bất cứ nơi nào gần điểm số dựa trên chỉ số của mình. Đó là một trong những thông minh andbạn có ở đó.
Dennis

Chúc mừng! Đệ quy trên phân vùng là mẹo tôi có trong tâm trí.
xnor

4

Thạch , 12 byte

ŒṖµœs€2ZEµ€S

Hai byte dài hơn câu trả lời khác của tôi , nhưng cách tiếp cận này hiệu quả hơn rất nhiều và xử lý tất cả trừ một trong các trường hợp thử nghiệm.

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

Làm thế nào nó hoạt động

ŒṖµœs€2ZEµ€S  Main link. Argument: s (string)

ŒṖ            Generate all partitions of s.
  µ      µ€   Map the monadic chain between the µ's over the partitions.
   œs€2         Split each string in the partition into two chunks of equal length.
       Z        Zip/transpose, collecting the first halves in one array and the
                second halves in another.
        E       Test the arrays of halves for equality.
           S  Return the sum of the results, counting the number of different
              ways s can be paired.

3

Pyth - Không có Regex - 13 12 byte

Kiểm tra xem có bất kỳ phân vùng nào được tạo thành từ tất cả các chuỗi bằng nhau không khi bị cắt làm hai.

sm.AqMcL2d./

Phòng thử nghiệm .


3

Brachylog , 14 byte (không có biểu thức chính quy)

lye~l:1j@2zcc?

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

Điều này là quá chậm đối với một số trường hợp thử nghiệm

Giải trình

ly                  The list [0, …, length(Input)]
  e~l               A list whose length is an element of the previous list
     :1j            Append itself to this list
        @2zc        Split in half, zip and concatenate so that the list contains pairs of
                      consecutive identical elements
            c?      The concatenation of that list must result in the Input

3

JavaScript (ES6), không có biểu thức chính quy, 75 74 byte

f=s=>!s|[...s].some((_,i)=>i&&s[e='slice'](0,i)==s[e](i,i+=i)&&f(s[e](i)))

Trả về 1cho có thể khác 0. Chỉnh sửa: Đã lưu 1 byte nhờ @ edc65.


Tốt đẹp! Cùng sử dụng substrmà không sửa đổi i. Nhưng với slice3 lần lặp lại, bạn có thể lưu 1 byte bí
edc65

@ edc65 Làm thế nào để bạn có được số lượng tương tự mà không sửa đổi i? Tôi nhận ra rằng s.substr(i,i+i)trả về giống như s.slice(i,i+=i)nhưng sau đó tôi sử dụng giá trị được sửa đổi isau này ...
Neil

s.substr(i,i)ít hơn 2 byte, sau đó thêm s.slice(i+i)2 byte
edc65

@ edc65 Tất nhiên rồi, tôi phải uống thêm cà phê ...
Neil

3

Python, 58 byte

f=lambda s,p='':s>''and(f(p)>-(s==p)<f(s))|f(s[1:],p+s[0])

Điều này dựa trên phương pháp đệ quy của Dennis . Thủ thuật phủ định Boolean cũng được thực hiện từ đó.

Ý tưởng mới là lặp lại các phân vùng (p,s)của chuỗi gốc bằng cách bắt đầu ('',s)và liên tục di chuyển ký tự đầu tiên thành ký tự scuối cùng của p. Điều này cho phép các phần được tham chiếu trực tiếp mà không cần cắt chuỗi. Nhưng, vì phân vùng bắt đầu ptrống, chúng ta phải cẩn thận để tránh các vòng lặp vô hạn của f(s)cuộc gọi f(s).


2

JavaScript (ES6), 24 byte

x=>/^((.+)\2)+$/.test(x)

Có lẽ không được ngắn hơn thế này.


Có nên như \2vậy không?
Neil

@Neil Vì một số lý do, tôi nghĩ rằng nó đã hoạt động \1, nhưng aabtrả lại true... cảm ơn vì đã sửa chữa.
Sản xuất ETH


2

Python, 66 64 byte

Cảm ơn @Zgarb cho -1 byte!

f=lambda x,s=1:x>x[:s]and(x==2*x[:s])|f(x[:s])&f(x[s:])|f(x,s+1)

Trả về TruehoặcFalse .

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

Bất kỳ trợ giúp chơi golf này sẽ được đánh giá cao.


1

Vợt 230 byte

(let((sl string-length)(ss substring))(if(odd?(sl s))(printf ".~n")(begin(let p((s s))(if(equal? s "")(printf "!")
(for((i(range 1(add1(/(sl s)2)))))(when(equal?(ss s 0 i)(ss s i(* 2 i)))(p(ss s(* 2 i)(sl s)))))))(printf ".~n"))))

In một '!' cho mỗi cách mà chuỗi có thể chịu được. In một '.' cuối cùng.

Ung dung:

(define (f s)
  (let ((sl string-length)                              ; create short names of built-in fns
        (ss substring))
    (if (odd? (sl s))  (printf ".~n")                   ; odd length strings cannot be pairable; end here.
        (begin
          (let loop ((s s))                             ; start testing here
            (if (equal? s "") (printf "!")              ; if no remaining string, it must be pairable
                (for ((i (range 1 (add1 (/(sl s)2)))))  ; ch lengths varying from 1 to half of string length
                  (when (equal? (ss s 0 i)              ; ch if substrings are same
                                (ss s i (* 2 i)))
                    (loop (ss s (* 2 i) (sl s) ))))))   ; if yes, loop to check remaining string.
          (printf ".~n")))))                            ; End of testing.

Kiểm tra:

(println "Following should be pairable")
(f "bbaabbaa")            ; should produce 2 '!' since 2 ways are possible.
(f "aa")
(f "abaaba")
(f "bbababbb")
(f "aabaaababbbaba")
(f "babababa")                    ; should be pairable in 2 ways.
(f "bbbbbbbbbbbb")                ; should be pairable in many ways.
(f "aaababbabbabbbababbaabaabaababaaba")
(f "aaaabaab")
(println "Following should be unpairable")
; (f "a")
(f "ba")
(f "baab")
(f "abaabaaba")
(f "bbbbbbbbbbbbbbb")
(f "baababbabaaaab")
(f "aaaaabbaaaaa")

Đầu ra:

"Following should be pairable"
!!.
!.
!.
!.
!.
!!.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.
!.
!.
"Following should be unpairable"
.
.
.
.
.
.

1

Perl, 16 +2 = 18 byte (có biểu thức chính quy)

Chạy với -nlcờ. -Elà miễn phí.

say/^((.+)\2)+$/

Chạy như:

perl -nlE 'say/^((.+)\2)+$/'

Trả về một danh sách các nhóm bắt giữ (một sự thật) nếu có thể chịu được, chuỗi null nếu không thể chịu được.

Giải trình

Các -nlcờ sẽ chạy mã trong một vòng lặp ( -n), đặt đầu vào (với dòng mới bị xóa vì -l) vào biến $_mỗi lần, sau đó đánh giá mã mỗi lần nhập vào, cho đến khi chương trình được kết thúc thủ công. Các -Elá cờ cho phép bạn đánh giá mã trên dòng lệnh, và cho phép các saylệnh.

say/^((.+)\2)+$/

   /^((.+)\2)+$/  #The regex engine
      (.+)\2      #Find any set of at least one character, followed by itself
     (      )+    #Do this at least one time
   /^         $/  #Make sure that this matches the entire string from start to end
say               #Output the result of the regex

Nếu một kết quả khớp được tìm thấy (ví dụ: nếu chuỗi có thể chịu được), thì regex trả về một danh sách các nhóm bắt giữ, đánh giá thành một sự thật, sau đó được chuyển đến sayvà xuất ra. Nếu không tìm thấy kết quả khớp nào, thì biểu thức chính quy trả về chuỗi rỗng, đánh giá thành sai lệch, sau đó được chuyển đếnsay và xuất ra.

Mẫu vật:

$ perl -nlE 'say/^((.+)\2)+$/'
aaababbabbabbbababbaabaabaababaaba
baababaababaaba                      #Truthy
baababbabaaaab
                                     #Falsy
bbababbb
bbb                                  #Truthy
aabaaababbbaba
bababa                               #Truthy
abaabaaba
                                     #Falsy

1

GNU Prolog, 49 46 byte

Có lẽ cũng hoạt động trong các biến thể khác, mặc dù chúng không đại diện cho các chuỗi theo cùng một cách; Đại diện của GNU Prolog là một hữu ích cho vấn đề này.

Không rõ liệu điều này có được tính là sử dụng regex hay không. Nó không sử dụng bất kỳ tính năng nào giống như regex, nhưng toàn bộ ngữ nghĩa của ngôn ngữ tương tự như của regex.

Phiên bản mới (sử dụng thủ thuật đệ quy được thấy trong một số câu trả lời khác):

s(X):-append(A,B,X),(A=B;A\=X,B\=X,s(A),s(B)).

Phiên bản cũ hơn:

s(X):-X=[];append(A,B,X),B\=X,append(C,C,A),s(B).

Đây là một vị ngữ (tương đương với chức năng của Prolog) được gọi s, không phải là một chương trình hoàn chỉnh. Sử dụng nó như thế này:

| ?- s("aa").
true ?
yes
| ?- s("aaababbabbabbbababbaabaabaababaaba").
true ?
yes
| ?- s("baababbabaaaab").
no
| ?- s("bbbbbbbbbbbbbbb").
no

Một tính năng thú vị của giải pháp cũ là nếu bạn hỏi người phiên dịch "có nhiều giải pháp hơn không?" thông qua việc sử dụng ;tại true ?dấu nhắc (thay vì hỏi "có giải pháp nào không" bằng cách nhấn return tại dấu nhắc, như tôi đã làm ở trên), nó trả về "true" một số lần bằng số cách khác nhau mà chuỗi có thể được thể hiện trong biểu mẫu đã cho (ví dụ: nó trả về "true" hai lần với s("aaaa")., vì điều này có thể được phân tích cú pháp là (a a)(a a)hoặc như(aa aa) ).

Chương trình Prolog thường đảo ngược (cho phép sđể tạo ra một danh sách các chuỗi với tài sản nhất định). Cái cũ hơn không (nó đi vào một vòng lặp vô hạn), nhưng đó là do phương pháp đánh gôn mà tôi đã sử dụng để đảm bảo rằng C không trống; nếu bạn viết lại chương trình để xác định C là không trống, nó sẽ tạo ra các chuỗi có dạng "aa", "aabb", "aabbcc", v.v. (Prolog là Prolog, nó không chỉ định danh tính cho các ký tự tạo ra chúng lên, chỉ là một đặc điểm kỹ thuật của các nhân vật là như nhau). Cái mới hơn tạo ra các chuỗi có dạng "aa", "abab", "abcabc", v.v. đây là một vòng lặp vô hạn theo đúng nghĩa của nó và do đó không bao giờ đạt đến điểm mà nó bị kẹt do không phát hiện được chuỗi có độ dài bằng không.


1

Brainfuck, 177 byte

+[<<<<,]>>>>[>+[>+[[>>]<+<[<<]>+>-]<[>+<-]>>>,>>[>>]+<<[<+>>-<-]<[>+<-]>>[,>[-<<
<<]<[<<<<]>]<[[<<]>]>>]>>[[>+>>>]>>>[>]<<<<[>+[-<<<,<]<[<<<[[<<<<]>>]<]>]>>]<[[-
>>>>]>>[<]<]<<]<.

Định dạng:

+[<<<<,]
>>>>
[
  >+
  [
    >+
    [
      [>>]
      <+<[<<]
      >+>-
    ]
    <[>+<-]>
    >>,>>[>>]
    +<<[<+> >-<-]
    <[>+<-]>
    >
    [
      not equal
      ,>[-<<<<]
      <[<<<<]
      >
    ]
    <
    [
      equal
      [<<]
      >
    ]
    >>
  ]
  >>
  [
    mismatch
    [>+>>>]
    >>>[>]
    <<<<
    [
      backtrack
      >+[-<<<,<]
      <
      [
        not done yet
        <<<
        [
          [<<<<]
          >>
        ]
        <
      ]
      >
    ]
    >>
  ]
  <
  [
    match
    [->>>>]
    >>[<]
    <
  ]
  <<
]
<.

Mong đợi đầu vào mà không có một dòng mới. In \x00sai và\x01 đúng.

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

Điều này thực hiện tìm kiếm sâu đầu tiên. Cụ thể: kiểm tra các tiền tố lặp lại có độ dài tăng dần bắt đầu từ hậu tố hiện tại, sau đó chuyển sang hậu tố tiếp theo nếu tìm thấy kết quả khớp, nếu không thì quay lại.

Khi bắt đầu, chuỗi được đảo ngược và một sentinel \x01 được đặt ở cuối.

Các băng được chia thành các nút 4 ô. Bố cục bộ nhớ của một nút là:

c h x 0

nơi clà nhân vật, hlà một lá cờ cho dù nhân vật là trong nửa đầu của một tiền tố lặp đi lặp lại, và xlà một lá cờ để theo dõi các cặp hiện tại của nhân vật được so sánh. Các hcờ ở vị trí trong khi các xcờ tạo thành một cửa sổ di chuyển.

Nếu chuỗi có thể chịu được, con trỏ sẽ nằm bên cạnh sentinel ở cuối vòng lặp chính; mặt khác, con trỏ rơi khỏi phía bên trái của chuỗi trong khi quay lại.


1

Brachylog , 5 byte

~c~jᵐ

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

Lưu ý rằng thuật toán này có thể mất rất nhiều thời gian dài, đặc biệt là về các trường hợp falsey, vì nó sẽ kiểm tra tất cả các phân vùng có thể có của chuỗi đầu vào.

Giải trình

~c     Reversed concatenate: find a list that, when concatenated, results in the input string
       This examines all partitions of the input
  ~jᵐ  Map reversed juxtapose: for each string in that list, is it the result of concatenating
       a string to itself?

Đối với một chuỗi đầu vào như thế "ababcc", hãy ~cthử các phân vùng khác nhau cho đến khi đến ["abab", "cc"], tại đó điểm ~jthành công cho cả hai mục của danh sách, đầu ra ["ab", "c"]và vị từ thành công.


1

R , 31 byte

grepl("^((.+)\\2)+$",scan(,""))

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

Dựa trên câu trả lời của Retina.

R , 129 byte

Và đây là một câu trả lời gốc, không phải regex:

o=(y=utf8ToInt(scan(,"")))<0;for(i in 2*1:(sum(y>0)/2))for(j in 1:(i/2)){w=i:(i-j+1);v=w-j;if(all(y[w]==y[v]))o[c(v,w)]=T};all(o)

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


0

Tiếng Litva , 57 ký tự

#S::((? (!= (null) (match S "^((.+)\\2)+$")) true false))

Sử dụng mẫu:

% pairable_strings.lithp
(
    (def f #S::((? (!= (null) (match S "^((.+)\\2)+$")) true false)))
    (print (f "aa"))
    (print (f "aabaaababbbaba"))
    (print (f "aaababbabbabbbababbaabaabaababaaba"))
    (print (f "ba"))
)

# ./run.js pairable_strings.lithp
AtomValue { value: 2, type: 'Atom', name: 'true' }
AtomValue { value: 2, type: 'Atom', name: 'true' }
AtomValue { value: 2, type: 'Atom', name: 'true' }
AtomValue { value: 3, type: 'Atom', name: 'false' }
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.