Thử thách này đã được đăng trong khuôn khổ thử thách LotM tháng 4 năm 2018 , cũng như cho sinh nhật lần thứ 2 của Brain-flak
Tôi đã suy nghĩ về cách hiệu quả nhất để mã hóa các chương trình não bộ sẽ là gì. Điều rõ ràng phải làm, vì chỉ có 8 ký tự hợp lệ, là ánh xạ mỗi ký tự thành một chuỗi 3 bit. Điều này chắc chắn rất hiệu quả, nhưng nó vẫn rất dư thừa. Có một số tính năng của mã não bộ mà chúng ta có thể tận dụng để rút ngắn mã hóa.
Các nilad, tất cả được biểu thị bằng 2 dấu ngoặc khớp, thực sự hoạt động như một đơn vị thông tin chứ không phải 2. Nếu chúng ta thay thế mỗi dấu ngoặc đơn bằng một ký tự byte, điều này sẽ làm cho mã hóa nhỏ hơn nhiều mà không mất dữ liệu.
Điều này là ít rõ ràng, nhưng các byte đóng của các đơn vị cũng là dư thừa. Hãy nghĩ rằng bạn có thể đoán những gì các
'?'
nhân vật đại diện trong đoạn trích sau đây?{(({}?<>?<>?
Nếu chúng ta giả sử đầu vào là mã flak não hợp lệ, thì chỉ có một tùy chọn cho mỗi dấu hỏi đó. Điều này có nghĩa là chúng ta có thể sử dụng rõ ràng một ký tự đơn nguyên gần gũi để thể hiện mọi dấu ngoặc đóng. Điều này có thêm lợi ích của việc giữ cho bộ ký tự nhỏ, sẽ giúp ích rất nhiều nếu chúng ta muốn sử dụng mã hóa huffman. Vì nhân vật đơn nguyên gần như rất có thể là nhân vật phổ biến nhất bởi lề rộng, nên nó có thể được biểu thị bằng một bit duy nhất, rất hiệu quả.
Hai thủ thuật này sẽ cho phép chúng tôi nén mã não thông qua thuật toán sau:
Thay thế mọi khung đóng của một đơn nguyên bằng
|
. Hay nói cách khác, thay thế mọi khung đóng không có trước trận đấu mở của nó bằng một thanh. Vì thế...(({})<(()()())>{})
sẽ trở thành
(({}|<(()()()||{}|
Thay thế mọi nilad bằng khung đóng của nó. Do đó, dấu ngoặc phù hợp không có gì trong đó sử dụng ánh xạ sau:
() --> ) {} --> } [] --> ] <> --> >
Bây giờ ví dụ cuối cùng của chúng tôi trở thành:
((}|<()))||}|
Xóa các
|
ký tự dấu . Bởi vì chúng ta biết rằng tổng số thanh phải bằng tổng số({[<
ký tự, nếu thiếu thanh ở cuối, chúng ta có thể suy ra chúng. Vì vậy, một ví dụ như:({({})({}[()])})
sẽ trở thành
({(}|(}[)
Thách thức của bạn cho ngày hôm nay là đảo ngược quá trình này.
Đưa ra một chuỗi flak não nén chỉ chứa các ký tự (){}[]<>|
, mở rộng nó thành mã flak não ban đầu. Bạn có thể giả định rằng đầu vào sẽ luôn mở rộng thành flak não hợp lệ. Điều này có nghĩa là không có tiền tố của đầu vào sẽ chứa nhiều |
hơn các ({[<
ký tự.
Đầu vào sẽ không chứa các |
ký tự dấu . Chúng phải được suy ra từ bối cảnh.
Như thường lệ, bạn có thể gửi một chương trình đầy đủ hoặc một chức năng và các định dạng đầu vào / đầu ra được cho phép. Và vì đây là môn đánh gôn , mã của bạn sẽ được tính theo độ dài của mã nguồn tính bằng byte, điểm càng nhỏ thì càng tốt.
Các trường hợp thử nghiệm
Dưới đây là một số trường hợp thử nghiệm. Nếu bạn muốn nhiều hơn nữa, bạn có thể tạo các trường hợp thử nghiệm của riêng mình với tập lệnh python này và Brain-Flak Wiki , nơi mà phần lớn các trường hợp thử nghiệm này đến từ.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}