Obbiettivo
Scrivere una routine che accetta una stringa di caratteri ASCII stampabili, s , e restituisce una stringa contenente gli stessi caratteri s , riordinate in modo che non ci sono due caratteri sottostringa appare più di una volta. Il programma deve elaborare tutte le stringhe di benchmark (vedi sotto) in meno di un minuto ciascuna su un computer moderno . Assegnerò anche un bonus speciale di 50 ripetitori alla risposta con il punteggio più basso che elabora qualsiasi stringa valida di 30 caratteri in meno di un minuto.
Ad esempio, dato l'input Mississippi
, un output valido sarebbe issiMspiips
(nessuna sottostringa a due caratteri appare due volte), mentre un output non valido sarebbe ipMsispiiss
(poiché la sottostringa is
appare due volte).
La routine può assumere la forma di:
- un programma completo che legge dalla
stdin
(o equivalente) o dalla riga di comando e che emettestdout
(o equivalente) - una funzione che accetta un singolo argomento stringa e restituisce una stringa
Si può presumere che la stringa di input ammetta sempre almeno un output valido.
La sfida
La routine deve comprendere 5 o più righe di codice separate da newline. Le righe vuote (che includono righe contenenti solo spazi bianchi) vengono ignorate in tutti i contesti e non vengono conteggiate nel conteggio totale delle righe.
Lo scambio di due righe qualsiasi nel codice sorgente deve produrre un errore irreversibile. Per "errore fatale", ci riferiamo a una delle seguenti condizioni:
- la compilazione del codice sorgente non riesce, con il compilatore / interprete che dichiara un errore fatale
- la routine si interrompe con un errore irreversibile di runtime o un'eccezione di runtime non gestita
- la routine viene forzata in una chiusura improvvisa e anormale del programma che non produce alcun output di alcun tipo se non per un possibile messaggio di errore e / o dump dello stack
In alternativa , al posto delle righe possono essere utilizzati blocchi di codice contigui che non contengono caratteri di nuova riga. Ciascuno di questi blocchi dovrebbe essere visualizzato sulla propria riga nel file sorgente, con la consapevolezza che le nuove righe vengono rimosse prima che il codice sorgente venga compilato / interpretato.
Ad esempio, il codice
aaaa
bbbb
cccc
si condenserebbe
aaaabbbbcccc
prima di essere valutato.
In questa modalità, la condizione di errore irreversibile si applica allo scambio di due blocchi di codice (e quindi allo scambio di righe nel codice sorgente prima che vengano rimosse le nuove righe). Quindi nell'esempio sopra le routine aaaaccccbbbb
, bbbbaaaacccc
e ccccbbbbaaaa
devono tutti produrre errori fatali, sia in fase di compilazione che in fase di esecuzione.
Gli invii che utilizzano questa modalità alternativa devono dichiararne l'utilizzo.
punteggio
Sia n il numero di righe di testo non vuote nel file di origine, con n ≥ 5. Sia c il numero di byte compreso dalla riga di testo più lunga (in base alla lunghezza dei byte) nel file di origine, senza contare alcuna riga successiva.
Il punteggio di un invio è dato da c ( n + 10).
La presentazione con il punteggio più basso è il vincitore.
Buona fortuna. ;)
Stringhe di benchmark
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
Mspiisiipss
valido poiché l'unica ripetizione è in ii
cui non si verifica Mississippi
?
CooliO
, l'uscitaoOoCli
?