Trang web này có rất nhiều vấn đề liên quan đến việc triển khai các ngôn ngữ khác nhau trong thẻ thông dịch viên . Tuy nhiên, thực tế tất cả chúng là những ngôn ngữ bí truyền mà không ai sử dụng. Đã đến lúc làm phiên dịch cho một ngôn ngữ thực tế mà hầu hết người dùng ở đây có lẽ đã biết. Vâng, đó là kịch bản shell, trong trường hợp bạn gặp vấn đề khi đọc tiêu đề (không phải là bạn có). .
Tuy nhiên, tập lệnh shell là một ngôn ngữ tương đối lớn, vì vậy tôi sẽ không yêu cầu bạn thực hiện nó. Thay vào đó, tôi sẽ tạo một tập hợp nhỏ chức năng shell script.
Tập hợp con tôi quyết định là tập hợp con sau:
- Thực hiện các chương trình (các chương trình sẽ chỉ chứa các chữ cái, tuy nhiên, ngay cả khi dấu ngoặc đơn được cho phép)
- Đối số chương trình
- Dấu ngoặc đơn (chấp nhận bất kỳ ký tự ASCII có thể in nào, bao gồm cả khoảng trắng, không bao gồm dấu ngoặc đơn)
- Chuỗi không được trích dẫn (cho phép các chữ cái, số và dấu gạch ngang ASCII)
- Ống
- Báo cáo trống
- Nhiều câu lệnh được phân tách bằng dòng mới
- Trailing / hàng đầu / nhiều không gian
Trong tác vụ này, bạn phải đọc đầu vào từ STDIN và chạy mọi lệnh được yêu cầu. Bạn có thể giả định một cách an toàn hệ điều hành tương thích POSIX, do đó không cần tính di động với Windows, hoặc bất cứ điều gì tương tự. Bạn có thể giả định một cách an toàn rằng các chương trình không được chuyển sang các chương trình khác sẽ không được đọc từ STDIN. Bạn có thể an toàn cho rằng các lệnh sẽ tồn tại. Bạn có thể cho rằng không có gì khác sẽ được sử dụng. Nếu một số giả định an toàn bị phá vỡ, bạn có thể làm bất cứ điều gì. Bạn có thể giả định một cách an toàn tối đa 15 đối số và các dòng dưới 512 ký tự (nếu bạn cần phân bổ bộ nhớ rõ ràng hoặc một cái gì đó - tôi thực sự sẽ mang lại cơ hội chiến thắng nhỏ cho C, ngay cả khi chúng vẫn còn nhỏ). Bạn không phải dọn dẹp các mô tả tập tin.
Bạn được phép thực hiện các chương trình tại bất kỳ thời điểm nào - ngay cả sau khi nhận được dòng đầy đủ hoặc sau khi STDIN kết thúc. Chọn bất kỳ phương pháp nào bạn muốn.
Testcase đơn giản cho phép bạn kiểm tra shell của mình (lưu ý khoảng trắng tra cứu sau lệnh thứ ba):
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/'
Chương trình trên sẽ cho kết quả như sau:
hello world
499602D2
Hello, world!
helo
y
y
y
\\
foo BAR zap
Bạn không được phép tự thực thi shell, trừ khi bạn không có bất kỳ đối số nào cho lệnh (ngoại lệ này được tạo cho Perl, chạy lệnh trong shell khi đặt đối số vào system
, nhưng hãy thoải mái lạm dụng ngoại lệ này cho ngoại lệ khác ngôn ngữ cũng vậy, nếu bạn có thể làm điều đó theo cách lưu các ký tự) hoặc lệnh bạn chạy là chính nó. Đây có lẽ là vấn đề lớn nhất trong thử thách này, vì nhiều ngôn ngữ có system
chức năng thực thi shell. Thay vào đó, hãy sử dụng API ngôn ngữ gọi các chương trình trực tiếp, như subprocess
mô-đun trong Python. Dù sao đây cũng là một ý tưởng tốt cho bảo mật, và tốt, bạn sẽ không muốn tạo một lớp vỏ không an toàn, bạn có muốn không? Điều này rất có thể dừng PHP, nhưng vẫn có những ngôn ngữ khác để chọn.
Nếu bạn đang đi để làm cho chương trình của bạn trong shell script, bạn không được phép sử dụng eval
, source
hoặc .
(như trong, một chức năng, không phải là một nhân vật). Nó sẽ làm cho thách thức quá dễ dàng theo ý kiến của tôi.
Lạm dụng quy tắc thông minh cho phép. Có rất nhiều điều tôi không được phép rõ ràng, nhưng tôi gần như chắc chắn rằng bạn vẫn được phép làm những việc mà tôi chưa từng làm. Đôi khi tôi ngạc nhiên về cách mọi người giải thích các quy tắc của tôi. Ngoài ra, hãy nhớ rằng bạn có thể làm bất cứ điều gì cho bất cứ điều gì tôi chưa đề cập. Ví dụ: nếu tôi cố gắng sử dụng các biến, bạn có thể xóa đĩa cứng (nhưng vui lòng không).
Mã ngắn nhất sẽ thắng, vì đây là codegolf.