Đôi khi khi viết mã brainfuck, bạn cảm thấy cần phải làm cho nó dài hơn mức cần thiết để khuyến khích gỡ lỗi. Bạn có thể làm điều đó bằng cách chỉ cần ngồi một chỗ ><
trong đó, nhưng có gì vui? Bạn sẽ cần một cái gì đó dài hơn và ít NOPey để gây nhầm lẫn cho bất kỳ ai đọc mã của bạn.
Giới thiệu nhanh về Brainfuck
Brainfuck là một ngôn ngữ lập trình bí truyền được tạo ra vào năm 1993 bởi Urban Müller, và đáng chú ý vì sự tối giản cực độ của nó. (Wikipedia)
Brainfuck là một ngôn ngữ dựa trên tám lệnh : +-><,.[]
. Mã được chạy trên một cái gì đó giống như một máy Turing: một băng vô hạn mà các giá trị có thể được thay đổi. Trong thử thách này, chúng tôi sẽ tập trung vào bốn người đầu tiên:
+ increment the value at the pointer
- decrement the value at the pointer
> move the pointer right
< move the pointer left
NOP Brainfuck
NOP brainfuck là một chuỗi các nhân vật brainfuck, khi được thực hiện từ bất kỳ trạng thái nào, dẫn đến không có thay đổi trong trạng thái. Chúng bao gồm bốn nhân vật được đề cập ở trên.
Các thách thức
Thách thức là viết một chương trình hoặc chức năng mà khi được thực thi sẽ tạo ra một NOP ngẫu nhiên có độ dài nhất định.
Đầu vào
Bạn sẽ nhận được như là một số nguyên chẵn không âm n
. (NOP là không thể cho lẻ n
.)
Đầu ra
Bạn sẽ tạo ra một NOP brainfuck ngẫu nhiên về độ dài n
.
Quy tắc
- Định nghĩa của NOP: khi đầu ra của chương trình được chèn tại bất kỳ điểm nào trong chương trình brainfuck, hành vi của chương trình đã nói không được thay đổi theo bất kỳ cách nào. Nói cách khác, nó không được thay đổi trạng thái của trình thông dịch.
- Lưu ý rằng ví dụ
+>-<
là không chính xác, vì nó thay đổi giá trị của hai ô mà không thay đổi chúng trở lại. Vui lòng kiểm tra giải pháp của bạn cho những điều này trước khi đăng. - Cũng lưu ý rằng đó
+>-<->+<
là một NOP không thể giảm xuống chỉ bằng cách xóa><
<>
+-
-+
. Vì vậy, bạn không thể sử dụng một thuật toán chỉ chèn những cái này vào nhau.
- Lưu ý rằng ví dụ
- Mỗi NOP hợp lệ của độ dài
n
phải có cơ hội khác không xuất hiện trong đầu ra. Việc phân phối không phải là thống nhất, mặc dù. - Trình thông dịch brainfuck trong câu hỏi có một băng gấp đôi vô hạn của các tế bào chính xác tùy ý. Nghĩa là, bạn có thể đi vô tận cả hai hướng và tăng / giảm từng ô một cách vô thời hạn.
- Chương trình phải hoàn thành trong vòng 1 phút cho
n
= 100 trên máy của tôi, vì vậy không tạo ra tất cả các NOP có thể và chọn một NOP. - Nếu được cung cấp đầu vào không hợp lệ (không nguyên, âm, lẻ, v.v.), bạn có thể làm bất cứ điều gì bạn muốn, bao gồm cả sự cố.
Chấm điểm
Đây là môn đánh gôn , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.
Ví dụ
Dưới đây là tất cả các kết quả đầu ra hợp lệ cho n
= 4:
++-- +-+- +--+ --++ -+-+ -++-
>><< ><>< ><<> <<>> <><> <>><
><+- ><-+ <>+- <>-+
>+-< >-+< <+-> <-+>
+><- -><+ +<>- -<>+
+->< -+>< +-<> -+<>
Dưới đây là một vài kết quả đầu ra có thể cho n
= 20:
+>>->+<->-<<<->>++<<
>+>-<+<->+-<>->+<-<+
+--+-++--++-+--+-++-
>>>>>>>>>+-<<<<<<<<<
.
có tác dụng phụ, ,
ghi đè lên một giá trị không thể phục hồi mà không sử dụng []
. Nhưng []
cuối cùng sẽ thiết lập một giá trị bằng không. Điều này cũng ghi đè lên một giá trị (vì vậy chúng tôi cần một giá trị khác []
để khôi phục nó) trừ khi chúng tôi có thể chắc chắn rằng ô bị ảnh hưởng là 0 để bắt đầu. Tuy nhiên, chúng tôi phải tìm kiếm một tế bào như vậy với một cái gì đó tương tự [>]
, và không thể quay trở lại vị trí mà chúng tôi đến một cách đáng tin cậy.
+-<>
như bạn yêu cầu:a