ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Hãy thử trực tuyến!
Điều này làm cho đây là một địa ngục.
Cách thức hoạt động:
Chương trình này là một loạt các câu lệnh put lắp ráp một Chương trình B xung quanh chính nó, sau đó in một nửa byte nguồn được dịch chuyển hai lần.
Chương trình này thực sự là 2 bản sao của chương trình 1300 byte, vì vậy điều này đảm bảo rằng toàn bộ chương trình 1300 byte luôn được chạy toàn bộ.
Tốt hơn giải thích:
Mỗi Befunge-98 Quine cần phải chứa các ký hiệu một ví dụ @
hay q
và ,
Vấn đề : Không ai trong số những biểu tượng là một tốt bắt đầu từ điểm Đặc biệt kể từ @
và q
chấm dứt chương trình ngay lập tức.
Giải pháp : Loại bỏ các ký tự đó trong mã nguồn
Vấn đề : Làm thế nào?
Giải pháp : Sử dụng p
các lệnh (đặt) để sửa đổi mã nguồn để bao gồm các ký tự được yêu cầu sẽ in chứa mã nguồn được dịch chuyển theo một byte và không sử dụng g
lệnh gian lận.
Vấn đề : (thở dài khi nào những kết thúc này)
Lệnh put sẽ bật 3 giá trị n x y
xác định ký tự, tọa độ x, tọa độ y, tuy nhiên khi khởi tạo các giá trị này bị chia làm đôi, nó có thể viết các ký tự xấu trong mã nguồn ban đầu khiến nó trở nên vô dụng để khai thác.
Giải pháp : (lần cuối tôi hứa)
Sử dụng 2 bản sao của mã nguồn, cái sau là "chính xác", điều này vô tình khắc phục một vấn đề khác đó là câu lệnh put (lệnh p + bộ khởi tạo không đổi) được chia làm đôi không được thực thi, điều này được khắc phục bằng cách có 2 bản sao của mỗi câu lệnh. Điều cuối cùng cần làm là làm thế nào để chúng ta tạo ra toàn bộ mã nguồn trong một nửa?
Trả lời :
Đây là bằng chứng trực quan về lý do tại sao hai bản sao của chuỗi byte dịch chuyển == Hai bản sao của chuỗi dịch chuyển byte. Điều đó có nghĩa là chúng ta có thể lấy một nửa mã, dịch chuyển byte, sau đó in hai lần (HOẶC lấy một nửa mã, dịch chuyển byte, in, lặp lại [Đó là những gì thực sự xảy ra])
Cách thức triển khai : Giả sử 0123456789abcdef là nguồn
Mã giả Befunge:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS có nghĩa là Print Stack (không phải là một hướng dẫn thực sự). Chúng tôi đẩy một nửa mã nguồn ngược lại vào ngăn xếp bằng cách sử dụng ""
sau đó chúng tôi in ngăn xếp và sau đó chúng tôi tìm nạp ( '
lệnh) ký tự đầu tiên 0
mà chúng tôi di chuyển trước '
và in nó cuối cùng gây ra dịch chuyển byte, sau đó chúng tôi lặp lại chu kỳ một lần nữa để in bản sao thứ hai. Một kỹ thuật để xử lý là các ký hiệu bên trong nguồn, điều này có thể gây rắc rối nếu chúng ta viết nó trong khi thực thi mã nguồn, tôi đã phá vỡ điều này bằng cách thêm nhiều câu lệnh đặt bên ngoài.
Điều này làm cho mã trông giống như thế này:
Giải thích :
Nổi bật màu xanh lá cây: Mã chăm sóc thêm các ký tự vào nguồn
Chữ màu xám (xin lỗi về khả năng hiển thị kém): Mã được thêm bằng mã xanh
Red Highlight: Mã di chuyển ký tự đầu tiên của nửa sau của mã nguồn vào vùng Xanh lam .
Blue Highlight: Xem Red Highlight
Orange Highlight: Code đảm bảo chúng tôi chấm dứt sau khi chúng tôi viết các bản sao được dịch chuyển 2 byte bằng cách đặt @
lệnh (chấm dứt) vào Vùng màu vàng.
Mũi tên hy vọng sẽ làm cho nó rõ ràng hơn về cách dòng mã đi.
Ở đây có phần khó khăn cuối cùng:
Nơi nào trẻ sơ sinh mã nguồn đến từ đâu?
Câu trả lời ngắn: C # Magic
Câu trả lời dài: 100+ đoạn mã Befunge được làm bằng tay được biên dịch bởi mã C #. Tôi đã viết thủ công khoảng 100 bộ khởi tạo không đổi (một đoạn mã befunge đẩy một số nhất định để xếp chồng) bằng tay và sau đó sử dụng chương trình C # tùy chỉnh để biên dịch nó thành đầu ra Befunge 1300 byte, sau đó tôi sao chép hai lần và thực hiện lần cuối chương trình.
Bạn còn ở đây không Rất cảm ơn bạn đã đọc! (hoặc ít nhất là cuộn đến cuối)
Tôi hy vọng những câu chuyện dở khóc dở cười của tôi là vui vẻ và không gây phiền nhiễu.
Lưu ý: Không có câu lệnh put nào trong mã này tạo ra lệnh ag sẽ gian lận.
EDIT: Tôi đã xác minh mã bằng mã Javascript sau trong TIO bằng các công cụ dành cho nhà phát triển
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);