Buat hampir quine

12

Saya ingin membodohi seorang teman dengan memberinya quine yang hampir berhasil, tetapi menjadi ceroboh dan ceroboh.

Buat program yang, ketika dijalankan, akan menampilkan program, tetapi satu karakter mati. Salah satu karakter dapat ditambahkan, dihapus atau keduanya (satu karakter berubah). Namun hanya satu karakter.

Skor Anda akan (length of your program) / floor(sqrt(number of times the program almost quines))(Di mana / 0tak terhingga)

number of times the program almost quinesadalah berapa kali program Anda berjalan sementara hanya mengubah satu karakter di stdout. Program Anda mungkin tidak menerima input. Mungkin juga tidak mencetak program yang sudah dicetak.

Anda juga mungkin tidak menambahkan karakter yang sebelumnya Anda tambahkan sebelumnya, atau menghapus karakter dari indeks yang sama. Misalnya, jika Anda telah menambahkan 1sebelumnya, dan Anda menambahkan 1lagi, di situlah number of times the program almost quinesberhenti. Jika Anda menghapus karakter pertama, Anda tidak dapat menghapus karakter pertama lagi. Jika Anda mengubah karakter ketiga menjadi 2, Anda tidak dapat menambah 2atau menghapus karakter ketiga.

mbomb007
sumber
apa quine?
Abr001am
@ Agawa001 Quine adalah program yang mencetak sendiri.

Jawaban:

7

CJam, 0,000884

{_,6/[{64md}6*](124+\+'�f++`"1$~"}""1$~

Di sini, menunjukkan karakter yang tidak patut dicetak dengan titik kode 128. Cobalah online.

Ide

Pendekatan ini menambahkan semua karakter UCS (spesifikasi asli) dengan titik kode antara U + 4000000 dan U + 7FFFFFFF ke string awalnya kosong yang mengikuti blok kode.

Kami memilih UTF-8 , yang mengkodekan setiap karakter ini menggunakan string 6 byte sebagai berikut:

1111110u₂     10vvvvvv₂     10wwwwww₂     10xxxxxx₂     10yyyyyy₂     10zzzzzz₂

252 + u       128 + vvvvvv  128 + wwwwww  128 + xxxxxx  128 + yyyyyy  128 + zzzzzz

Dengan demikian, kita dapat menyandikan karakter ke - n dalam kisaran ini dengan menghitung 6 digit paling tidak signifikan di basis 64 dan menambahkan 252 ke yang paling signifikan dan 128 ke yang tersisa.

Mencetak gol

Ada 2 ** 31 = 2,147,483,6486 byte UTF-8 karakter dan panjang kode asli adalah 39, jadi angkanya adalah 39 / floor(2 ** 15.5) = 39 / 46340 = 0.0008416055243849806.

Bagaimana itu bekerja

{                                }""    e# Push the code block and an empty string.
                                    1$~ e# Execute a copy of the code block.
 _,                                     e# Push the length of the string.
   6/                                   e# Divide by 6 to get the number of chars.
      {64md}6*                          e# Perform modular division six times.
     [        ]                         e# Collect the results in an array.
               (124+\+                  e# Add 124 to the first element.
                      '�f+              e# Add 128 to all and cast each to Char.
                          +             e# Concatenate the strings.
                           `            e# Push a string representation.
                            "1$~"       e# Push '1$~' to complete the quine.
Dennis
sumber
Saya menerima ini karena skor pertama Anda (lebih rendah). Saya akan mengizinkannya.
6

CJam, 46 byte, 65504 tambahkan, 65505 del, Skor 0,127424

{`-2<_0c#)!{'#/~(_)\+\+S+]'#*}*W<"
}_~"e# 
}_~

Uji di sini.

Bentuk dasar adalah quine CJam umum standar. Untuk "hampir quine", ada komentar e#di akhir blok quine, di mana saya dapat dengan bebas menambahkan karakter tanpa mempengaruhi kode. Perhatikan bahwa komentar pada awalnya berisi satu ruang.

Program ini terus menambahkan karakter ke bagian depan komentar, mulai dari !dan kemudian berjalan dalam urutan nilai ASCII. Kode karakter CJam membungkus sekitar setelah 16 jadi pada beberapa titik, ini akan menambahkan byte nol. Setelah itu terjadi, program mulai menghapus byte dari akhir komentar (sehingga posisi karakter yang dihapus selalu berbeda) hingga komentar kosong.

Martin Ender
sumber
5

CJam, 19 byte, 65536 tambahkan, 0 del, Skor 0,074219

"a"{\)_)++`\"_~"}_~

Lebih sederhana lebih baik.

jimmy23013
sumber