Radiasi melunakkan quine

38

Sederhana: Buat quine yang tepat di mana jika Anda menghapus karakter apa pun, itu masih quine.

Perbedaan antara ini dan quina yang dikeraskan dengan radiasi adalah bahwa jika program Anda AB, dalam quine yang dikeraskan dengan radiasi Aakan menghasilkan AB, tetapi di sini, Aakan menghasilkan A.

Golf kode, semua aturan standar, celah standar berlaku, tidak ada kecurangan.

CalculatorFeline
sumber
Apakah program kosong valid?
Loovjo
4
@Loovjo No.
Martin Ender
3
@feersum Tantangannya menyatakan "Buat quine di mana ...", jadi ABseharusnya output AB.
Mego
1
@Mego Saya tahu dikatakan demikian, tetapi spesifikasinya tidak selalu tepat, dan tidak ditunjukkan dalam contoh.
feersum
4
@feersum "Make a quine" berarti membuat quine. "Perbedaan antara ini dan quina yang dikeraskan dengan radiasi ..." berarti bahwa satu - satunya perbedaan adalah bahwa program dengan satu byte yang dihapus menghasilkan quine, bukan program yang mencetak sumber program asli. Tidak ada ambiguitas di sini.
Mego

Jawaban:

22

> <> (Ikan), 145 107 byte

Jawaban ini menggunakan> <> instruksi lompatan untuk memperbaiki masalah.

!<0078*+00~..>0[!."r43a*+8a+&{ee+00&1-:&(?.~~ol?!;4b*0.0f<>0['r3d*159*+&}7a*00&1-:&(?.~~ol?!;68a*+0.0+*a58 

Quine ini sebenarnya mengandung dua generator quine yang berbeda. Dimulai dengan beberapa logika jumping dan secara default menggunakan quine kiri. Jika sebuah karakter dihapus dari logika lompat atau dari quine kiri, program melompat ke quine kanan.

Anda bisa mencobanya di sini

Penjelasan

Kode dapat dibedah menjadi beberapa bagian:

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 

Penjelasan dari berbagai bagian:

  • A: Melompat ke kanan C. Jika ada karakter yang dihapus dari A, ini melompat ke kiri D atau kanan E, memicu quine kedua. Jika ada karakter yang dihapus dari B atau C, kode tersebut digeser 1 karakter ke kiri, menyebabkan ini melompat ke kiri D.
  • C: Kode ini melompat ke kiri B.
  • B: Quine # 1
  • D: Quine # 2
  • E: Melompat ke kiri D

Penjelasan quine (dengan # 1 sebagai contoh):

Setelah penunjuk instruksi mencapai salah satu quine, Anda yakin quine itu benar-benar utuh.

>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.
Thijs ter Haar
sumber
Mohon penjelasannya.
CalculatorFeline
Mengulangi di atas.
CalculatorFeline
1
Apakah ini cukup jelas?
Thijs ter Haar
36

Bahasa , 4,54 × 10 761 byte

Ini memiliki jumlah karakter nol ini:

453997365974271498471447945720930600149036031871190716908688344432973027776681259141680552038829875159204621651993092104775733418288411812715164994750890484868305218411129600012389568016974351721147925344946382782884546247102886167837964612372737300786173159265347137401863281368021545169383664534228503236761742285358985343373496184959796553930661837467682191561275123057706776367104142995491262443697167483190110516522677811931124842961701222425076750211774387637740969301686178545299089832300154448308384461700726890067468872402133010536518468336342175124002115991866466700174974019423711837589532744970385003356612639263433822126850314801275940879069069974437167102618471264140597777702065896715558989678487253830854848740247786166790545462769498303055791292

Melihat bagaimana kriteria dalam tantangan ini bertentangan dengan definisi "quine yang tepat", saya pikir varian Unary akan menang.

Kode Brainfuck yang diperluas:

>>+++>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>+++++>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<].
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]
.

Jika satu karakter dihapus dari program Bahasa, karakter terakhir menjadi <, yang menyebabkan program untuk mencetak tepat satu karakter kurang.

jimmy23013
sumber
1
Bagaimana Anda bisa menemukan titik tetap itu? (Atau alternatifnya, bagaimana cara kerja kode Brainfuck?)
Martin Ender
1
@ MartinBüttner Loop besar pertama menyalin dan menyandikan data dalam bentuk "> +++ ..." (dan membalikkannya). Loop besar lainnya mencetak data sebagai bilangan bulat di unary. Ini tidak rumit tapi panjang hanya karena Brainfuck.
jimmy23013
Oh iya, jadi itu seperti Brainfuck quine biasa, tetapi dengan fungsi decoding yang berbeda?
Martin Ender
@ MartinBüttner Agak. Tetapi setengah dari program adalah "fungsi decoding".
jimmy23013
Tampaknya Anda dapat menggunakan teknik serupa untuk menyusun jawaban skor sewenang-wenang untuk codegolf.stackexchange.com/q/57257/8478 (meskipun bagaimana tepatnya itu bekerja tergantung pada jawaban atas komentar terakhir saya).
Martin Ender