私の後に繰り返して!


23

引数として文字列を指定すると、重複しない最長の重複部分文字列の長さ、またはそのような文字列がない場合はゼロを出力します。

入力文字列が空ではないと仮定できます。

abcdefabc:部分文字列abcは位置1と7で繰り返されるため、プログラムは3を出力する必要があります

abcabcabcabcababcabcまたはbcabcaまたはcabcab繰り返されるため、プログラムは6を出力します。(サブストリングabcabcabcabも繰り返されますが、オカレンスは重複するため、受け入れません)。

aaaaaaaaaaたとえば、位置1と4で繰り返されるため、プログラムは3を出力します。

abcdaaが繰り返されるため、プログラムは1を出力します。

xyz:繰り返し文字列なし→ 0

ababcabcabcabcab6を返す必要があります

これはなので、バイト数が最も少なくなります。


1
文字列は空ですか?その場合、0ではなくFalseを出力できますか?
デニス

@Dennis文字列が空ではないと仮定できます。
アルノー

回答:


9

brainfuck、226バイト

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

フォーマット済み:

,[<<<,]
+
[
  for each suffix
  >>->
  [
    for each prefix
    [
      for each suffix
      [
        for each char while no mismatch
        [
          >>[>>>]
          <+<-<[<<<]
          > >+<-
        ]
        >[<+>-]
        >[>>>]
        <<
        [
          mismatch
          >[<+>-]
        ]
        >
        [
          [<+>-]
          >+[<<<]
          >>>-
          [
            match
            +>[<<<]
            <
            [
              >+>[->]
              <<[<]
              >-
            ]
            >[<+> >+<-]
            >>>[>>>]
          ]
          >>
        ]
        <
      ]
      >+[,<<<+]
      ->[<<<]
      >>> >>+[,+>>>+]
      -[>>>]
      ->
    ]
    <[+<<<]
    +<<<++[->>>]
    +>>>->
  ]
  <[,<<<]
  <[>>>+<<<-]
  >+>,>>>
]
<<.

末尾の改行の有無にかかわらず入力を期待し、結果をバイト値として出力します

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

これにより、各プレフィックスが文字列の後半で発生するかどうかが確認され、最初の文字が切り取られ、残りの文字がなくなるまでプロセスが繰り返されます。

テープは3セルのノードに分割され、

c 0 f

where cは、指定された文字列の文字でありf、1、負の1、またはゼロのいずれかのフラグです。現在比較されている2つの文字の間にゼロ以外のフラグが配置され、負のフラグは現在のプレフィックスの末尾から現在のサフィックスの先頭まで(つまり、現在の一致のインデックスの前)に予約されます。

結果は文字列の左側に保存され、一致が見つかるたびに更新されます。

(文字列は、実際には逆に\x01追加されて処理されます。)


6

ゼリー、12バイト

œ-QL€
ŒṖÇ€FṀ

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

使い方

ŒṖÇ€FṀ  Main link. Argument: s (string)

ŒṖ      Generate all partitions of s.
  ǀ    Apply the helper link to each partition.
    F   Flatten the resulting array of lengths.
     Ṁ  Take the maximum.


œ-QL€   Helper link. Argument: P (partition)

  Q     Yield the elements of P, deduplicated.
œ-      Multiset subtraction; remove exactly one occurrence of each string in P.
   L€   Compute the lengths of the remaining strings. 

1
究極のコードゴルフ言語であるジェリー、すべてあられ!
ニッサ

œ-Q本当にすてきです。
リン

5

Perl 6、36バイト

{m:ex/(.*).*$0/.map(*[0].chars).max}

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

拡張:

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

  m           # match ( implicitly against 「$_」
  :exhaustive # every possible way
  /
    (.*)      # any number of characters ( stored in 「$0」 )
    .*
    $0
  /

  .map(

    *\        # the parameter to Whatever lambda
    [0]\      # the value that was in 「$0」 for that match
    .chars    # the number of characters

  ).max

}

5

網膜35 32 30バイト

かなりクールな挑戦。

M&!`(.*)(?=.*\1)
M%`.
O#^`
G1`

オンラインで試す

説明:

M&!`(.*)(?=.*\1)    # Prints overlapping greedy substrings occuring more than once
M%`.                # Replace each line with its length
O#^`                # Sort lines by number in reverse
G1`                 # Return the first line

M%`.2番目のステージとして使用すると、2バイトを節約できます。
マーティンエンダー

4

JavaScript(ES6)、79 68 66バイト

f=(s,r,l=s.match(/(.*).*\1/)[1].length)=>s?f(s.slice(1),l<r?r:l):r
<input oninput=o.textContent=f(this.value)><pre id=o>

編集:@Arnauldのおかげで11 13バイトを保存しました。


4

Haskell、79バイト

(""%)
(a:b)!(c:d)|a==c=1+b!d
_!_=0
a%c@(e:d)=maximum[a!c,""%d,(a++[e])%d]
_%_=0

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


2
これは、最初の引数のように見える%ために2のような偽陽性を与え、非連続的なサブシーケンスを蓄積することができるaaaxayaa
XNOR

@xnorが言ったこと。への再帰呼び出しa%dは間違っていると思いますが、不要でもあります。これは、のmax代わりに使用できることも意味しますmaximum
Ørjanヨハンセン

1
それa%d""%d修正するために変更すると思います。
-xnor

ああ、a空のときはまだ必要です(そして音)。
Ørjanヨハンセン

1
sum[1|(x,y)<-zip a c,x==y]代わりに使用できると思いますa!c
ライコニ


2

JavaScript、120

function r(a,b,m){return b=-~b,t=a.slice(0,b),n=a.indexOf(t,b),m=b>m&&!~n?m:b,a!=t&&r(a,b,m)||(a?r(a.slice(1),m,m):~-m)}

2

、11バイト

L►L§fo↓2`xQ

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

注:ハスクはこの課題よりも新しいものです。

説明

L►L§fo↓2`xQ  Implicit input, say x = "ababc"
          Q  Nonempty substrings: ["a","b","ab",..,"ababc"]
    f        Keep those that satisfy this:
              Take s = "ab" as an example.
   §    `x    Split x along s: ["","","c"]
     o↓2      Drop the first two pieces: ["c"]
              This is truthy (i.e. nonempty).
             Result is ["a","b","ab","a","b","ab"]
 ►L          Take element with maximal length: "ab"
             If the list is empty, "" is used instead.
L            Length: 2


1

Mathematica、75 65バイト

@JingHwan Minにより10バイト節約されました

Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&

匿名関数。入力として文字列を受け取り、出力として数値を返します。


私はあなたがそこにあるBlankNullSequence (___)ときに始まりと終わりが必要だとは思わないOverlaps->AllMax@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&結構です。
ジョンファンミン

@JungHwanMinありがとう、混乱していたStringReplace:P
LegionMammal978


1

Clojure、112バイト

#(apply max(for[R[(range(count %))]j R i R](let[[b e](split-at i(drop j %))](if((set(partition i 1 e))b)i 0)))))

(文字列の長さである)の数値0を2回ループし、文字をドロップし、残りを「開始」部分と「終了」部分に分割します。すべての部分文字列のセットを長さで作成し、そこから関数が見つかったかどうかを確認する関数として使用します。見つかった場合の長さを返し、それ以外の場合は0を返し、これらの値の最大値を返します。n - 1njebbb

短いバージョンを見るのは面白いでしょう。


1

網膜、24バイト

L$v`(.*).*\1
$.1
N`
G-1`

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

Retina 1の新機能を学ぶためのウォームアップ。

説明

L$v`(.*).*\1
$.1

Listステージ。これはregexのすべての一致を返します。これは(.*).*\1「ABA」という形式のパターンに一致します。AとBは2つの任意の部分文字列(空の場合もあります)です。このステージに与えられる追加オプションはv、重複する一致を考慮し、それを$返す前に各一致に置換を適用します:置換は2行目に示され.、最初のキャプチャグループの長さ()に対応します(前の例では部分文字列「A」になります)。

N`

これで、繰り返される部分文字列のすべての長さを取得できました。この段階では、単純に短いものから長いものへと番号順に並べ替えます。

G-1`

最後に、このgrepステージ(G)は最後の(-1)結果のみを保持します。これは、最も長く繰り返されるサブストリングの長さです。


0

Javascript、165バイト

function a(s){var l=s.length/2,z=1,f='';while(z<=l){var t=s.substr(0,z),c=0;for(var i=0;i<s.length;i++){if(s.substr(i,z)===t){c++;if(c>1){f=t}}}z++}return f.length}

テストケース

console.log(a('abcabcabcabc')) // Output 6
console.log(a('xyz'))          // Output 0
console.log(a('aaaaaaa'));     // Output 3
console.log(a('abcdefabc'));   // Output 3

2
プログラミングパズルとコードゴルフへようこそ。残念ながら、これはinputに対して2を返しますababcabcabcabcabが、文字列cabcabは繰り返されます。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.