Sự miêu tả
Ngôn ngữ lập trình tưởng tượng (IPL) sử dụng ký hiệu đảo ngược tiếng Ba Lan. Nó có các lệnh sau:
- i - số đầu vào và đẩy nó vào ngăn xếp
- o - đỉnh đầu ra không phá hủy của ngăn xếp (số vẫn ở trên ngăn xếp)
- d - loại bỏ đỉnh ngăn xếp
- số nguyên - đẩy số này vào ngăn xếp
- + - * - bật hai số từ ngăn xếp, thực hiện thao tác tương ứng và đẩy lùi kết quả. Không có sự phân chia trong IPL.
IPL chỉ hoạt động với số nguyên và được sử dụng cho các phép tính đơn giản. Một chương trình IPL được viết trên một dòng và cách nhau bởi khoảng trắng. Chuỗi rỗng là một chương trình IPL hợp lệ.
Chương trình IPL:
i i + o
Nhập hai số, cộng chúng lại với nhau và đưa ra kết quả.
Số đầu vào và số nguyên có thể được đẩy lên ngăn xếp nằm trong phạm vi [-999, 999], tuy nhiên đầu ra có thể là bất kỳ. Nếu ngôn ngữ của bạn không hỗ trợ số lượng lớn thì cũng không sao.
Định dạng đầu vào / đầu ra
Bạn có thể chọn bất kỳ định dạng đầu vào / đầu ra miễn là rõ ràng để hiểu và đọc / ghi: chuỗi, danh sách, mã thông báo, v.v.
Bài tập
Bạn được cung cấp một số chương trình IPL, bạn cần tối ưu hóa nó (giảm độ dài):
i 12 + 3 + o d 2 3 + d
Sau khi tối ưu hóa sẽ trở thành
i 15 + o
Bạn không phải duy trì trạng thái ngăn xếp, nhưng số lượng đầu vào và đầu ra và thứ tự của chúng phải phù hợp với chương trình gốc và tối ưu hóa.
Vì vậy, chương trình IPL:
-40 i * 2 * o i + 3 1 + o i 2 *
Sau khi tối ưu hóa sẽ trở thành
i -80 * o i 4 o i
hoặc là
-80 i * o i 4 o i
(lưu ý rằng bạn phải lưu tất cả các đầu vào, ngay cả khi chúng không liên quan).
Không nên có mã hóa cứng cho các trường hợp thử nghiệm, mã phải hoạt động trên bất kỳ chương trình IPL tùy ý nào và tạo ra chương trình IPL ngắn nhất có thể đáp ứng các yêu cầu.
Chấm điểm
Mã điểm golf mặc định.
CẬP NHẬT: thay đổi cách tính điểm thành ghi điểm golf thuần, theo đề xuất của @Sanchises.
Các trường hợp thử nghiệm:
Đầu vào:
(empty string)
Sản lượng có thể:
(empty string)
Đầu vào:
i 4 * 2 + 3 * 6 - o
Sản lượng có thể:
i 12 * o
Đầu vào:
1 1 + o
Sản lượng có thể:
2 o
Đầu vào:
i 2 + 3 + o d 2 3 + d
Sản lượng có thể:
i 5 + o
Đầu vào:
-40 i * 2 * o i + 3 1 + o i 2 *
Sản lượng có thể:
-80 i * o i 4 o i
Đầu vào:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Sản lượng có thể:
i i i i i d d d d o
Đầu vào:
i i i 0 * * * o
Sản lượng có thể:
i i i 0 o
Đầu vào:
i i i 1 * * * o
Sản lượng có thể:
i i i * * o
Đầu vào:
i 222 + i 222 - + o
Sản lượng có thể:
i i + o
Đầu vào:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Sản lượng có thể:
i i i i i o 1 o
Đầu vào:
i 1 + 2 * 1 + o
Sản lượng có thể:
i 2 * 3 + o
Đầu vào:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Sản lượng có thể:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
i i d o
đếni o i
(đầu vào là theo thứ tự và đầu ra là theo thứ tự) hay nên bạn không đơn giản hóa nó? (bộ đầu vào và đầu ra phải theo thứ tự)