Ripeti dopo di me!


23

Data una stringa come argomento, restituisce la lunghezza della sottostringa o delle ripetizioni ripetute non sovrapposte più lunghe o zero se non esiste tale stringa.

Si può presumere che la stringa di input non sia vuota.

Esempi

abcdefabc: la sottostringa abcviene ripetuta nelle posizioni 1 e 7, quindi il programma dovrebbe produrre 3

abcabcabcabcab: abcabco bcabcao cabcabvengono ripetuti, quindi il programma dovrebbe generare 6 . (anche la sottostringa abcabcabcabviene ripetuta, ma le occorrenze si sovrappongono, quindi non la accettiamo).

aaaaaaa: aaaviene ripetuto ad esempio nelle posizioni 1 e 4, quindi il programma dovrebbe produrre 3

abcda: aviene ripetuto, quindi il programma dovrebbe generare 1

xyz: nessuna stringa ripetuta → 0

ababcabcabcabcab: dovrebbe restituire 6

Questo è , quindi vince meno byte.


1
La stringa potrebbe essere vuota? In tal caso, sarebbe consentito generare False anziché 0 ?
Dennis,

@Dennis Puoi presumere che la stringa non sia vuota.
Arnaud,

Risposte:


9

Brainfuck, 226 byte

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

formattato:

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

Prevede l'input con o senza una nuova riga finale e genera il risultato come valore byte .

Provalo online.

Questo controlla ogni prefisso per vedere se si verifica successivamente nella stringa, quindi taglia il primo carattere e ripete il processo fino a quando non rimangono più caratteri.

Il nastro è diviso in nodi a 3 celle,

c 0 f

dove cè un carattere della stringa data ef è un flag che può essere uno, uno negativo o zero. I flag diversi da zero vengono posizionati tra i due caratteri attualmente confrontati e quelli negativi sono riservati alle celle dopo la fine del prefisso corrente e prima dell'inizio del suffisso corrente (ovvero prima dell'indice della corrispondenza potenziale corrente).

Il risultato viene archiviato a sinistra della stringa e viene aggiornato ogni volta che viene trovata una corrispondenza.

(La stringa viene effettivamente elaborata al contrario con un \x01allegato).


6

Gelatina , 12 byte

œ-QL€
ŒṖÇ€FṀ

Provalo online!

Come funziona

ŒṖÇ€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
Tutti salutano Jelly, il linguaggio del golf per eccellenza!
Nissa,

œ-Qè davvero pulito.
Lynn il

5

Perl 6 , 36 byte

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

Provalo

Allargato:

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

Sfida piuttosto interessante.

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

Provalo online

Spiegazione:

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

È possibile salvare due byte utilizzando M%`.come secondo stadio.
Martin Ender,

4

JavaScript (ES6), 79 68 66 byte

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>

Modifica: salvato 11 13 byte grazie a @Arnauld.


4

Haskell , 79 byte

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

Provalo online!


2
Sembra che il primo argomento di %possa accumulare una aaaxayaa
sottosequenza

Cosa ha detto @xnor. Penso che la chiamata ricorsiva a%dsia sbagliata, ma anche inutile. Il che significa anche che puoi usare maxinvece di maximum.
Ørjan Johansen,

1
Penso che cambiando a%dper ""%drisolverlo.
xnor

Oh giusto, è ancora necessario (e suono) quando aè vuoto.
Ørjan Johansen,

1
Penso che sum[1|(x,y)<-zip a c,x==y]possa essere usato al posto di 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

Buccia , 11 byte

L►L§fo↓2`xQ

Provalo online!

Nota: Husk è più recente di questa sfida.

Spiegazione

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 byte

10 byte salvati grazie a @JingHwan Min .

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

Funzione anonima. Accetta una stringa come input e restituisce un numero come output.


Non penso che tu abbia bisogno dell'inizio e della fine BlankNullSequence (___)quando Overlaps->Allc'è. Max@StringLength@StringCases[#,a___~~___~~a___:>a,Overlaps->All]&andrebbe bene.
JungHwan Min

@JungHwanMin Grazie, lo confondevo con StringReplace: P
LegionMammal978,

1

Pyth - 16 byte

Ho bisogno di giocare a golf convertendo tutte le stringhe in lunghezze e trovando il massimo.

eSlM+ksmft/dTd./

Test Suite .


1

Clojure, 112 byte

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

cicli doppiamente numeri 0a n - 1( nessendo la lunghezza della stringa), gocce jcaratteri, divide il resto in "inizio" e parti "finali". Crea un set di tutte le sottostringhe in elunghezza be lo utilizza come funzione per verificare se bsi trova da lì. Restituisce la lunghezza dib se trovato e 0 altrimenti, restituisce il massimo di questi valori.

Sarebbe interessante vedere una versione più breve.


1

Retina , 24 byte

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

Provalo online!

Un riscaldamento per me per imparare le nuove funzionalità di Retina 1.

Spiegazione

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

Una fase Elenco, restituisce tutte le corrispondenze per la regex (.*).*\1, che corrisponde a qualsiasi modello del modulo "ABA", dove A e B sono due sottostringhe arbitrarie (possibilmente vuote). Le opzioni aggiuntive fornite a questo stadio sono v, che considera le partite sovrapposte e $che applica una sostituzione a ciascuna partita prima di restituirla: la sostituzione è indicata nella seconda riga e corrisponde alla lunghezza ( .) del primo gruppo di acquisizione ( quale sarebbe la sottostringa "A" nell'esempio precedente).

N`

Ora abbiamo tutte le lunghezze di sottostringhe ripetute, questa fase le ordina semplicemente in ordine numerico, dal più corto al più lungo.

G-1`

Infine, questo stadio grep ( G) mantiene solo l'ultimo (-1 ), che è la lunghezza della sottostringa ripetuta più lunga.


0

Javascript, 165 byte

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}

Casi test

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
Benvenuto in Programmazione di puzzle e codice golf. Sfortunatamente, questo restituisce 2 per l'input ababcabcabcabcab, ma la stringa cabcabviene ripetuta.
Dennis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.