52 48 byte
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Hãy thử trực tuyến!
Lái thử
Giải trình
Ở Klein, IP bắt đầu ở góc trên bên trái, bên phải. Bước đầu tiên tôi muốn chương trình của mình thực hiện là gửi IP ra khỏi đầu chương trình để xác định bit thứ nhất và thứ ba. IP sẽ nhập lại chương trình như sau tùy thuộc vào cấu trúc liên kết:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Tôi quyết định rằng chương trình của tôi sẽ ghi lại bit thứ ba của cấu trúc liên kết trước bit thứ hai nhưng trao đổi chúng (sử dụng $
) trước khi kết thúc. Cuối cùng, tôi đã thêm mã để đẩy các bit đầu tiên và thứ ba của mỗi cấu trúc liên kết tại các điểm nhập của IP được mô tả ở trên.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Tiếp theo tôi tập trung vào các cấu trúc liên kết với 1
hoặc 2
là bit đầu tiên của chúng. Tôi quyết định kết hợp lại chúng và gửi chúng ở phía không kết nối với phía bắc để tôi có thể xác định bit thứ hai của chúng.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Thuận tiện điều này tập hợp lại các cấu trúc liên kết bằng bit thứ hai của chúng để tôi có thể đẩy nó lên ngăn xếp.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Sau đó tôi chỉ cần trao đổi bit thứ hai và thứ ba và chấm dứt chương trình.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Bây giờ các cấu trúc liên kết có 1
hoặc 2
như bit đầu tiên của chúng hoạt động, tôi có thể tập trung vào việc tạo các cấu trúc liên kết với 0
đầu ra chính xác. Bước đầu tiên là kết hợp lại chúng để có thể tách chúng thành hai nhóm dựa trên bit thứ hai của chúng.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Đầu tiên tôi tập trung vào các cấu trúc liên kết với 1
bit thứ hai của chúng. Chúng đưa ra một thách thức bởi vì đối với chúng, IP nằm trên một dòng đã được sử dụng bởi các cấu trúc liên kết với 2
tư cách là bit đầu tiên của chúng. Vì sẽ rất khó để phù hợp với nhiều hơn một lệnh trên dòng đó (một lệnh có thể được nhảy bằng cách sử dụng !
hướng dẫn) và tôi đã hết dung lượng toàn bộ, tôi quyết định chuyển hướng IP ra khỏi dòng đó và sử dụng lại một 1
lệnh hiện có để đẩy bit thứ hai.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Bây giờ tất cả những gì còn lại để làm cho các cấu trúc liên kết với 1
bit thứ hai của chúng là sửa thứ tự của bit thứ hai và thứ ba và chấm dứt.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Cuối cùng vẫn là cấu trúc liên kết với 0
bit thứ hai của chúng. Không còn nhiều không gian trong chương trình với không gian chưa sử dụng lớn nhất nằm ở dòng trên cùng nên tôi đã chuyển hướng IP cho các cấu trúc liên kết với 0
bit thứ hai.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Tôi vẫn cần phải đẩy 0
bit thứ hai và sửa thứ tự của bit thứ hai và thứ ba cũng như chấm dứt chương trình. May mắn thay, tôi đã có thể sử dụng lại một $
hướng dẫn hiện có để các hướng dẫn 0
và @
có thể phù hợp với các không gian còn lại.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Cuối cùng, các nops có thể được tước từ cuối dòng để có được chương trình cuối cùng.