Este site teve muitos problemas ao implementar vários idiomas na tag intérprete . No entanto, praticamente todos eles eram linguagens esotéricas que ninguém usa. Hora de criar um intérprete para uma linguagem prática que a maioria dos usuários provavelmente já conhece. Sim, é um shell script, caso você tenha problemas para ler o título (não que você tenha). (sim, eu intencionalmente fiz esse desafio, pois estou entediado com linguagens como GolfScript e Befunge ganhando tudo, então coloquei um desafio em que uma linguagem de programação mais prática tem maiores chances de ganhar)
No entanto, o script de shell é uma linguagem relativamente grande, então não vou pedir para você implementá-lo. Em vez disso, vou criar um pequeno subconjunto da funcionalidade de script de shell.
O subconjunto que eu decidi é o seguinte subconjunto:
- Executando programas (os programas conterão apenas letras, no entanto, mesmo que aspas simples sejam permitidas)
- Argumentos do programa
- Aspas simples (aceitando qualquer caractere ASCII imprimível, incluindo espaço em branco, excluindo as aspas simples)
- Sequências sem aspas (permitindo letras, números e traços ASCII)
- Tubos
- Instruções vazias
- Várias instruções separadas por nova linha
- À direita / à esquerda / vários espaços
Nesta tarefa, você deve ler a entrada do STDIN e executar todos os comandos solicitados. Você pode assumir com segurança o sistema operacional compatível com POSIX, para que não haja necessidade de portabilidade com o Windows ou algo assim. Você pode assumir com segurança que os programas que não são canalizados para outros programas não serão lidos no STDIN. Você pode assumir com segurança que os comandos existirão. Você pode assumir com segurança que nada mais será usado. Se alguma suposição segura for quebrada, você poderá fazer qualquer coisa. Você pode assumir com segurança no máximo 15 argumentos e linhas abaixo de 512 caracteres (se você precisar de alocação de memória explícita, ou algo assim - eu realmente darei pequenas chances de ganhar para C, mesmo que elas ainda sejam pequenas). Você não precisa limpar os descritores de arquivo.
Você tem permissão para executar programas a qualquer momento - mesmo após receber a linha completa ou após o término do STDIN. Escolha qualquer abordagem que você deseja.
Caixa de teste simples que permite testar seu shell (observe o espaço em branco após o terceiro 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/'
O programa acima deve gerar o seguinte resultado:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Você não tem permissão para executar o próprio shell, a menos que não tenha argumentos para o comando (essa exceção foi feita para Perl, que executa o comando no shell quando coloca apenas um argumento system, mas sinta-se à vontade para abusar dessa exceção por outros idiomas também, se você puder fazer isso de uma maneira que salve caracteres), ou o comando executado será o próprio shell. Este é provavelmente o maior problema nesse desafio, pois muitas linguagens possuem systemfunções que executam o shell. Em vez disso, use APIs de linguagem que chamam programas diretamente, como o subprocessmódulo em Python. Esta é uma boa idéia para a segurança de qualquer maneira e, bem, você não gostaria de criar um shell inseguro, gostaria? Isso provavelmente interrompe o PHP, mas existem outras linguagens para escolher de qualquer maneira.
Se você estiver indo para fazer o seu programa em shell script, você não estão autorizados a utilizar eval, sourceou .(como em uma função, não um personagem). Tornaria o desafio muito fácil na minha opinião.
Abuso inteligente de regras permitido. Há muitas coisas que eu não permiti explicitamente, mas tenho quase certeza de que você ainda pode fazer coisas que ainda não fiz. Às vezes, fico surpreso com a maneira como as pessoas interpretam minhas regras. Além disso, lembre-se de que você pode fazer qualquer coisa por qualquer coisa que eu não tenha mencionado. Por exemplo, se eu tentar usar variáveis, você pode limpar o disco rígido (mas não o faça).
O código mais curto vence, pois é um codegolf.