Kiểm tra xem một chuỗi hoàn toàn được làm từ cùng một chuỗi con


24

Điều này được lấy từ câu hỏi này (với sự cho phép của khóa học). Tôi sẽ trích dẫn:

Tạo một chức năng mà phải mất một chuỗi, và nó sẽ trở lại đúng hay sai dựa trên việc đầu vào bao gồm chỉ một chuỗi ký tự lặp lại. Độ dài của chuỗi đã cho luôn lớn hơn 1 và chuỗi ký tự phải có ít nhất một lần lặp lại.

Vài ví dụ:

'aa' //true
'aaa' //true
'abcabcabc' //true
'aba' //false
'ababa' //false
'weqweqweqweqweqw' // false

Cụ thể, việc kiểm tra một chuỗi bao gồm các chuỗi con lặp lại ( Cập nhật ) có thể xuất ra bất kỳ biểu diễn đúng hoặc sai, nhưng không có đầu ra lỗi nào. Chuỗi chữ cái nghiêm ngặt. Nếu không, quy tắc golf tiêu chuẩn. Đây là Code Golf, vì vậy câu trả lời ngắn nhất tính theo byte cho mỗi ngôn ngữ sẽ thắng.


4
Hừm, tôi sẽ kết thúc thử thách này như một bản dupe của cái đó , nhưng tôi nhận thấy rằng cái kia ghi điểm về số lượng nhân vật. Vì vậy, có lẽ chúng ta nên đóng một câu hỏi khác (nó cũng có một câu trả lời được chấp nhận) như là một bản sao của câu hỏi này thay thế.
Erik the Outgolfer

Câu trả lời:


11

Brachylog , 4 3 byte

ġ=Ṁ

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

Giải trình

ġ=Ṁ    Implicit input, say "abcabc"
ġ      Split into chunks of equal lengths (except maybe the last one): ["abc","abc"]
 =     Apply the constraint that all of the chunks are equal,
  Ṁ    and that there are multiple of them.

Chương trình in true.nếu các ràng buộc có thể được thỏa mãn, và false.nếu không.


Tôi chỉ đang vật lộn thông qua việc cố gắng để có được một cái gì đó như ~j↙hoặc =Ṁclàm việc trước khi tôi nhận thấy bạn đã đăng bài này một giờ trước
Chuỗi không liên quan

4
Ồ, vâng, đây có thể là một byte ngắn hơn:ġ=Ṁ
Chuỗi không liên quan

( là một biến bị ràng buộc là một danh sách gồm hai hoặc nhiều phần tử)
Chuỗi không liên quan

1
@UnrelatedString Tuyệt vời, cảm ơn! Tôi đã không nghĩ để kiểm tra các trang wiki biến.
Zgarb

1
Rất nhiều câu trả lời tuyệt vời, và câu trả lời LUA có một vị trí đặc biệt trong trái tim tôi. Câu trả lời của Arnauld đặc biệt ngọt ngào vì câu hỏi ban đầu mà tôi dựa trên câu hỏi này (không phải bản dupe) thực sự được gắn thẻ Javascript. Chủ yếu chọn cái này chỉ vì nó có vẻ là ngắn nhất trong tất cả các ngôn ngữ và, vì đây là câu hỏi đầu tiên của tôi, tôi nhận được một huy hiệu.
ngerak

19

JavaScript (ES6), 22 byte

Trả về giá trị Boolean.

s=>/^(.*)\1+$/.test(s)

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


Không có biểu thức chính quy,  33  29 byte

Trả về một trong hai null(giả) hoặc một đối tượng (trung thực).

s=>(s+s).slice(1,-1).match(s)

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

NB: Về mặt kỹ thuật, S được chuyển đổi thành biểu thức chính quy cho match () , vì vậy tiêu đề trên là một lời nói dối.


9

grep, 19

grep -qxE '(.+)\1+'

Kiểm tra

while read; do 
  <<<"$REPLY" grep -qxE '(.+)\1+' && t="true" || t="false"
  echo "$REPLY: $t"
done < infile 

Đầu ra:

aa: true
aaa: true
abcabcabc: true
aba: false
ababa: false
weqweqweqweqweqw: false

9

Japt , 6 byte

²é ¤øU

Đã lưu một byte nhờ @Shaggy

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

        Implicit input, stored in variable 'U'
²       U+U, "abcabc" -> "abcabcabcabc"
 é      Rotate 1 char to the right "abcabcabcabc" -> "cabcabcabcab"
   ¤    Remove first two chars, "cabcabcabcab" -> "bcabcabcab"
    øU  Check if U is in the above

Đẹp một :) Bạn có thể thay thế p<space>bằng ²để lưu một byte.
Shaggy

9

Java, 25 24 byte

-1 byte nhờ Olivier Grégoire!
Chán câu trả lời regex

s->s.matches("(.+)\\1+")

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

Nó chỉ dài hơn 1 byte so với câu trả lời của con trăn aaaaa Tôi đang bị trói bây giờ :)


3
Bạn có thể xóa trận chung kết $matchesphương thức là một kết hợp chính xác, không phải là một chuỗi con phù hợp theo mặc định.
Olivier Grégoire

Tôi quên matchesthêm chính nó $vào regex. Cảm ơn!
Benjamin Urquhart

7

Excel, 26 byte

=FIND(A1,A1&A1,2)<=LEN(A1)

Đầu vào từ A1, xuất ra bất kỳ ô nào bạn đặt công thức này.


Bạn có thể lưu 4 byte nếu bạn xác định tên phạm vi một chữ cái (ví dụ A) và đặt tên đó làm đầu vào của bạn.
i_saw_drones

@i_saw_drones - Tôi nghĩ rằng không được phép theo quy tắc I / O tiêu chuẩn: đây là một liên kết đến câu trả lời meta sẽ áp dụng cho phương pháp đó; hiện tại nó ở mức -36 phiếu.
Sophia Lechner

Lời xin lỗi tôi đã không thấy bài đăng đó, mặc dù nghĩ về nó, đó A1cũng không phải là một "biến số" vì nó chứa giá trị đầu vào? :)
i_saw_drones

1
Tôi sẽ cảm thấy như vậy nếu tôi đang làm bất cứ điều gì đặc biệt với thực tế đó là A1, như thể tôi đã dựa vào ROW (_) bằng cách nào đó 1. Mặc dù vậy, đó chỉ là cách tự nhiên nhất để cung cấp chức năng Excel với một đầu vào tùy ý.
Sophia Lechner

7

R , 28 byte

grepl("(.+)\\1+$",scan(,''))

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

Phiên bản Regex đơn giản. R (đôi khi) rất giống với Python, vì vậy nó tương tự như câu trả lời regex Python 2 của TFeld, mặc dù ngắn hơn!

Câu hỏi (nếu ai biết câu trả lời)

Tôi vẫn bối rối tại sao điều này hoạt động, vì chuỗi con có thể dài bất kỳ và sẽ luôn hoạt động, và vẫn hoạt động khi tôi thêm một chữ cái vào trước một chuỗi hợp lệ, như "cABABABABAB". Nếu cá nhân tôi đọc regex, tôi thấy (.+), trong đó nắm bắt bất kỳ nhóm nào có độ dài bất kỳ. Và sau \\1+$đó lặp lại nhóm bị bắt bất kỳ số lần cho đến khi kết thúc.

Vậy tại sao nó không chỉ chụp "AB" và thấy rằng nó được lặp lại cho đến hết chuỗi, đặc biệt là vì không có giới hạn nào được chỉ định là nơi chuỗi con có thể bắt đầu?


1
Thật thú vị, đây dường như là một lỗi trong công cụ regex của R. Thêm tùy chọn perl=TRUElàm cho nó phù hợp với cABABAB, như bạn mong đợi. Chạy grep -E '(.*)\1+$'trong bash cũng phù hợp với cABABAB, mặc dù grep -Esử dụng ERE, cùng một hương vị regex R được cho là hỗ trợ.
Grimmy

2
Tôi đoán rằng đây là một tối ưu hóa được áp dụng không chính xác. Thay đổi .+khi bắt đầu một mẫu thành ^.+một tối ưu hóa quan trọng, nhưng nếu .+bên trong bắt giữ các parens thì nó sẽ không còn hiệu lực.
Grimmy


6

Thạch ,  5  4 byte

Bây giờ tôi thấy cách tối ưu là theo phương pháp của xnor !

Ḋ;Ṗw

Liên kết đơn âm chấp nhận danh sách các ký tự và xuất ra một số nguyên - độ dài ngắn nhất có thể của một lát lặp lại hoặc bằng 0 nếu không tồn tại. Lưu ý rằng số 0 là falsey trong khi số khác không là số thật trong Jelly.

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

Làm sao?

Ḋ;Ṗw - Link: list of characters, S   e.g. "abcabcabc"   or "abababa"
Ḋ    - dequeue S                           "bcabcabc"       "bababa"
  Ṗ  - pop from S                         "abcabcab"       "ababab"
 ;   - concatenate                "bcabcabcabcabcab"       "bababaababab"
   w - first index of sublist     3  ^---here!             0  (not found)






3

PowerShell, 23 24 byte

+1 byte để khớp hoàn toàn với các quy tắc

"$args"-match"^(.+)\1+$"

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

Khá nhàm chán. Dựa trên các câu trả lời khác của Regex. May mắn thay PowerShell không sử dụng \như một nhân vật thoát!


nó trở lại truechoaabcabc
mazzy

1
@mazzy vừa sửa!
Gabriel Mills

3

C # (Trình biên dịch tương tác Visual C #) , 70 byte

thích ứng không biết xấu hổ của xnor ( 46 byte )

s=>(s+s).Substring(1,s.Length*2-2).Contains(s)

Giải pháp phi Regex của tôi:

s=>s.Select((x,y)=>y).Count(z=>s.Replace(s.Substring(0,z+1),"")=="")>1

Giải trình:

Thay thế mọi chuỗi con có thể bắt đầu ở chỉ số 0 bằng một chuỗi trống. Nếu kết quả là một chuỗi rỗng, chuỗi hoàn toàn được tạo từ chuỗi con đó. Vì điều này bao gồm việc đánh giá toàn bộ chuỗi với chính nó, lượng kết quả dự kiến ​​phải lớn hơn 1.

Ví dụ: abcabc

Các chuỗi con có thể bắt đầu từ chỉ số 0:

'a', 'ab', 'abc', 'abca', 'abcab', 'abcabc'

Nếu chúng ta thay thế chúng bằng các chuỗi trống

Substring          Result

'a'         =>     'bcbc'
'ab'        =>     'cc'
'abc'       =>     ''
'abca'      =>     'bc'
'abcab'     =>     'c'
'abcabc'    =>     ''

Vì có một chuỗi con khác ngoài 'abcabc' trả về một chuỗi trống, nên chuỗi hoàn toàn được tạo từ một chuỗi con khác ('abc')

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


3

Python 3 , 62 60 56 54 byte

-4 byte sox đến ArBo

lambda s:s in(len(s)//l*s[:l]for l in range(1,len(s)))
  1. Lặp lại tất cả các tiền tố có thể có trong chuỗi.
  2. Cố gắng xây dựng chuỗi ra khỏi tiền tố.
  3. Trả về việc này có thành công với bất kỳ tiền tố nào không.

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


1
Câu trả lời tốt đẹp! Có f=thể được thả; chức năng ẩn danh thường được cho phép. Ngoài ra, bằng cách chuyển sang Python 2 và kiểm tra tư cách thành viên của danh sách thay vì anycấu trúc, bạn có thể nhận được tới 55 byte
ArBo

1
Bắt đẹp với danh sách thành viên, thanx! Tôi sẽ không chuyển sang Python 2, vì điều này giống như chuyển đổi ngôn ngữ, điều này rõ ràng không phải là vấn đề ở đây;) Ngoài ra, có cách nào thuận tiện để kiểm tra một hàm ẩn danh trong TIO, giữ số đếm byte không?
Movatica

1
@movatica Trong tiêu đề, đặt `f =` (\ là ký tự tiếp tục dòng trong python)
Artemis hỗ trợ Monica

Khó chịu, \ cũng là một nhân vật thoát. Ở đây, không có định dạng mã, là những gì bạn nên đặt trong tiêu đề: f = \
Artemis hỗ trợ Monica

2

Japt , 10 byte

Trả về một số dương nếu trung thực và 0 nếu falsey. Nếu bạn muốn một đầu ra bool chỉ cần thêm cờ

å+ k@rXÃÊÉ

å+ k@rXÃÊÉ      Full program. Implicit input U.
                    e.g: U = "abcabcabc"
å+              Take all prefixes 
                         U = ["a","ab","abc","abca","abcab","abcabc","abcabca","abcabcab","abcabcabc"]
   k@           Filter U by:
     rXÃ        Values that return false (empty string)
                when replacing each prefix in U
                e.g: ["bcbcbc","ccc","","bcabc","cabc","abc","bc","c",""]
                                take ↑                             and ↑
                     U = ["abc","abcabcabc"]
         ÊÉ     Get U length and subtract 1. Then return the result

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


2

Husk , 6 byte

Ṡ€ȯhtD

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

Tôi cảm thấy như đây là một byte nhiều hơn tối ưu, nhưng tôi không thể tìm thấy một sự sắp xếp làm cho bố cục rõ ràng ȯkhông cần thiết.

Giải trình

Ṡ€      Find the argument in the result of applying the following function to the argument
  ȯhtD  Duplicate the argument, then remove the first and last elements.

2
€htD¹tránh được ȯ.
Zgarb

Điều đó thật tuyệt! Tôi đã nghĩ về λ€htD¹nhưng tôi không nhận ra rằng lambdas sẽ được thêm vào ngầm
Sophia Lechner

2

Toán học 11.x, 74 byte

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&

trong đó, xuyên suốt, #đại diện cho chuỗi đầu vào và

StringCases[#,<pattern>]

tìm chuỗi con của chuỗi đầu vào khớp với mẫu

StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="") 

Mẫu này yêu cầu khớp, xphải bắt đầu khi bắt đầu chuỗi và phải thỏa mãn điều kiện (1) khớp không phải là toàn bộ chuỗi đầu vào và (2) nếu chúng ta thay thế các lần xuất hiện của khớp trong chuỗi đầu vào bằng chuỗi trống chúng ta thu được chuỗi rỗng. Cuối cùng, so sánh danh sách các trận đấu với danh sách trống,

{}!=

Truenếu danh sách các trận đấu là không trống và Falsenếu danh sách các trận đấu trống.

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

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aaa"]
(*  True  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["abcabc"]
(*  True  *)

{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["aba"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["ababa"]
(*  False  *)
{}!=StringCases[#,StartOfString~~x__/;(x!=#&&StringReplace[#,x->""]=="")]&["weqweqweqweqweqw"]
(*  False  *)

2

Python 3, 84 byte

import textwrap
lambda s:any(len(set(textwrap.wrap(s,l)))<2 for l in range(1,len(s)))

Sử dụng textwrap.wrap(nhờ câu trả lời này ) để chia chuỗi thành các phần có độ dài nđể kiểm tra từng độ dài có thể lặp lại của chuỗi con. Các mảnh tách sau đó được so sánh với nhau bằng cách thêm chúng vào một bộ. Nếu tất cả các phần bằng nhau và tập hợp có độ dài 1, thì chuỗi phải là một chuỗi lặp lại. Tôi đã sử dụng<2 thay ==1vì bởi vì nó tiết kiệm một byte và độ dài của chuỗi đầu vào được đảm bảo lớn hơn 0.

Nếu không có nchuỗi con lặp lại nào ntạo thành toàn bộ chuỗi, thì trả về false cho toàn bộ hàm.


2

05AB1E , 5 byte

Phương pháp của xnor từ câu hỏi trước dường như cũng tối ưu trong 05AB1E.

«¦¨så

Hãy thử trực tuyến! hoặc như một thử nghiệm

Giải trình

«       # append input to input
 ¦¨     # remove the first and last character of the resulting string
   så   # check if the input is in this string

1
Tất nhiên .. tôi chuẩn bị trả lời 05AB1E khi tôi thấy không có ai ở đó. Đồng nghiệp hỏi tôi một số câu hỏi và nói về kỳ nghỉ của anh ấy. Tôi nhìn lại màn hình: một câu trả lời mới. Tada, đánh lại XD
Kevin Cruijssen

@KevinCruijssen: Đó là điển hình. Đã xảy ra với tôi rất nhiều lần;)
Emigna

2

Sạch sẽ , 73 byte

Không sử dụng regex.

import StdEnv,Data.List
$s=or[isPrefixOf s(cycle t)\\t<-tl(tails s)|t>[]]

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

Định nghĩa $ :: [Char] -> Bool.
Kiểm tra xem chuỗi đã cho có phải là tiền tố của sự lặp lại của bất kỳ chuỗi con nào được lấy từ cuối không.


2

C ++ (gcc) , 36 byte

#define f(x)(x+x).find(x,1)<x.size()

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

Một cổng khác của giải pháp xnor. Sử dụng một macro để mở rộng đối số vào biểu thức. Đối số được coi là loại std::string.


1

Biến QlikView, 27 byte

Điều này nên được định nghĩa là một biến, sau đó cho phép bạn truyền tham số, ví dụ $1như giá trị đầu vào của bạn.

Nó trả về 0hoặc -1(tương đương với TRUE()chức năng của QlikView ).

=substringcount($1&$1,$1)>2

1

Swift, 196 byte

func r(s:String)->Bool{guard let k=s.dropFirst().firstIndex(where:{$0==s.first}) else{return false};let v=s[...k].dropLast();var w=v;while s.hasPrefix(w) && s.count>=(w+v).count{w+=v};return s==w}

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


Tôi không sử dụng Swift, nhưng tôi chắc chắn rằng có thể xóa khoảng trắng thêm
Benjamin Urquhart

193 byte sử dụng đề xuất của @ benjamin.
Artemis hỗ trợ Monica

@ArtemisFowl hoặc thậm chí 123 byte
Roman Podymov




1

T-SQL, 47 byte

Sử dụng phương pháp của @ Xnor :

DECLARE @ varchar(max)='ababab'

PRINT sign(charindex(@,left(@+@,len(@)*2-1),2))

Giữ câu trả lời cũ vì nó chứa một số golf tốt (67 byte):

DECLARE @y varchar(max)='abababa'

,@ INT=0WHILE
replace(@y,left(@y,@),'')>''SET
@+=1PRINT @/len(@y)^1

Giải thích: Tập lệnh này đang lặp lại cố gắng thay thế đầu vào '@y' bằng các ký tự '@' đầu tiên của đầu vào '@y' bằng không, trong khi tăng '@'.

nếu bạn thay thế 'ab' trong 'ababab' bằng không có gì thì bạn có một chuỗi trống

Cuối cùng kết quả sẽ trống rỗng. Nếu điều này xảy ra khi biến vòng lặp bằng độ dài của varchar, thì tiêu chí là false / 0 vì '@' = len (@y) (không có varchar lặp lại).

iif(@=len(@y),0,1)

có thể đánh gôn vào đây

@/len(@y)^1

bởi vì độ dài của '@y' không thể là 0 và '@' sẽ không bao giờ vượt quá độ dài @y.

Dùng thử trực tuyến

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.