> <> (Cá), 145 107 byte
Câu trả lời này sử dụng hướng dẫn nhảy của> <> để khắc phục sự cố.
!<0078*+00~..>0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.0f<>0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.0+*a58
Quine này thực sự có chứa hai máy phát điện quine khác nhau. Nó bắt đầu với một số logic nhảy và theo mặc định sử dụng quine trái. Nếu một ký tự được loại bỏ khỏi logic nhảy hoặc từ quine trái, chương trình sẽ nhảy sang quine phải.
Bạn có thể thử nó ở đây
Giải trình
Mã này có thể được chia thành một vài phần:
A: !<0078*+00~..>0[!.
B: >0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.
C: .0f<
D: >0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.
E: .0+*a58
Giải thích về các phần khác nhau:
- A: Nhảy sang bên phải của C. Nếu bất kỳ ký tự nào bị xóa khỏi A, thì nó nhảy sang bên trái của D hoặc bên phải của E, kích hoạt quine thứ hai. Nếu bất kỳ ký tự nào bị xóa khỏi B hoặc C, mã được dịch chuyển 1 ký tự sang trái, khiến mã này nhảy sang trái của D.
- C: Mã này nhảy sang trái của B.
- B: Câu hỏi số 1
- D: Quine # 2
- E: Nhảy sang trái D
Giải thích về quine (với ví dụ # 1):
Khi con trỏ lệnh đạt đến một trong các quine, bạn chắc chắn rằng quine đó hoàn toàn nguyên vẹn.
>0[!. //Fix the instruction pointer's direction and empty the stack (The '!.' is a leftover from codepart A)
"r43a*+ //Start reading all of the code and add the '"' character to the stack
8a+& //Because the quine started reading at the 19th character instead of the first, the stack has to move 18 characters.
//This part saves the number 18 to the register.
{ee+00&1-:&(?. //Move the stack one to the left, decrease the stack by 1. If the stack is not empty yet, jump back to the start of this section.
~~ //Clean the temporary variables from the stack. It should now contain the whole quine.
ol?!;4b*0. //Print the first character from the stack. As long as the stack isn't empty, jump back to the start of this section.