Trong ký hiệu tiền tố, toán tử xuất hiện trước các đối số, vì vậy bạn có thể tưởng tượng rằng toán tử gọi next()
được gọi đệ quy. Trong ký hiệu infix, toán tử đi giữa các đối số, vì vậy bạn có thể tưởng tượng nó đơn giản là một cây phân tích cú pháp. Trong ký hiệu postfix, toán tử xuất hiện sau các đối số, vì vậy bạn chỉ có thể tưởng tượng nó là dựa trên ngăn xếp.
Trong ký hiệu anyfix, toán tử có thể đi bất cứ đâu * . Nếu một toán tử xuất hiện và không có đủ đối số, thì toán tử sẽ đợi cho đến khi có đủ đối số. Đối với thử thách này, bạn phải thực hiện một trình đánh giá anyfix rất cơ bản. (Lưu ý rằng anyfix là ngôn ngữ giải trí mà tôi đã từ bỏ mà bạn có thể chơi xung quanh tại đây hoặc xem tại đây )
Bạn sẽ cần hỗ trợ các lệnh sau:
(Arity 1)
- bản sao
- tiêu cực
(Arity 2)
- thêm vào
- phép nhân
- bình đẳng: trả về
0
hoặc1
.
Bạn có thể chọn sử dụng bất kỳ năm ký hiệu không phải khoảng trắng nào cho các lệnh này. Đối với mục đích trình diễn, tôi sẽ sử dụng "
như là bản sao, ×
nhân và +
thêm.
Đối với chữ, bạn chỉ cần hỗ trợ các số nguyên không âm, nhưng trình thông dịch của bạn phải có thể chứa tất cả các số nguyên (trong phạm vi số nguyên (hợp lý) của ngôn ngữ của bạn).
Hãy xem một ví dụ : 10+5
. Bộ lưu trữ nên hoạt động như một ngăn xếp, không phải là một hàng đợi. Vì vậy, đầu tiên, ngăn xếp bắt đầu tại []
và danh sách toán tử xếp hàng bắt đầu tại []
. Sau đó, nghĩa đen 10
được đánh giá mà làm cho ngăn xếp [10]
. Tiếp theo, toán tử +
được ước tính, đòi hỏi hai đối số. Tuy nhiên, chỉ có một đối số trên ngăn xếp, vì vậy danh sách toán tử xếp hàng sẽ trở thành ['+']
. Sau đó, nghĩa đen 5
được đánh giá mà làm cho ngăn xếp [10, 5]
. Tại thời điểm này, toán tử '+'
có thể được đánh giá như vậy, tạo ngăn xếp [15]
và hàng đợi []
.
Kết quả cuối cùng sẽ được [15]
cho + 10 5
, 10 + 5
và 10 5 +
.
Chúng ta hãy xem một ví dụ khó khăn hơn : 10+"
. Các ngăn xếp và hàng đợi bắt đầu như []
và []
. 10
được đánh giá đầu tiên mà làm cho ngăn xếp [10]
. Tiếp theo, +
được đánh giá, không thay đổi ngăn xếp (vì không có đủ đối số) và tạo hàng đợi ['+']
. Sau đó, "
được đánh giá. Điều này có thể chạy ngay lập tức như vậy, làm cho ngăn xếp [10, 10]
. +
bây giờ có thể được đánh giá để ngăn xếp trở thành [20]
và hàng đợi []
. Kết quả cuối cùng là [20]
.
Điều gì về thứ tự của hoạt động?
Hãy xem xét ×+"10 10
. Ngăn xếp và hàng đợi bắt đầu cả hai như []
:
×
: Ngăn xếp không thay đổi và hàng đợi trở thành['×']
.+
: Ngăn xếp không thay đổi và hàng đợi trở thành['×', '+']
."
: Ngăn xếp không thay đổi và hàng đợi trở thành['×', '+', '"']
.10
: Ngăn xếp trở thành[10]
. Mặc dù×
phải là toán tử đầu tiên được đánh giá kể từ khi nó xuất hiện đầu tiên,"
có thể chạy ngay lập tức và không có toán tử nào trước khi có thể, vì vậy nó được đánh giá. Các ngăn xếp trở thành[10, 10]
và hàng đợi['×', '+']
.×
bây giờ có thể được đánh giá, làm cho ngăn xếp[100]
và hàng đợi['+']
.10
: Ngăn xếp trở thành[100, 10]
, cho phép+
được đánh giá. Các ngăn xếp trở thành[110]
và hàng đợi[]
.
Kết quả cuối cùng là [110]
.
Các lệnh được sử dụng trong các trình diễn này phù hợp với ngôn ngữ anyfix; tuy nhiên, ví dụ cuối cùng sẽ không hoạt động do lỗi trong trình thông dịch của tôi. (Tuyên bố miễn trừ trách nhiệm: Nội dung gửi của bạn sẽ không được sử dụng trong trình thông dịch anyfix)
Thử thách
Chọn một bộ gồm 5 ký tự không phải chữ số không có khoảng trắng và tạo trình thông dịch anyfix theo các thông số kỹ thuật ở trên. Chương trình của bạn có thể xuất ra mảng số ít hoặc giá trị được chứa trong đó; đảm bảo rằng ngăn xếp các giá trị sẽ chỉ chứa một giá trị duy nhất khi kết thúc thực thi và hàng đợi của các toán tử sẽ trống khi kết thúc thực thi.
Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng.
Các trường hợp thử nghiệm
Đối với các trường hợp kiểm tra này, trùng lặp là "
, âm là -
, cộng là +
, phép nhân là ×
và đẳng thức là =
.
Input -> Output
1+2×3 -> 9
1"+"+ -> 4
2"××" -> 16
3"×+" -> 18
3"+×" -> 36
123"= -> 1 ("= always gives 1)
1+2=3 -> 1
1"=2+ -> 3
1-2-+ -> -3
-1-2+ -> 3 (hehe, the `-1` becomes `+1` at the `-` rather than making the `2` a `-1`)
+×"10 10 -> 200 (after the 10 is duplicated (duplication is delayed), 10 + 10 is performed and then 20 * 10, giving 200)
Quy tắc
- Áp dụng sơ hở tiêu chuẩn
- Bạn có thể lấy trình thông dịch chính thức anyfix và đánh gôn nếu muốn. Hy vọng sẽ mất một cách khủng khiếp.
Đầu vào sẽ được cung cấp dưới dạng một chuỗi và đầu ra dưới dạng một mảng, một số nguyên duy nhất, ngoài biểu diễn chuỗi của một trong hai. Bạn có thể cho rằng đầu vào sẽ chỉ chứa khoảng trắng, chữ số và 5 ký tự bạn chọn.
* không thực sự
0
và 1
?
×+"10 10
trong các trường hợp thử nghiệm hoặc bất kỳ ví dụ nào khác là 1) sử dụng khoảng trắng và 2) trì hoãn việc sử dụng toán tử trùng lặp (hai điều mà tôi đã bỏ lỡ hoàn toàn).