Benden sonra tekrar et!


23

Argüman olarak bir dize verilirse, üst üste binmeyen, tekrarlanan alt dizelerin uzunluğunu veya böyle bir dize yoksa, çıktısını alın.

Giriş dizesinin boş olmadığını kabul edebilirsiniz.

Örnekler

abcdefabc: Subring abc1 ve 7 pozisyonlarında tekrarlanır, bu nedenle programın 3 çıkışı vermesi gerekir.

abcabcabcabcab: abcabcveya bcabcaveya cabcabtekrarlanır, böylece program 6 vermelidir . (Subring abcabcabcabde tekrarlanır, ancak olaylar üst üste gelir, bu yüzden kabul etmiyoruz).

aaaaaaa: aaaörneğin 1 ve 4 konumlarında tekrarlanır, bu nedenle programın 3 çıkışı vermesi gerekir.

abcda: atekrarlanır, böylece program 1 çıkmalıdır

xyz: tekrarlanan dize yok → 0

ababcabcabcabcab: 6 dönmeli

Bu , yani en az bayt kazanır.


1
Dize boş olabilir mi? Bu durumda, 0 yerine False çıkmasına izin verilir mi?
Dennis,

@Dennis Dize boş olmadığını kabul edebilirsiniz.
Arnaud

Yanıtlar:


9

brainfuck, 226 bayt

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

biçimlendirilmiş:

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

Sondaki yeni satırlı veya satırsız girişi bekler ve sonucu bir bayt değeri olarak verir .

Çevrimiçi deneyin.

Bu, her dizeyi daha sonra dizgede olup olmadığını kontrol eder, sonra ilk karakteri keser ve daha fazla karakter kalmayıncaya kadar işlemi tekrarlar.

Bant, 3 hücreli düğümlere ayrılır,

c 0 f

burada cverilen dizgenin bir karakteri ve fbir, negatif veya sıfır olabilen bir bayrak. Sıfır olmayan bayraklar, şu anda karşılaştırılan iki karakter arasına yerleştirilir ve negatif olanlar, geçerli ön ekin bitiminden sonra ve mevcut son ekin başlangıcından önce (yani, geçerli potansiyel eşleşmenin dizininden önce) hücreler için ayrılır.

Sonuç dizginin solunda saklanır ve bir eşleşme bulunduğunda güncellenir.

(Dize aslında \x01eklenmiş olarak tersten işlenir .)


6

Jöle , 12 bayt

œ-QL€
ŒṖÇ€FṀ

Çevrimiçi deneyin!

Nasıl çalışır

ŒṖÇ€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
Tüm dolu Jelly, nihai kod golf dili!
Nissa

œ-Qgerçekten çok temiz.
Lynn,

5

Perl 6 , 36 bayt

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

Dene

Expanded:

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

Retina , 35 32 30 bayt

Oldukça güzel bir meydan okuma.

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

Çevrimiçi deneyin

Açıklama:

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%`.İkinci aşama olarak kullanarak iki bayt kaydedebilirsiniz .
Martin Ender

4

JavaScript (ES6), 79 68 66 bayt

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>

Düzenleme: @Arnauld sayesinde 11 13 bayt kaydedildi.


4

Haskell , 79 bayt

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

Çevrimiçi deneyin!


2
Bu ilk argüman benziyor %için 2 gibi yanlış pozitif veren bir bitişik olmayan altdiziyi birikebilir aaiçinde axayaa,
XNOR

@ Xnor ne dedi. Özyinelemeli çağrı a%dyanlış, ama aynı zamanda gereksiz olduğunu düşünüyorum . Bu da maxyerine kullanabileceğiniz anlamına gelir maximum.
Ørjan Johansen

1
Ben değiştirmeyi düşünüyorum a%diçin ""%do düzeltmeleri.
xnor

Oh doğru, aboşken hala gerekli (ve ses) .
Ørjan Johansen

1
Bunun sum[1|(x,y)<-zip a c,x==y]yerine kullanılabileceğini düşünüyorum a!c.
Laikoni


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

Kabuğu , 11 bayt

L►L§fo↓2`xQ

Çevrimiçi deneyin!

Not: Husk bu mücadeleden daha yeni.

açıklama

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 bayt

@JingHwan Min nedeniyle kaydedilmiş 10 bayt .

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

Anonim işlev Bir dizeyi girdi olarak alır ve sayıyı çıktı olarak döndürür.


Sana başlangıç ve bitiş gerek olduğunu sanmıyorum BlankNullSequence (___)zaman Overlaps->Allyoktur. Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&sadece iyi olurdu.
JungHwan Min

@JungHwanMin Teşekkürler, onunla karıştırıyordu StringReplace: P
LegionMammal978

1

Pyth - 16 bayt

Tüm telleri uzunluğa dönüştürmek ve maksimum değeri bulmak için golf oynamalıyım.

eSlM+ksmft/dTd./

Test Takımı .


1

Clojure, 112 bayt

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

sayılar 0üzerinden n - 1( ndizginin uzunluğu) iki kez ilmek alır , jkarakterleri bırakır ve geri kalanı "başlangıç" ve "bitiş" bölümlerine ayırır. Tüm alt dizeleri bir dizi oluşturur euzunlukta bve kontrol etmek için bir fonksiyon olarak kullanır boradan bulunur. Bulunursa uzunluğu, baksi takdirde 0 döndürür, bu değerlerin maks.

Kısa versiyonunu görmek ilginç olurdu.


1

Retina , 24 bayt

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

Çevrimiçi deneyin!

Retina 1'in yeni özelliklerini öğrenmek benim için bir ısınma.

açıklama

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

Bir Liste aşaması, bu, regex için tüm eşleşmeleri döndürür; bu (.*).*\1, "ABA" formundaki herhangi bir şablonla eşleşir, burada A ve B, iki isteğe bağlı alt dizgidir (muhtemelen boş). Bu aşamaya verilen ilave seçenekler v, örtüşen kibritleri dikkate alan ve $geri dönmeden önce her bir eşleşmeye oyuncu değişikliği uygulayanlardır: ikame ikinci satırda gösterilir .ve birinci yakalama grubunun () uzunluğuna karşılık gelir önceki örnekte "A" alt dizgisi olacaktır).

N`

Şimdi tekrarlanan alt dizgilerin tüm uzunluklarına sahibiz, bu aşama onları en kısadan en uzun zamana kadar sayısal sırayla sıralar.

G-1`

Son olarak, bu grep stage ( G) yalnızca -1en uzun tekrarlanan alt dizenin uzunluğu olan son ( ) sonucu tutar .


0

Javascript, 165 bayt

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}

Test Kılıfları

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
Programming Puzzles & Code Golf'a hoş geldiniz. Ne yazık ki, bu girdi için 2 döndürür ababcabcabcabcab, ancak dize cabcabtekrarlanır.
Dennis,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.