繰り返しますか?


20

同等の連続する2つの部分文字列が含まれている場合、文字列は繰り返されます。

たとえば、2034384538452含まれているとおりに繰り返す3845、連続 2回ます。

したがって、あなたの課題は、文字列に繰り返し部分文字列が含まれているかどうかを判断することです。入力は文字列または文字の配列として取得できます。

空の入力を受け取ることはありません。また、部分文字列の長さ(存在する場合)は1以上になる場合があります。

私が使用1し、0ここに私のtruthyとfalsy値として、しかし、あなたは限り、彼らはあなたの言語でtruthyとfalsyあるとして、異なる値を使用することができます。

例:

abcab -> 0
bdefdefg -> 1
Hello, World! -> 1
pp.pp/pp -> 1
q -> 0
21020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021012102012101202102012021012102012021020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120210121020120210201210120210201202101210201210120210121020120210201210120210121020121012021020120210121020121012021012102012021020121012021020120210121020120210201210120210121020121012021020120 -> 0

(最後の例は、Thue-Morseシーケンスの各ゼロ間の1の量から生成されました)


2
それらがまだ適切に真実または偽である限り、矛盾した値を使用できますか?
エリックアウトゴルファー

@EriktheOutgolferもちろん
-Okx

@trichoplax彼は、長さが1以上の連続したサブシーケンスを意味すると思います。
Erik the Outgolfer

@EriktheOutgolfer「連続」は私が見逃した言葉でした。ありがとう-それは今、完全に理にかなっています。
-trichoplax

偽の場合は1を出力し、真実の場合は0を出力できますか?
Kritixiリソス

回答:




7

ゼリー6 5バイト

Ẇµ;"f

これは完全なプログラムです。TIOは、切り捨てずに最後のテストケースを処理することはできません。

オンラインでお試しください!(最後のテストケースは250桁に切り捨てられます)

使い方

Ẇµ;"f  Main link. Argument: s (string)

Ẇ      Words; generate all substrings of s.
 µ     New chain. Argument: A (substring array)
  ;"   Vectorized concatenation; concatenate each substring with itself.
    f  Filter; keep "doubled" substrings that are also substrings.
       This keeps non-empty string iff the output should be truthy, producing
       non-empty output (truthy) in this case and empty output (falsy) otherwise.

5

Mathematica、32バイト

StringMatchQ[___~~x__~~x__~~___]

これには、繰り返し文字列のサブセグメントが隣接している必要はありませんか?
-DavidC

1
@Svetlana、あなたは正しいです!私はabcab-> 0を考慮していませんでした。
-DavidC

1
StringContainsQ[x__~~x__]そして!StringFreeQ[#,x__~~x__]&両方とも短いです。
ngenisis



4

Python、38バイト

import re
re.compile(r'(.+)\1').search

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

あくび、正規表現。文字列に、.+キャプチャされたのと同じ文字列が続く1つ以上の文字の文字列が含まれているかどうかを確認します。で確認できるように、少なくとも1つの一致がある場合、出力検索オブジェクトはTruthyですbool

compileここを使用すると、ラムダの記述を節約できます。

lambda s:re.search(r'(.+)\1',s)

Python、54バイト

f=lambda s:s>''and(s in(s*2)[1:-1])|f(s[1:])|f(s[:-1])

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

以下のようにチェックさs in(s*2)[1:-1]れた、連結された2つ以上の等しい文字列で構成される部分文字列を検索しますこの回答のます。部分文字列は、最初の文字または最後の文字のいずれかをカットすることを選択することにより、再帰的に生成されます。これは指数関数であるため、大規模なテストケースではタイムアウトになります。

ニアミス:

f=lambda s,p='':s and(s==p)*s+f(s[1:],p+s[0])+f(s[:-1])
f=lambda s,i=1:s[i:]and(2*s[:i]in s)*s+f(s[1:])+f(s,i+1)

最初のものはin、サブストリングのチェックにPythonを使用しないため、他の言語に適合させることができます。


4

Pyth- 10 9 8バイト

f}+TTQ.:

すべての繰り返し部分文字列のリストを返します(存在しない場合は空のリストになり、偽りになります)

それを試してみてください

説明:

f}+TTQ.:
      .:    # All substrings of the input (implicit):
f           # filter the list of substrings T by whether...
  +TT       # ...the concatenation of the substring with itself...
 }   Q      # ...is a substring of the input

1
入力が引用符でf}+TTQ.:
囲ま




2

Perl 6、11バイト

{?/(.+)$0/}

試して

拡張:

{        # bare block lambda with implicit parameter 「$_」

  ?      # Boolify the following
         # (need something here so it runs the regex instead of returning it)

  /      # a regex that implicitly matches against 「$_」
    (.+) # one or more characters stored in $0
     $0  # that string of characters again
  /
}

2

PHP、32バイト

<?=preg_match('#(.+)\1#',$argn);

でパイプとして実行し-Fます。申し訳ありませんが、私はあなたが同じことを投稿したことに気づいていませんでした

非正規表現バージョン、84 82バイト

    for($s=$argn;++$e;)for($i=0;~$s[$i];)substr($s,$i,$e)==substr($s,$e+$i++,$e)&&die

0繰り返しの場合は戻りコードで終了し、なしの場合はタイムアウト(およびエラーで終了)します。でパイプとして実行し-nrます。
印刷可能なASCII入力を想定しています。交換する~a&任意のASCIIため。


1

JavaScript(ES6)、19バイト

s=>/(.+)\1/.test(s)

どう/(.+)\1/.test
ルーク

@Luke、それが私が持っているものです。
シャギー

@Shaggy私は彼/(.+)\1/.testが完全な提出として自分自身を意味すると信じています。
リーキー修道女

@Luke /(.+)\1/.testはバインドされていません(いいえthis)。f=/(.+)\1/.test;f('aa')たとえば、動作しません。あなたが必要になります/./.test.bind(/(.+)\1/)
アーティアー

ゴルフできる場所:::/(.+)\1/.test(15バイト)
ダウンゴート


1

V、6バイト

ø¨.«©±

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

テストスイート!

プログラムは0、偽の値に対して出力し、正の値に対して正の整数を出力します。

(小さなバグがあったため、1バイトを取得する必要があったことに注意してください。バグ修正後、置換できるようになります。 \x82

説明

ø                     " This is a recent addition to V. This command takes in a regex
                      " and replaces the line with the number of matches of the regex
 ¨.«©±                " The compressed regex. This decompresses to \(.\+\)\1

1

Japt、8 + 1 = 9 8バイト

f"(.+)%1

オンラインでお試しください。出力nullfalsyの、およびtruthyのすべての繰り返し文字列を含む配列。

説明

 f"(.+)%1
Uf"(.+)%1" # Implicit input and string termination
Uf         # Find in the input
  "(.+)%1" #   a sequence followed by itself
 f         # and return the matched substring
           # output the return value

一貫性のない出力値が許可されているためè、一致の数を返し、フラグをドロップするために使用できます。
シャギー

うん。また、一致を返さないため、フラグをドロップして一致自体を返すこともできますがnull、これは偽です。
ルーク

入力の00場合、出力します00。Japtでこれが真実であると確信していますか?
Okx

@Okx文字列"00"は。
ETHproductions

@Okx; これを試してください。-Qフラグ「prettyprints」を出力しますが、それは一つの文字列を含む配列だと見ることができるように。
シャギー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.