sfondo
L'incidente è un linguaggio di programmazione abbastanza insolito, in quanto il suo elenco di token non è predeterminato, ma piuttosto inferito dall'input. Pertanto, il token di un programma di incidente può essere abbastanza difficile, soprattutto se si desidera farlo in modo efficiente. Questo compito consiste nel farlo da soli.
L'obiettivo
Al tuo programma verrà assegnata una stringa come input. Ecco l'algoritmo che Incident utilizza per tokenizzarlo:
- Identifica tutte le stringhe che si presentano come una sottostringa dell'input in esattamente tre modi (cioè ci sono esattamente tre occorrenze di quella stringa all'interno dell'input).
- Scarta una qualsiasi di queste stringhe che sono una sottostringa di un'altra di queste stringhe (ad esempio per l'input
ababab
, l'unica stringa rimanente sarebbeab
, nona
ob
, perchéa
eb
sono entrambe le sottostringhe diab
). - Elimina tutte le stringhe che si sovrappongono all'interno dell'input. (Ad esempio,
aaaa
contiene esattamente tre copie diaa
, ma queste copie si sovrappongono al secondo e al terzo carattere, quindi verrebbero scartate. Allo stesso modo, inabababa
, ci sono tre copie diab
e tre copie diba
, ma i caratteri dal secondo al sesto sono ciascuno al si sovrappongono anab
e aba
, quindi entrambiab
eba
verrebbero scartati). - Tutte le stringhe che rimangono a questo punto sono i token utilizzati dal programma. Metti in token l'input originale in una sequenza di questi token (a causa dello scarto nel passaggio precedente, ci sarà solo un modo per farlo). Tutti i caratteri nell'input che non fanno parte di alcun token vengono trattati come commenti e scartati.
Il tuo programma deve prendere una stringa come input e restituire la corrispondente tokenizzazione della stringa (un elenco di token, ognuno dei quali sono espressi come stringhe) come output. Inoltre, questo deve essere fatto almeno moderatamente in modo efficiente; in particolare, il programma deve essere eseguito in un tempo quadratico ("O (n²)") o superiore. (Per inciso, è quasi certamente possibile andare più veloce del quadratico, ma questo non è un algoritmo più veloce , quindi sentiti libero di usare l'algoritmo più test che puoi trovare che rientri nei limiti della complessità.)
chiarimenti
- Sebbene i programmi sugli incidenti possano in teoria contenere uno qualsiasi dei 256 ottetti, è accettabile ai fini di questa sfida per il tuo programma gestire solo input formati da ASCII stampabile (incluso lo spazio), più newline e tab. (Tutti i programmi sugli incidenti noti si limitano a questo sottoinsieme). Nota che spazio / newline / tab non sono speciali e possono apparire al centro dei token; L'incidente tratta tutti i 256 ottetti come opachi.
- La definizione di "tempo quadratico" è "se la dimensione dell'ingresso è raddoppiata, il programma funzionerà più lentamente di non più di una costante più un fattore di 4", cioè se t ( x ) è il tempo massimo impiegato dal programma elaborare un input di dimensione x , quindi deve esserci una costante k tale che t (2 x ) <4 t ( x ) + k per tutte le x . Tieni presente che il confronto delle stringhe richiede un tempo proporzionale alla lunghezza delle stringhe.
- Il tuo programma dovrebbe teoricamente essere in grado di gestire programmi di input di qualsiasi lunghezza se eseguito in una variante (possibilmente ipotetica) della tua lingua che ha memoria illimitata e utilizza numeri interi illimitati (va bene se il programma non riesce a raggiungere questo obiettivo quando eseguito nella pratica a causa di gli interi o la memoria del linguaggio sono in realtà finiti in modo molto grande). Si può presumere (ai fini del calcolo della complessità) che numeri interi non superiori alla lunghezza dell'input possano essere confrontati in tempo costante (sebbene si tenga presente che se si utilizzano valori più grandi, ad esempio a causa della conversione dell'input in un singolo intero, impiegheranno un certo tempo per confrontare proporzionale al numero di cifre che hanno).
- Puoi utilizzare qualsiasi algoritmo che rientri nei limiti di complessità, anche se non segue gli stessi passaggi dell'algoritmo pubblicato sopra, purché produca gli stessi risultati.
- Questo enigma riguarda il tokenizzazione dell'input, non in realtà la formattazione dell'output. Se il modo più naturale di generare un elenco nella tua lingua prevede un formato ambiguo (ad esempio separato da una nuova riga quando le stringhe contengono nuove righe letterali o senza delimitatori tra le stringhe), non preoccuparti del fatto che l'output risulti ambiguo ( fintanto che l'elenco è effettivamente costruito). Potresti voler creare una seconda versione del tuo invio che produca risultati inequivocabili, per facilitare i test, ma la versione originale è la versione che conta per il punteggio.
Caso di prova
Per la seguente stringa di input:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
il programma dovrebbe produrre il seguente elenco di output:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
Condizione di vittoria
Si tratta di code-golf , quindi vince il programma più breve valido (ovvero corretto comportamento di input / output e sufficientemente veloce da eseguire), misurato in byte.