Questo sito ha avuto molti problemi con l'implementazione di varie lingue nel tag interprete . Tuttavia, praticamente tutti erano lingue esoteriche che nessuno usa. È ora di creare un interprete per un linguaggio pratico che la maggior parte degli utenti qui probabilmente già conosce. Sì, è lo script della shell, nel caso in cui tu abbia problemi a leggere il titolo (non che tu abbia). (sì, ho intenzionalmente fatto questa sfida, dato che sono annoiato da linguaggi come GolfScript e Befunge che vincono tutto, quindi ho messo una sfida in cui un linguaggio di programmazione più pratico ha maggiori possibilità di vincere)
Tuttavia, lo script della shell è un linguaggio relativamente grande, quindi non ti chiederò di implementarlo. Invece, realizzerò un piccolo sottoinsieme di funzionalità di script di shell.
Il sottoinsieme che ho deciso è il seguente sottoinsieme:
- Esecuzione di programmi (i programmi conterranno solo lettere, tuttavia, anche se sono consentite virgolette singole)
- Argomenti del programma
- Virgolette singole (accettando qualsiasi carattere ASCII stampabile, inclusi spazi bianchi, esclusa virgoletta singola)
- Stringhe non quotate (che consentono lettere, numeri e trattini ASCII)
- Pipes
- Dichiarazioni vuote
- Istruzioni multiple separate da una nuova riga
- Trailing / leader / spazi multipli
In questa attività, è necessario leggere l'input da STDIN ed eseguire tutti i comandi richiesti. Puoi assumere in sicurezza un sistema operativo compatibile con POSIX, quindi non è necessaria la portabilità con Windows o qualcosa del genere. Puoi tranquillamente supporre che i programmi che non sono inviati ad altri programmi non leggano da STDIN. Puoi tranquillamente presumere che i comandi esistano. Puoi tranquillamente supporre che non verrà utilizzato nient'altro. Se alcune ipotesi sicure vengono interrotte, puoi fare qualsiasi cosa. Puoi tranquillamente assumere al massimo 15 argomenti e righe inferiori a 512 caratteri (se hai bisogno di un'allocazione esplicita della memoria o qualcosa del genere - darò davvero piccole possibilità di vincere per C, anche se sono ancora piccoli). Non è necessario ripulire i descrittori di file.
È possibile eseguire programmi in qualsiasi momento, anche dopo aver ricevuto la riga completa o al termine di STDIN. Scegli qualsiasi approccio tu voglia.
Testcase semplice che consente di testare la shell (notare lo spazio bianco finale dopo il terzo comando):
echo hello world
printf '%08X\n' 1234567890
'echo' 'Hello, world!'
echo heeeeeeelllo | sed 's/\(.\)\1\+/\1/g'
yes|head -3
echo '\\'
echo 'foo bar baz' | sed 's/bar/BAR/' | sed 's/baz/zap/'
Il programma sopra dovrebbe produrre il seguente risultato:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Non è consentito eseguire la shell stessa, a meno che non si disponga di argomenti per il comando (questa eccezione è stata fatta per Perl, che esegue il comando nella shell quando si inserisce solo l'argomento system
, ma sentirsi liberi di abusare di questa eccezione per gli altri anche le lingue, se riesci a farlo in un modo che salva i caratteri) o il comando che esegui è la shell stessa. Questo è probabilmente il problema più grande in questa sfida, poiché molte lingue hanno system
funzioni che eseguono la shell. Usa invece le API di lingua che richiamano direttamente i programmi, come il subprocess
modulo in Python. Questa è comunque una buona idea per la sicurezza e, bene, non vorresti creare una shell insicura, vero? Molto probabilmente questo interrompe PHP, ma ci sono comunque altre lingue tra cui scegliere.
Se avete intenzione di fare il programma in script di shell, non è consentito di utilizzare eval
, source
o .
(come in una funzione, non un carattere). A mio avviso, la sfida sarebbe troppo facile.
Abuso di regole intelligenti consentito. Ci sono molte cose che ho esplicitamente vietato, ma sono quasi sicuro che ti sia ancora permesso di fare cose di cui non ho pensato. A volte sono sorpreso di come le persone interpretano le mie regole. Inoltre, ricorda che puoi fare qualsiasi cosa per tutto ciò che non ho menzionato. Ad esempio, se provo a usare le variabili, puoi cancellare il disco rigido (ma per favore non farlo).
Vince il codice più corto, poiché questo è codegolf.