Thử thách này có liên quan đến một số tính năng của ngôn ngữ MATL, như là một phần của sự kiện Ngôn ngữ của tháng 5 năm 2018 . Liên kết thách thức : Chức năng clipboard: dán .
Giới thiệu
MATL có một số bảng ghi , nơi bạn có thể lưu trữ các giá trị (bản sao) để được truy xuất sau (dán). Một số clipboard là tự động , có nghĩa là sao chép được tự động kích hoạt bởi các sự kiện nhất định. Thử thách này tập trung vào một trong các clipbards tự động, được gọi là clipboard bảng chức năng đầu vào , hoặc đơn giản là chức năng clipboard .
Bảng tạm này lưu trữ các đầu vào cho bốn cuộc gọi gần đây nhất tới các chức năng nhận đầu vào thông thường. Các hàm thông thường là loại hàm phổ biến nhất trong MATL. Nhập liệu có nghĩa là chức năng lấy ít nhất một đầu vào (các chức năng không lấy bất kỳ đầu vào nào không được xem xét bởi bảng tạm thời của chức năng).
Điều này được giải thích tốt nhất với các ví dụ sau, sử dụng hai hàm bình thường:
+
, xuất hiện hai số từ ngăn xếp và đẩy tổng của chúng.U
, hiện ra một số và đẩy hình vuông của nó.
Ví dụ 1 :
3 2 + 6 + 12 4 U + +
tạo ra kết quả 39
. Mã được diễn giải như sau:
- Số chữ như
3
hoặc12
được đẩy vào ngăn xếp - Các chức năng như
+
bật đầu vào của chúng và đẩy đầu ra của chúng lên ngăn xếp.
Các hàm gọi, theo thứ tự thời gian, là:
3 2 +
cho5
5 6 +
cho11
4 U
cho16
12 16 +
28
11 28 +
cho39
.
Bảng tạm có thể được xem như một danh sách gồm bốn danh sách. Mỗi danh sách bên trong chứa các đầu vào cho một cuộc gọi chức năng, với hầu hết các cuộc gọi gần đây đầu tiên . Trong mỗi danh sách bên trong, đầu vào theo thứ tự ban đầu của chúng .
Vì vậy, sau khi chạy mã, nội dung của bảng tạm là (theo ký hiệu Python):
[[11, 28], [12, 16], [4], [5, 6]]
Ví dụ 2 :
10 20 U 30 +
để lại số 10
và 430
trên ngăn xếp. Ngăn xếp được hiển thị từ dưới lên trên vào cuối chương trình.
Các cuộc gọi chức năng là
20 U
cho400
400 30 +
cho430
Vì chỉ có hai lệnh gọi hàm, một số danh sách bên trong xác định bảng tạm sẽ trống . Cũng lưu ý làm thế nào 10
không được sử dụng làm đầu vào cho bất kỳ chức năng.
Vì vậy, nội dung clipboard sau khi chạy mã là:
[[400, 30], [20], [], []]
Ví dụ 3 (không hợp lệ):
10 20 + +
được coi là không hợp lệ, vì đầu vào thứ hai +
bị thiếu (trong MATL, điều này sẽ ngầm kích hoạt đầu vào của người dùng).
Các thách thức
Dữ liệu vào : một chuỗi S có số bằng chữ +
và được U
phân cách bằng dấu cách.
Output : các nội dung của hàm vào clipboard sau khi đánh giá chuỗi S .
Làm rõ:
- Bạn có thể sử dụng bất kỳ hai ký hiệu nhất quán nào để thể hiện các chức năng đó, ngoài các chữ số. Ngoài ra, bạn có thể sử dụng bất kỳ biểu tượng nhất quán nào làm dấu phân cách, thay vì khoảng trắng.
- Chỉ có hai chức năng được chỉ định sẽ được xem xét.
- Chuỗi đầu vào sẽ chứa ít nhất một số bằng chữ và ít nhất một hàm.
- Tất cả các số sẽ là số nguyên dương, có thể có nhiều hơn một chữ số.
- Có thể một số chữ không được sử dụng bởi bất kỳ chức năng nào, như trong ví dụ 2.
- Đầu vào được đảm bảo là mã hợp lệ, không yêu cầu số bổ sung. Vì vậy, một chuỗi như trong ví dụ 3 sẽ không bao giờ xảy ra.
- Trailing danh sách bên trong trống trong đầu ra có thể được thông báo. Vì vậy, kết quả trong ví dụ 2 có thể là
[[400, 30], [20]]
- Bất kỳ định dạng đầu ra hợp lý, rõ ràng đều được chấp nhận. Ví dụ: một chuỗi có dấu phẩy là dấu phân cách bên trong và dấu chấm phẩy là dấu phân cách bên ngoài :
400,30;20;;
.
Quy tắc bổ sung:
Đầu vào và đầu ra có thể được thực hiện bằng bất kỳ phương tiện hợp lý .
Các chương trình hoặc chức năng được cho phép, trong bất kỳ ngôn ngữ lập trình . Sơ hở tiêu chuẩn bị cấm .
Mã ngắn nhất trong byte thắng.
Các trường hợp thử nghiệm
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
M
?
M
. Tôi sẽ thực hiện nó trong thử thách dán miếng dán
[[28, 11], [16, 12], [4], [6, 5]]
đầu ra hợp lệ cho ví dụ đầu tiên?