Mirip dengan teka-teki quine lainnya (lebih khusus, yang ini ), tulis sebuah program yang menghasilkan sumber untuk dirinya sendiri.
Inilah sentuhan baru: Kode yang dihasilkan TIDAK harus identik dengan sumbernya. Alih-alih, itu harus menghasilkan program yang berbeda yang akan membuat yang pertama.
Tantangan terkait dengan di atas mencapai itu dengan melompat di antara dua bahasa. Saya pikir ini akan dilakukan hanya dalam satu bahasa , tetapi dua (atau lebih) versi sumber harus berbeda secara signifikan (lihat aturan di bawah). Dengan batasan ini, jawaban karakter tunggal akan dianulir, sehingga membutuhkan sedikit pemikiran lagi untuk dimasukkan ke dalam pengiriman akhir.
ATURAN
- Kode Anda harus diproduksi hanya dalam satu bahasa. (Banyak pengiriman, satu untuk setiap bahasa dapat diterima.)
- Versi kode Anda yang berbeda harus berbeda secara sintaksis. Dengan kata lain, jika Anda menggambar pohon sintaksis abstrak untuk kode Anda, harus ada setidaknya satu node yang berbeda.
- Memasok AST tidak akan diperlukan, tetapi jika Anda merasa cenderung untuk memberikan satu untuk setiap program Anda, itu akan membantu dalam menilai.
- Anda dapat menghasilkan sebanyak mungkin iterasi yang Anda inginkan, asalkan semuanya tetap berbeda secara sintaksis. (Lebih banyak akan membantu skor Anda, lihat di bawah.)
SKOR
Skor akhir Anda akan menjadi panjang rata-rata dari semua program Anda, dibagi dengan jumlah program.
Contoh 1:
A (sumber untuk B) = 50 karakter
B (sumber untuk A) = 75 karakter
Skor Akhir = 31,25
Contoh 2:
A (sumber untuk B) = 50 karakter
B (sumber untuk C) = 75 karakter
C (sumber untuk A) = 100 karakter
Skor Akhir = 25
Jawaban:
Python, 0 (batas (68 + 3 n ) / (16 n ))
Jika dua pohon sintaksis abstrak berbeda jika mereka memiliki konstanta yang berbeda,
ada 16 n program dengan panjang maksimal 68 + 3n, memberikan skor asimptotik 0.
Jika Anda menginginkan program dengan struktur variabel, kami dapat mengimplementasikan adder biner pada n bit. Di sini, ada 2 n program dengan panjang O ( n 2 ). Masuk dalam siklus karena dijatuhkan carry bit.
sumber
pass
akan berubah ket=n(t)
dan kembali, dalam semua kombinasi 2 ^ n.Perl, skor 110,25
Saya harus akui, saya tidak begitu pandai bergaul. Saya 100% yakin bahwa ada ruang untuk perbaikan. Solusi didasarkan dari prinsip yang sama dari solusi Elemen di bawah ini.
Program pertama adalah 264 karakter.
Program kedua adalah 177 karakter.
Saya sedang mengerjakan AST untuk entri ini (dan entri Elemen).
Elemen , skor 47.25
Program pertama adalah 105 karakter.
Program kedua adalah 84 karakter.
Saya yakin ada banyak ruang untuk perbaikan.
Dalam program pertama ada satu string (di mana setiap karakter lolos, meskipun banyak redundansi) diikuti oleh bagian yang dapat dieksekusi A dan B. Bagian A melakukan beberapa hal: mencetak string dan keluar dari setiap karakter, mencetak setengah terakhir dari string (yang merupakan sumber untuk bagian B), dan kemudian mencegah bagian B yang mengikutinya melakukan apa pun.
Program kedua adalah string yang sama diikuti oleh bagian B. Bagian B didasarkan dari quine sederhana; itu mencetak string yang didahului oleh versi yang lolos darinya. Ini berarti mencetak string, dan kedua bagian A dan B.
sumber
[]{}
, perintah apa pun dapat ditempatkan di mana saja di seluruh program tanpa menyebabkan kesalahan sintaksis. Sempurna.VBA: (251 + 216) / 2/2 = 116,75
251
216
Ini dijalankan di MSAccess untuk memanfaatkan
Module
objek. Modul ini dinamai"Q"
untuk golf. Perbedaan dalam sintaksis berasal dari yangIf ... Then
hilang dari versi yang lebih pendek.sumber
vbCrLF
kevbCr
C ++, skor 0,734194
Kode sumber berikut mencetak meta quine pesanan 999 ke konsol (penjelasan di bawah):
Satu-satunya baris yang berubah adalah baris pertama. Nilai
X
akan menjadi 1000, 999, 998, ..., 3, 2 dan kemudian akan mulai lagi. Namun, untuk mendapatkan pohon sintaks yang berbeda setiap kali,X
diwakili dalam hal faktorisasi prima, di mana setiap prime ditulis sebagai jumlah1
s. AST berbeda, karena faktorisasi bilangan bulat utama berbeda untuk setiap nilai.Program akan mencetak sendiri, kecuali bahwa baris pertama diubah dan garis miring terbalik, putus baris dan lekukan yang ada di dalamnya
Q(...)
akan dihapus.Program berikut menghitung skor jawaban saya:
Itu dicetak 0,734194 ke konsol. Jelas, 1000 dapat diganti dengan bilangan bulat yang lebih besar dan skor akan mendekati 0 sebagai batasnya. Bukti matematis yang melibatkan fungsi Riemann Zeta agak berbelit-belit. Saya meninggalkannya sebagai latihan untuk pembaca. ;)
sumber
JavaScript,
84.56461Dua program, keduanya panjang
169128122.Sebelum saya bermain golf, untuk kesenangan menonton Anda:
Mengembalikan program baru dan menampilkan bagian saat ini!
Saya mungkin bisa membuatnya lebih pendek tanpa fungsi regex, tapi ... Saya tidak mau.sumber
J - (24 + 30) / 2/2 = 13,5 poin
Perhatikan bahwa string di J tidak di-escape, tapi kutipan-lolos à la Pascal:
'I can''t breathe!'
.Program 1 memiliki AST
noun verb hook noun
dan program 2 memiliki ASTnoun
. Program 2 adalah versi yang dikutip dari program 1, yang hanya akan mengembalikan program 1 saat dijalankan, jadi metode ini tidak dapat diperpanjang hingga tiga salinan dengan mudah: PProgram 1 beroperasi dengan mengambil salinan bagian kode dari sumber, dengan kutipan ditambahkan di bagian depan, dan menambahkan lima kutipan tersebut di akhir (
(,5#{.)
). Kemudian, secara siklis mengambil 30 karakter dari string 16-karakter ini, yang menghasilkan Program 2 sebagai hasilnya.sumber