На цьому веб-сайті було багато проблем, пов’язаних із впровадженням різних мов у тег перекладача . Однак практично всі вони були езотеричними мовами, якими ніхто не користується. Час зробити перекладача на практичній мові, який, мабуть, знають більшість користувачів тут. Так, це сценарій оболонки, якщо у вас виникли проблеми з читанням назви (не те, що у вас є). (так, я навмисно зробив це завдання, оскільки мені нудно таких мов, як GolfScript і Befunge, що все перемагають, тому я ставлю певну проблему, коли більш практична мова програмування має більші шанси на перемогу)
Однак скрипт оболонки є досить великою мовою, тому я не прошу вас реалізувати його. Натомість я зроблю невелику підмножину функцій скрипту оболонки.
Підмножина, на яку я визначився, є наступною підмножиною:
- Виконання програм (програми будуть містити лише літери, однак, навіть якщо дозволені окремі лапки)
- Програмні аргументи
- Одиночні лапки (приймаючи будь-який символ, що можна надрукувати ASCII, включаючи пробіли, за винятком однієї лапки)
- Рядки без котирування (дозволяючи ASCII букви, цифри та тире)
- Труби
- Порожні заяви
- Кілька висловлювань, розділених новим рядком
- Трейлінг / ведучий / кілька пробілів
У цьому завданні ви повинні прочитати вхід зі STDIN та виконати кожну запитувану команду. Ви можете сміливо припускати сумісну з POSIX операційну систему, тому немає потреби в портативності з Windows, або нічого подібного. Ви можете сміливо припускати, що програми, які не передаються в інші програми, не будуть читатись із STDIN. Можна сміливо припускати, що команди існуватимуть. Можна сміливо припускати, що більше нічого не буде використано. Якщо якесь безпечне припущення порушено, ви можете зробити все, що завгодно. Ви можете сміливо припускати щонайбільше 15 аргументів і рядки нижче 512 символів (якщо вам потрібно чітке виділення пам'яті, або щось таке - я дійсно збираюся дати невеликі шанси виграти C, навіть якщо вони ще невеликі). Не потрібно чистити дескриптори файлів.
Ви можете виконувати програми в будь-який момент - навіть після отримання повної лінії або після закінчення STDIN. Виберіть будь-який підхід.
Простий тестовий зразок, який дозволяє протестувати оболонку (зверніть увагу на пробільний пробіл після третьої команди):
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/'
Програма, наведена вище, повинна виводити наступний результат:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Вам заборонено виконувати сам оболонку, якщо ви не маєте жодних аргументів для команди (цей виняток був зроблений для Perl, який виконує команду в оболонці при введенні просто аргументу system
, але сміливо зловживайте цим винятком для інших мови, якщо ви можете це зробити таким чином, щоб зберегти символи), або команда, яку ви запускаєте, - сама оболонка. Це, мабуть, найбільша проблема в цьому виклику, оскільки багато мов мають system
функції, які виконують оболонку. Замість цього використовуйте API мови, які викликають програми безпосередньо, як-от subprocess
модуль в Python. Це все-таки хороша ідея для безпеки, і ну, ви б не хотіли створювати незахищену оболонку, хочете? Це, швидше за все, зупиняє PHP, але все-таки можна вибрати інші мови.
Якщо ви збираєтеся зробити вашу програму сценарію оболонки, ви не можете використовувати eval
, source
або .
(як у функції, а не символ). На мій погляд, це зробить виклик занадто простим.
Дозволено зловмисне використання правил. Є багато речей, які я прямо забороняю, але я майже впевнений, що вам все одно дозволяють робити те, чого я ще не хотів. Іноді я дивуюсь тому, як люди трактують мої правила. Також пам’ятайте, що ви можете робити все, що б я не говорив. Наприклад, якщо я спробую використовувати змінні, ви можете стерти жорсткий диск (але, будь ласка, не варто).
Виграє найкоротший код, оскільки це кодовий гольф.