Lipogram “quine”

26

Tugas

  1. Ambil satu karakter Unicode sebagai input.
  2. Keluarkan program dalam bahasa yang sama yang juga mematuhi spesifikasi ini, tetapi tidak mengandung karakter input.
  3. Jika program Anda dijalankan dengan masukan yang , dan kemudian program output kemudian jalankan dengan masukan b , maka program itu output yang diperbolehkan mengandung karakter seorang . Namun, b masih tidak diperbolehkan tampil di program ini. Dengan kata lain, hanya input ke inkarnasi terbaru dari program yang dilarang muncul.
  4. Apa pun judulnya, aturan standar quine berlaku.

Kemenangan program terpendek. Panjang program minimal harus satu byte.

Contoh

Jika programnya adalah ABCD. (# adalah komentar)

> slangi "ABCD"
A
EBCD          # "FBCD" "JGGJ" "UGDKJGDJK" are all OK
> slangi "EBCD"
C
ABGD          # "EBGD" "UIHDAIUTD" are all OK
> slangi "ABGD"
B
AFCD
> slangi "AFCD"
Z
ABCD

Di mana slangiada juru bahasa untuk bahasa fiktif.

Akangka
sumber
Tidakkah ini sedikit menantang bahasa yang tidak bertele-tele? Beberapa menggunakan kata untuk nama instruksi, sehingga akan sangat sulit dan / atau tidak mungkin untuk menghindari karakter seperti e.
LegionMammal978
2
Sangat sulit untuk menulis dalam bahasa Inggris tanpa e, tetapi Gadsby melakukannya.
Akangka
Saya mengasumsikan tidak ada fungsi quine?
Mama Fun Roll

Jawaban:

24

CJam, 45 41 38 35 byte

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}_~

Jika karakter input bukan karakter "$&)+,/:?HOX\_`el{}, program ini mencetak versi dirinya yang sedikit dimodifikasi berikut ini. Cobalah online!

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}OX$_?

Jika tidak, program akan mencetak versi modifikasi berikut yang dikaburkan. Cobalah online!

''r'4'a'j'6'q'Q'4'='q'~'8'''Z';'='r''A'4'n'Z'w'>''4'L';''8''a'j'6'q'Q]If-~

Perhatikan bahwa beberapa karakter tidak dapat dicetak. Cobalah online!

Bagaimana itu bekerja

{`"OX$_?"+_l&{{H)+`}/"\He,}":)}&}_~

{                               }    Define a code block.
                                 _~  Push a copy and execute the copy.
 `                                   Push a string representation of the block.
  "OX$_?"                            Push that string.
         +_                          Concatenate and push a copy.
           l&                        Intersect the copy with the input.
             {                }&     If the intersection is non-empty:
              {    }/                  For each character of the concat. strings:
               H)                        Push 18.
                 +                       Add it to the character.
                  `                      Inspect; turn 'c into "'c".
                     "He,}"            Push that string.
                           :)          Increment each char. Pushes "If-~"

Dalam program keluaran pertama yang mungkin, kami menghindari penggunaan ~untuk dapat menggunakannya di program lain. Oleh karena itu, alih-alih _~, program yang dimodifikasi berakhir dengan OX$_?, yang berfungsi sebagai berikut.

O        Push "" (falsy).
 X$      Push a copy of the code block.
   _     Push yet another copy.
    ?    Ternary if; since "" is falsy, execute the second copy.

Akhirnya, dalam program output yang tersisa,

''r'4'a'j'6'q'Q'4'='q'~'8'''Z';'='r''A'4'n'Z'w'>''4'L';''8''a'j'6'q'Q]

membungkus semua karakter tersebut dalam sebuah array, oleh karena itu mendorong string berikut.

"'4aj6qQ4=q~8'Z;=r'104nZw>'4L;'8'j6qQ"

If- kurangi 18 dari setiap kode karakter, dorong string

"{`\"OX$_?\"+_l&{{H)+`}/\"\He,}\":)}&}OX$_?"

yang ~dievaluasi.

Dennis
sumber
18

JavaScript (ES6), 356 340 327 308 303 263

Sekarang gunakan Function`...```untuk program kedua:

f=(b=y=>[for(x of`f=${f};f()`)x.charCodeAt().toString(y).toUpperCase()])=>alert([`eval('\\${b(8).join('\\')}')`,`eval(String.fromCharCode(${b(10).map(x=>'+9-8'.repeat(x))}))`,'Function`\\x'+b(16).join('\\x')+'```'][1+"0e1v2a3l4(5'6'7)\\".indexOf(prompt())%2]);f()

Fungsi ini mengemas dirinya menjadi satu dari tiga program yang mungkin:

  1. Program pertama memanggil evalstring literal yang berisi kode fungsi dengan setiap karakter lolos sebagai nilai oktal.

    eval ('\ 146 \ 165 ...')
  2. Program kedua mengarahkan browser ke javascript:URL yang berisi kode fungsi dengan setiap URL karakter disandikan. Ini adalah satu-satunya cara saya bisa berpikir untuk mengevaluasi kode tanpa menggunakan tanda kurung. Itu juga lolos dari huruf dalam 'eval'.

    window ["\ x6coc \ x61tion"] ["hr \ x65f"] = "j \ x61 \ x76 \ x61script:% 66% 75 ..."
  3. Program terakhir sangat panjang. Itu membangun kode fungsi dengan menambahkan satu ( +9-8) pada suatu waktu untuk mendapatkan setiap kode karakter. Ini untuk menghindari penggunaan digit oktal.

    eval (String.fromCharCode (+ 9-8 + 9-8 + 9-8 + 9-8 ...))

Program yang benar diindeks dengan mencari string yang dibangun dengan hati-hati untuk karakter input:

[`program_1`,`program_3`,`program_2`][1+"0e1v2a3l4(5'6'7)\\".indexOf(prompt())%2]

Ini adalah versi yang belum teruji, belum teruji. Mungkin tidak berfungsi karena baris baru di sumber.

function f() {
    // convert source code of current function to bytes
    var bytes = Array.map(f + 'f()', x => x.charCodeAt());

    // pack this function's code in one of three possible programs,
    // depending on the input
    var input = prompt();

    // PROGRAM 1 - only contains characters: eval(')01234567\
    // eval('\146\165...')
    var source = "eval('\\" + bytes.map(x => x.toString(8)).join('\\') + "')";

    // PROGRAM 2 - doesn't contain characters: eval('')
    // window["\x6coc\x61tion"]["hr\x65f"]="j\x61\x76\x61script:%66%75..."
    // -> window["location"]["href"] = "javascript:..."
    if ("eval(')".includes(input)) {
        source = 'window["\\x6coc\\x61tion"]["hr\\x65f"]="j\\x61\\x76\\x61script:%';
        source += bytes.map(x => x.toString(16).toUpperCase()).join('%') + '"';
    }

    // PROGRAM 3 - doesn't contain characters: 01234567\
    // eval(String.fromCharCode(+9-8+9-8+9-8+9-8...))
    if ('01234567\\'.includes(input)) {
        source = "eval(String.fromCharCode(";
        source += bytes.map(x => '+9-8'.repeat(x)).join(',') + '))';
    }

    console.log(source);
}
f()
grc
sumber
function f(){ ... };f()bisa (f=_=>{ ... })(). Berikut ini sebuah contoh: es6fiddle.net/iiz2nq0l
Ismael Miguel
Bahkan lebih baik: f=(_=prompt())=>...;f(). Input disimpan sebagai _.
Mama Fun Roll
Juga, tidak perlu untuk console.log, output fungsi baik-baik saja.
Mama Fun Roll
Tidak akan menggunakan Function`[code]`.call``;pekerjaan untuk Anda, alih-alih mengarahkan? Berikut adalah contoh yang berfungsi: es6fiddle.net/ij023v49 (Lihat? Tidak evil()! Erm, maksud saya eval()...)
Ismael Miguel
Nah, Anda telah belajar sesuatu hari ini. Perlu diketahui bahwa thisobjek tersebut adalah string template kosong. Itu bergantung pada Functionkonstruktor, yang memungkinkan Anda untuk membuat fungsi, alih-alih berjalan eval(). Fungsi akan memiliki kode yang terkandung dalam parameter pertama. Saya sering menggunakannya untuk mendapatkan yang asli window, menggunakan Function('return this')(). Karena Anda tidak dapat menggunakan (), saya telah menyalahgunakan sedikit kebaikan ES6 untuk mencoba meludahi fungsi yang dapat digunakan tanpa Anda jalankan (). Untuk itu, Anda memerlukan .call()metode, yang memanggil fungsi dengan thisobjek baru .
Ismael Miguel