Quylthulg là một ngôn ngữ của Chris Pressey, cố gắng giải quyết vấn đề ký hiệu trung gian bằng cách sử dụng cái mà nó gọi là panfix :
Giống như postfix, panfix không yêu cầu triển khai các yếu tố phức tạp như dấu ngoặc đơn để ghi đè lên một ưu tiên toán tử mặc định. Đồng thời, panfix cho phép các thuật ngữ được chỉ định theo cùng thứ tự và cách thức như infix, một ký hiệu tự nhiên và trực quan không thể nghi ngờ đối với những người đã quen với nó.
Làm thế nào để bạn có được sự thuận tiện của ký hiệu infix cùng với sự không rõ ràng của tiền tố hoặc hậu tố? Sử dụng cả ba, tất nhiên!
=y=+*3*x*+1+=
Chính thức hơn, hãy +
là một toán tử, a
và b
là biểu thức. Sau đó (a+b)
là một biểu thức infix hợp lệ (được ngoặc đơn), biểu diễn panfix của biểu thức đó là +a+b+
, trong đó juxtap vị trí đại diện cho nối.
Mục tiêu của bạn là lấy một chuỗi panfix và chuyển đổi nó thành infix được ngoặc đơn đầy đủ:
(y=((3*x)+1))
Để đơn giản, chúng tôi sẽ thực hiện các thay đổi sau:
- Toán tử chỉ có thể bao gồm hai ký tự duy nhất (bạn có thể chọn bất kỳ ký tự nào, nhưng ở đây tôi sẽ sử dụng
*
và+
). - Chỉ có một nghĩa đen, bao gồm một ký tự riêng biệt khác (bạn có thể chọn bất kỳ, nhưng ở đây tôi sẽ sử dụng
_
). - Đầu vào sẽ là một biểu thức panfix được hình thành tốt.
Để phức tạp , chúng tôi sẽ thực hiện thay đổi sau:
- Các nhà khai thác có thể bao gồm bất kỳ số lượng ký tự tích cực , không chỉ một.
Điều này làm cho thử thách trở nên khó khăn hơn vì bạn không nhất thiết phải xác định cách một chuỗi các ký tự toán tử đã cho được phân vùng mà không cần nhìn vào phần còn lại của chuỗi.
Dưới đây là một triển khai tham chiếu cho thử thách, lịch sự của @ user202729.
Các trường hợp thử nghiệm
format: input -> output
+*+_*+_*+++_+*+_*+_*+++ -> ((_*+_)+(_+(_*+_)))
**++*+***++_+_++_+*++*+***_*++*+*****_**_*_*** -> ((((_+_)+_)*++*+***_)*(_*(_*_)))
***_**_***_* -> ((_**_)*_)
+_+_+ -> (_+_)
*+*+++**+***+++++_*+*+++**+***+++++_*+*+++**+***+++++ -> (_*+*+++**+***+++++_)
*++++*+*_*_*+*+++****+_++****+_++****++*+*+++_*+++ -> (((_*_)+*+(_++****+_))*+++_)
+**+_*+_*+*_*+*_*+*_+*_+**+ -> (((_*+_)*_)+(_*(_+*_)))
+**+++++_+++++_+++++*_*+*+_++++++_+++++_+++++++* -> (((_+++++_)*_)+*(_+(_+++++_)))
+*+*+_+*+_+*+*_*+*_*+*+_+*+_+*+*+ -> (((_+*+_)*_)+(_*(_+*+_)))
**_**_**_*_****_* -> ((_*(_*(_*_)))*_)
Tôi đã sử dụng chương trình này để tạo chuỗi infix cho thử thách này (chuyển đổi sang panfix là không đáng kể, nhưng đảo ngược thì không).
**_**_**_*_****_*
. Các câu trả lời tôi đã kiểm tra đều thất bại trong câu trả lời này.
(_ + _)
?