Xe đạp tự động quine


11

Làm một quine nhưng với một twist.

Tuyên bố

Các quine in mã của nó nhưng đặt ký tự đầu tiên của nó ở cuối.
(Bạn có thể làm ngược lại nhưng bao gồm ghi chú đó trong câu trả lời của bạn)
Đầu ra sau đó phải là một chương trình cũng là một giải pháp.

Ví dụ: Giả sử mã của bạn là foobar, chạy nó sẽ trả về oobarfđó sẽ là một chương trình hợp lệ khác.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

Quy tắc

  • Mã của bạn không được là đầu ra của một số thế hệ mã của người khác rõ ràng là ăn cắp
  • Mã của bạn phải dài hơn 2 ký tự (vì vậy mã ngắn không có gì thú vị)
  • Mã của bạn phải chứa ít nhất hai ký tự khác nhau (ví dụ: +++không hợp lệ)

Chấm điểm

Như một thử thách , mã ngắn nhất sẽ thắng.



3
@DomHastings Bạn đã có nhiều tháng để đăng nó.
mbomb007

2
@ IQuick143 Tôi nghĩ> 2 ký tự là một yêu cầu tốt cho lý do bạn đã nêu
dylnan

5
Điều này sẽ được tính là một "quine xoay"? ; p
Kevin Cruijssen

3
@ mbomb007 Tìm một ngôn ngữ có thể thực hiện được là một phần của thử thách
IQuick 143

Câu trả lời:


19

Befunge-98 (PyFunge) , 2600 byte

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ấ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ừ @qchấ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 pcá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 glệ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 yxá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 :
Một hình ảnh đáng giá 1000 từ họ nói.  Sau đó, họ đã tạo ra Piet.

Đâ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 0mà 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: Mã

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);

Tôi thực sự mong chờ lời giải thích đầy đủ, nhưng đây có vẻ như là một thành tích và chắc chắn xứng đáng với tiền thưởng!
Nathaniel

1
@Nathaniel Có đầy đủ Giải thích hy vọng bạn thích nó! : D
IQuick 143

1
Đó là một phần về việc đối phó với pcác đối số không chính xác là thiên tài.
leo3065

@ leo3065 Cảm ơn :)
IQuick 143

@lQuick quả thực là tôi làm!
Nathaniel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.