Calcola le esecuzioni di una stringa


11

Considera le seguenti definizioni tratte da Il numero di esecuzioni in una stringa di W. Rytter. Nota che parola, stringa e sottostringa sono approssimativamente sinonimi.

Un'esecuzione in una stringa è un segmento periodico non allungabile (con lo stesso periodo minimo) in una stringa.

Un punto p di una parola w è un numero intero positivo p tale che w [i] = w [i + p] ogni volta che vengono definiti entrambi i lati di questa equazione. Let per (w) indica la dimensione del periodo più piccolo di w. Diciamo che una parola w è periodica iff per (w) <= | w | / 2.

Ad esempio, considera la stringa x = abcab. per(abcab) = 3come x[1] = x[1+3] = a, x[2]=x[2+3] = be non v'è alcun periodo più piccolo. La stringa non abcabè pertanto periodica. Tuttavia, la stringa ababè periodica secondo (abab) = 2.

Una corsa (o massima periodicità) in una stringa w è un intervallo [i ... j] con j> = i, tale che

  • w [i ... j] è una parola periodica con il periodo p = per (w [i ... j])
  • È massimo. Formalmente, né w [i-1] = w [i-1 + p] né w [j + 1] = w [j + 1-p]. Informalmente, la corsa non può essere contenuta in una corsa più grande con lo stesso periodo.

Indicare con RUNS (w) il set di percorsi di w.

Esempi

Le quattro serie di atattattsono [4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt.

La stringa aabaabaaaacaacaccontiene le seguenti 7 esecuzioni:

[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = acac, [1,8] = aabaabaa, [9 , 15] = aacaaca.

L'output dovrebbe essere un elenco di esecuzioni. Ogni esecuzione deve specificare l'intervallo che rappresenta ma non è necessario generare la sottostringa stessa. La formattazione esatta può essere ciò che è conveniente per te.

Gli esempi usano l'indicizzazione 1 ma sei libero di usare l'indicizzazione 0 invece se è più conveniente.

COMPITO

Scrivi il codice che ha dato una stringa w, output RUNS (w).

Lingue e input

Puoi usare qualsiasi lingua ti piaccia e prendere la stringa di input in qualunque forma sia più conveniente. Devi comunque fornire un programma completo e dovresti mostrare un esempio del tuo codice in esecuzione sull'input di esempio.


4
Bella sfida, ma c'è una buona ragione per annullare le funzioni predefinite e non consentire?
Martin Ender,

@MartinEnder È solo la mia preferenza. Rende più facile per le persone semplicemente copiare e incollare il codice e provarlo da soli, il che a sua volta rende le risposte più interessanti per più persone.

4
Ma ciò causa anche un sacco di codice ambientale, il che rende la concorrenza sleale per le lingue con una sintassi dettagliata. Ad esempio, non giocherei a golf a Java se dovessi scrivere class A{public static ...}ogni volta che volevo giocare a golf
Bassdrop Cumberwubwubwub il

@BassdropCumberwubwubwub Vedo che ci sono pro e contro. Mi capita di soppesare i professionisti più fortemente. Penso che sia molto interessante confrontare la lunghezza delle risposte golf in lingue simili in ogni caso piuttosto che confrontare APL con Python per esempio.

"una corsa è massima se non è completamente contenuta in una corsa più grande" ma nel tuo primo esempio [7,8] è completamente contenuta in [2,8]. O stai parlando rigorosamente di piste che ripetono la stessa sottostringa?
Aditsu ha smesso perché SE è MALE

Risposte:


2

Pyth, 38 byte

{smm,hk+ekdfgaFTdcx1xM.ttB+0qVQ>QdZ2Sl

  m                                 SlQ   map for d in [1, …, len(input)]:
                            qVQ>Qd          pairwise equality of input[:-d] and input[d:]
                        tB+0                duplicate this list, prepending 0 to one copy
                      .t          Z         transpose, padding with 0
                    xM                      pairwise xor
                  x1                        find all occurrences of 1
                 c                 2        chop into groups of 2
           f                                filter for groups T such that:
             aFT                              the absolute difference between its elements
            g   d                             is greater than or equal to d
   m                                        map for groups k:
     hk                                       first element
    ,  +ekd                                   pair with the last element plus d
 s                                        concatenate
}                                         deduplicate

Suite di test


Ottengo "[[3, 5], [6, 8], [0, 4], [1, 8]]" da "atattatt". [3,5] rappresenta "tt"? Sarebbe bello se potessi spiegare l'algoritmo che hai usato anche ad alto livello.

@Lembik Sì, [i, j]rappresenta la partenza fetta tra i caratteri (0-indicizzati) i-1ed ie termina tra i caratteri j-1e j. Questa è la convenzione standard in Pyth e nelle lingue più sane, come dovrebbe essere (vedi qui e qui ).
Anders Kaseorg,

Grande. È possibile descrivere la tua soluzione in modo intuitivo? Purtroppo non posso decodificarlo dalla descrizione del tuo codice.

1
@Lembik Supponiamo di cercare periodi del periodo d. Troviamo tutti i luoghi in cui carattere i corrisponde a carattere i + d. Troviamo quindi corse di almeno d posizioni consecutive. Ripetere l'operazione per tutti d. Dobbiamo deduplicare alla fine perché il periodo reale potrebbe essere stato solo un divisore di d.
Anders Kaseorg,

1

CJam, 66

q:A,2m*{~A>_@)_@<2*@@2*<=},{_2$-2>2,.+={+}&}*]{[_1=\)\0=2*)+]}%_&p

Provalo online

Breve spiegazione:

L'algoritmo funziona in 4 fasi (le prime 3 corrispondono ai 3 blocchi principali che puoi osservare):

  1. Trova tutte le coppie [indice di lunghezza] che corrispondono a una sottostringa duplicata (come un aba aba aaacaacac); queste sono parti di piste.
  2. Coppie concatenate che fanno parte della stessa serie, ovvero indici consecutivi e stessa lunghezza / periodo.
  3. Costruisci le esecuzioni effettive, prendendo l'indice minimo e l'indice massimo + 2 * lunghezza - 1.
  4. Alla fine, rimuovere le esecuzioni duplicate (che sono lo stesso intervallo ottenuto con un periodo diverso)

Mi piacerebbe giocare a golf di più, quindi tutto è soggetto a modifiche.


Grazie per questo. Potresti spiegare l'algoritmo che hai usato anche per favore?

1
@Lembik ok, aggiornato
aditsu è uscito perché SE è EVIL il
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.