Il tuo capo ha recentemente appreso di questo interessante linguaggio di programmazione chiamato inglese . Ha avuto questa idea "rivoluzionaria", vuole codificare con te per raddoppiare i tassi di produzione! Dal momento che non è un esperto di tecnologia, vuole che tu scriva un compilatore per farlo in modo che anche lui possa programmare!
Ora, sei un programmatore pigro e malvagio e ovviamente non scriverai un programma per compilare questo linguaggio ridicolmente complesso. Invece, ti assicurerai che ci sia sempre un errore nel codice del tuo capo, in modo che non arrivi mai alla compilazione effettiva e sia bloccato a correggere errori grammaticali invece di scrivere codice.
La sfida è scrivere un programma che può essere eseguito dal terminale e accetta un percorso di file come argomento. Il programma deve:
- modificare l'input del file introducendo un refuso.
- Fai finta di fallire la compilazione a causa dell'incontro con il refuso che hai introdotto.
- L'esecuzione del programma su copie dello stesso file non dovrebbe introdurre lo stesso errore di battitura due volte di seguito.
Per illustrare la sfida, eseguendo il programma su questo file:
Take an array as input.
Sort the array.
Output the array.
dovrebbe produrre qualcosa sulla falsariga di
Error on line 1:
'Take an arqay as input.'
^
arqay is not a valid identifier.
e il file che hai detto al programma di compilare dovrebbe ora apparire come:
Take an arqay as input.
Sort the array.
Output the array.
Ecco alcuni dettagli sulle specifiche del programma:
Il tuo programma è autorizzato ad assumere che lo scambio di qualsiasi personaggio nel programma che il tuo capo immette per un diverso personaggio casuale causerà un errore grammaticale. Il tuo programma non dovrebbe usare caratteri non alfabetici per creare errori nel codice dei tuoi capi. Il tuo capo non userebbe mai un numero o un simbolo e scoprirà che qualcosa è in corso. Il tuo programma dovrebbe solo introdurre errori nelle parole del programma del tuo capo. Non modificare gli spazi nelle frasi o la punteggiatura. Il tuo programma non dovrebbe alterare il caso del programma che il tuo capo tenta di compilare, il che significa che errori come arQaynon sono validi. Questo impedisce errori come takeinvece di Takeaccadere o Arrayinvece di array. Il programma dovrebbe generare l'errore indicando innanzitutto a quale riga si trova l'errore:
Error on line <insert line number here>:
Dovrebbe quindi stampare la riga con l'errore all'interno dei 'simboli. Nella riga successiva dovrebbe posizionare un ^simbolo sotto la parola con l'errore, e infine dovrebbe avere del testo che descrive l'errore (questa parte dipende da te, puoi dire quello che vuoi lì purché descriva un errore).
Si può presumere che il file di input esista e che non sia vuoto. Puoi anche presumere che il file di input non abbia errori grammaticali prima di aggiungerne uno.
bonus:
-60 byte se gli errori introdotti dal codice non sono completamente casuali, ma basati su errori di battitura come in questa domanda.
-60 byte per almeno 5 diversi messaggi di errore, alternati casualmente.
-60 byte se il tuo programma ha una probabilità su 1 o meno di inviare un messaggio demotivazionale al tuo capo.
EDIT: il conteggio dei byte dei messaggi non conta per il tuo punteggio. (Grazie a Martin Büttner per questa buona idea)
Questo è code-golf, vince il conteggio dei byte più corto. Per favore, non golfare il contenuto del messaggio di errore, il tuo capo non sarà contento se non riesce a capire i messaggi di errore e ti chiederà di risolverli per lui.