Ce site a eu beaucoup de problèmes lors de l'implémentation de différentes langues dans la balise interprète . Cependant, presque tous étaient des langues ésotériques que personne n'utilisait. Il est temps de faire un interprète pour une langue pratique que la plupart des utilisateurs ici connaissent probablement déjà. Oui, c'est un script shell, au cas où vous auriez des problèmes pour lire le titre (pas que vous ayez). (oui, j'ai intentionnellement fait ce défi, car je m'ennuie de langages comme GolfScript et Befunge qui gagnent tout, donc j'ai mis un défi où un langage de programmation plus pratique a plus de chances de gagner)
Cependant, le script shell est un langage relativement gros, donc je ne vous demanderai pas de l'implémenter. Au lieu de cela, je vais créer un petit sous-ensemble de fonctionnalités de script shell.
Le sous-ensemble sur lequel j'ai décidé est le sous-ensemble suivant:
- Exécution de programmes (les programmes ne contiendront cependant que des lettres, même si les guillemets simples sont autorisés)
- Arguments du programme
- Citations simples (acceptant tout caractère ASCII imprimable, y compris les espaces, à l'exclusion des guillemets simples)
- Chaînes sans guillemets (autorisant les lettres, chiffres et tirets ASCII)
- Pipes
- Déclarations vides
- Plusieurs instructions séparées par une nouvelle ligne
- Trailing / leader / espaces multiples
Dans cette tâche, vous devez lire l'entrée de STDIN et exécuter chaque commande demandée. Vous pouvez supposer en toute sécurité un système d'exploitation compatible POSIX, il n'y a donc pas besoin de portabilité avec Windows, ou quelque chose comme ça. Vous pouvez supposer en toute sécurité que les programmes qui ne sont pas redirigés vers d'autres programmes ne liront pas depuis STDIN. Vous pouvez supposer en toute sécurité que les commandes existeront. Vous pouvez sans risque supposer que rien d'autre ne sera utilisé. Si une hypothèse sûre est brisée, vous pouvez tout faire. Vous pouvez supposer en toute sécurité au plus 15 arguments et des lignes inférieures à 512 caractères (si vous avez besoin d'une allocation de mémoire explicite, ou quelque chose - je vais vraiment donner de petites chances de gagner pour C, même si elles sont encore petites). Vous n'avez pas à nettoyer les descripteurs de fichiers.
Vous êtes autorisé à exécuter des programmes à tout moment - même après avoir reçu la ligne complète ou après la fin de STDIN. Choisissez n'importe quelle approche que vous souhaitez.
Cas de test simple qui vous permet de tester votre shell (notez les espaces blancs après la troisième commande):
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/'
Le programme ci-dessus devrait produire le résultat suivant:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Vous n'êtes pas autorisé à exécuter le shell lui-même, à moins que vous n'ayez pas d'arguments pour la commande (cette exception a été faite pour Perl, qui exécute la commande dans le shell lorsque vous placez juste un argument system
, mais n'hésitez pas à abuser de cette exception pour d'autres langues aussi, si vous pouvez le faire d'une manière qui enregistre les caractères), ou la commande que vous exécutez est le shell lui-même. C'est probablement le plus gros problème de ce défi, car de nombreux langages ont des system
fonctions qui exécutent le shell. Utilisez plutôt des API de langage qui appellent directement des programmes, comme le subprocess
module en Python. C'est une bonne idée pour la sécurité de toute façon, et bien, vous ne voudriez pas créer un shell non sécurisé, le voudriez-vous? Cela arrête très probablement PHP, mais il existe quand même d'autres langages.
Si vous allez faire de votre programme dans le script shell, vous n'êtes pas autorisé à utiliser eval
, source
ou .
(comme dans une fonction, pas un caractère). Cela rendrait le défi trop facile à mon avis.
Abus de règle intelligent autorisé. Il y a beaucoup de choses que j'ai explicitement interdites, mais je suis presque sûr que vous êtes toujours autorisé à faire des choses auxquelles je n'ai pas pensé. Parfois, je suis surpris de la façon dont les gens interprètent mes règles. N'oubliez pas non plus que vous pouvez faire n'importe quoi pour tout ce que je n'ai pas mentionné. Par exemple, si j'essaie d'utiliser des variables, vous pouvez effacer le disque dur (mais ne le faites pas).
Le code le plus court gagne, car il s'agit de codegolf.